diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml new file mode 100644 index 0000000000..0087da1376 --- /dev/null +++ b/.github/actionlint.yaml @@ -0,0 +1,5 @@ +# Allow actionlint to recognize the org's custom Warp runner label used by the +# blake3 non-regression workflow. +self-hosted-runner: + labels: + - warp-ubuntu-latest-x64-4x diff --git a/.github/actions/workspace-release/action.yml b/.github/actions/workspace-release/action.yml index cbb705ef59..bc9099d9b5 100644 --- a/.github/actions/workspace-release/action.yml +++ b/.github/actions/workspace-release/action.yml @@ -32,17 +32,13 @@ runs: fi - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable + shell: bash + run: | + rustup update --no-self-update stable + rustup default stable - - name: Cache cargo registry and git index - uses: actions/cache@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo- + - name: Cache Rust build artifacts + uses: WarpBuilds/rust-cache@9d0cc3090d9c87de74ea67617b246e978735b1a1 # v2.9.1 - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner @@ -50,19 +46,11 @@ runs: # Install cargo-msrv for MSRV checks - name: Install cargo-msrv shell: bash - env: - RUSTUP_TOOLCHAIN: "1.91" - run: cargo install cargo-msrv - - - name: Install Rust 1.91 for MSRV check - shell: bash - run: rustup toolchain install 1.91 + run: cargo install cargo-msrv --version 0.19.3 --locked # Keep your existing MSRV check - name: Check MSRV shell: bash - env: - RUSTUP_TOOLCHAIN: "1.91" run: | chmod +x scripts/check-msrv.sh ./scripts/check-msrv.sh diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index 264237103c..730255a650 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -16,7 +16,9 @@ jobs: name: Bench on ubuntu-latest runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Bench for all features run: | rustup +stable update --no-self-update diff --git a/.github/workflows/blake3-nonregression.yml b/.github/workflows/blake3-nonregression.yml new file mode 100644 index 0000000000..ca01c07c09 --- /dev/null +++ b/.github/workflows/blake3-nonregression.yml @@ -0,0 +1,373 @@ +name: blake3 1-to-1 non-regression + +on: + push: + branches: + - main + - next + workflow_dispatch: + inputs: + baseline_ref: + description: Commit or ref to use as the baseline. Defaults to the current ref's first parent. + required: false + type: string + current_ref: + description: Commit or ref to benchmark. Defaults to the workflow ref. + required: false + type: string + regression_threshold_pct: + description: Allowed slowdown before the workflow fails. + required: false + default: "5" + type: string + rayon_num_threads: + description: RAYON_NUM_THREADS value used for the prove command. + required: false + default: "8" + type: string + +concurrency: + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + benchmark: + name: Benchmark baseline vs current + runs-on: warp-ubuntu-latest-x64-4x + timeout-minutes: 180 + permissions: + contents: read + outputs: + summary: ${{ steps.summary.outputs.summary }} + regression: ${{ steps.compare.outputs.regression }} + status: ${{ steps.compare.outputs.status }} + baseline_sha: ${{ steps.compare.outputs.baseline_sha }} + current_sha: ${{ steps.compare.outputs.current_sha }} + program_delta_ms: ${{ steps.compare.outputs.program_delta_ms }} + program_delta_pct: ${{ steps.compare.outputs.program_delta_pct }} + steps: + - name: Check out repository + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Install Rust toolchain + shell: bash + run: | + set -euo pipefail + toolchain="$(sed -n 's/^channel = "\(.*\)"$/\1/p' rust-toolchain.toml)" + rustup toolchain install "${toolchain}" --profile minimal --target wasm32-unknown-unknown + + - name: Cache Rust dependencies + uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + + - name: Prepare benchmark directories + id: dirs + shell: bash + run: | + set -euo pipefail + run_root="${RUNNER_TEMP}/blake3-nonregression-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}" + artifact_dir="${run_root}/artifacts" + worktree_dir="${run_root}/worktrees" + mkdir -p "${artifact_dir}" "${worktree_dir}" + { + echo "run_root=${run_root}" + echo "artifact_dir=${artifact_dir}" + echo "worktree_dir=${worktree_dir}" + } >> "${GITHUB_OUTPUT}" + + - name: Resolve benchmark refs + id: refs + env: + EVENT_NAME: ${{ github.event_name }} + BEFORE_SHA: ${{ github.event.before }} + INPUT_BASELINE_REF: ${{ inputs.baseline_ref }} + INPUT_CURRENT_REF: ${{ inputs.current_ref }} + INPUT_THRESHOLD_PCT: ${{ inputs.regression_threshold_pct }} + INPUT_RAYON_THREADS: ${{ inputs.rayon_num_threads }} + shell: bash + run: | + set -euo pipefail + + resolve_commit() { + local ref="$1" + git rev-parse --verify --end-of-options "${ref}^{commit}" + } + + fetch_commit_if_needed() { + local ref="$1" + local fetch_log + if resolve_commit "${ref}" >/dev/null 2>&1; then + return 0 + fi + fetch_log="$(mktemp)" + if git fetch --no-tags --depth=1 origin "${ref}" >"${fetch_log}" 2>&1; then + rm -f "${fetch_log}" + resolve_commit "${ref}" >/dev/null 2>&1 + return $? + fi + if grep -Eqi "couldn't find remote ref|not our ref|unadvertised object|reference is not a tree|no such remote ref" "${fetch_log}"; then + rm -f "${fetch_log}" + return 2 + fi + cat "${fetch_log}" >&2 + rm -f "${fetch_log}" + return 1 + } + + if [[ "${EVENT_NAME}" == "push" ]]; then + current_ref="${GITHUB_SHA}" + baseline_ref="${BEFORE_SHA}" + threshold_pct="5" + rayon_threads="8" + else + baseline_ref="${INPUT_BASELINE_REF}" + current_ref="${INPUT_CURRENT_REF}" + threshold_pct="${INPUT_THRESHOLD_PCT}" + rayon_threads="${INPUT_RAYON_THREADS}" + fi + + if [[ -z "${current_ref}" ]]; then + current_ref="${GITHUB_SHA}" + fi + + if [[ -z "${threshold_pct}" ]]; then + threshold_pct="5" + fi + + if [[ -z "${rayon_threads}" ]]; then + rayon_threads="8" + fi + + if [[ ! "${threshold_pct}" =~ ^[0-9]+([.][0-9]+)?$ ]]; then + echo "regression_threshold_pct must be numeric" >&2 + exit 1 + fi + + if [[ ! "${rayon_threads}" =~ ^[0-9]+$ ]]; then + echo "rayon_num_threads must be an integer" >&2 + exit 1 + fi + + if [[ -z "${baseline_ref}" || "${baseline_ref}" == "0000000000000000000000000000000000000000" ]]; then + baseline_ref="${current_ref}^" + fi + + current_sha="$(resolve_commit "${current_ref}")" + fetch_status=0 + + if [[ "${EVENT_NAME}" == "push" && "${BEFORE_SHA}" != "0000000000000000000000000000000000000000" ]]; then + if fetch_commit_if_needed "${baseline_ref}"; then + fetch_status=0 + else + fetch_status=$? + fi + fi + + if [[ "${EVENT_NAME}" == "push" && "${BEFORE_SHA}" != "0000000000000000000000000000000000000000" && ${fetch_status} -eq 0 ]]; then + baseline_sha="$(resolve_commit "${baseline_ref}")" + elif [[ "${EVENT_NAME}" == "push" && "${BEFORE_SHA}" != "0000000000000000000000000000000000000000" && ${fetch_status} -eq 2 ]]; then + echo "push baseline ${baseline_ref} is no longer available; refusing to compare against current_sha^" >&2 + exit 1 + elif resolve_commit "${baseline_ref}" >/dev/null 2>&1; then + baseline_sha="$(resolve_commit "${baseline_ref}")" + elif [[ "${EVENT_NAME}" == "push" && "${BEFORE_SHA}" == "0000000000000000000000000000000000000000" ]]; then + baseline_ref="${current_sha}^" + baseline_sha="$(resolve_commit "${current_sha}^")" + elif [[ "${EVENT_NAME}" == "workflow_dispatch" && -z "${INPUT_BASELINE_REF}" ]]; then + baseline_ref="${current_sha}^" + baseline_sha="$(resolve_commit "${current_sha}^")" + else + echo "baseline_ref must resolve to a commit: ${baseline_ref}" >&2 + exit 1 + fi + + baseline_ref="${baseline_sha}" + + { + echo "baseline_ref=${baseline_ref}" + echo "current_ref=${current_ref}" + echo "baseline_sha=${baseline_sha}" + echo "current_sha=${current_sha}" + echo "threshold_pct=${threshold_pct}" + echo "rayon_threads=${rayon_threads}" + } >> "${GITHUB_OUTPUT}" + + - name: Create worktrees + env: + WORKTREE_DIR: ${{ steps.dirs.outputs.worktree_dir }} + BASELINE_SHA: ${{ steps.refs.outputs.baseline_sha }} + CURRENT_SHA: ${{ steps.refs.outputs.current_sha }} + shell: bash + run: | + set -euo pipefail + git worktree add --detach "${WORKTREE_DIR}/baseline" "${BASELINE_SHA}" + git worktree add --detach "${WORKTREE_DIR}/current" "${CURRENT_SHA}" + + - name: Run baseline benchmark + env: + GITHUB_WORKSPACE_PATH: ${{ github.workspace }} + WORKTREE_DIR: ${{ steps.dirs.outputs.worktree_dir }} + ARTIFACT_DIR: ${{ steps.dirs.outputs.artifact_dir }} + RAYON_THREADS: ${{ steps.refs.outputs.rayon_threads }} + BASELINE_SHA: ${{ steps.refs.outputs.baseline_sha }} + shell: bash + run: | + set -euo pipefail + python3 "${GITHUB_WORKSPACE_PATH}/scripts/blake3_nonregression.py" run \ + --repo-root "${WORKTREE_DIR}/baseline" \ + --output-dir "${ARTIFACT_DIR}/baseline" \ + --rayon-num-threads "${RAYON_THREADS}" \ + --git-ref "${BASELINE_SHA}" + + - name: Run current benchmark + env: + GITHUB_WORKSPACE_PATH: ${{ github.workspace }} + WORKTREE_DIR: ${{ steps.dirs.outputs.worktree_dir }} + ARTIFACT_DIR: ${{ steps.dirs.outputs.artifact_dir }} + RAYON_THREADS: ${{ steps.refs.outputs.rayon_threads }} + CURRENT_SHA: ${{ steps.refs.outputs.current_sha }} + shell: bash + run: | + set -euo pipefail + python3 "${GITHUB_WORKSPACE_PATH}/scripts/blake3_nonregression.py" run \ + --repo-root "${WORKTREE_DIR}/current" \ + --output-dir "${ARTIFACT_DIR}/current" \ + --rayon-num-threads "${RAYON_THREADS}" \ + --git-ref "${CURRENT_SHA}" + + - name: Compare baseline and current results + id: compare + env: + GITHUB_WORKSPACE_PATH: ${{ github.workspace }} + ARTIFACT_DIR: ${{ steps.dirs.outputs.artifact_dir }} + THRESHOLD_PCT: ${{ steps.refs.outputs.threshold_pct }} + shell: bash + run: | + set -euo pipefail + python3 "${GITHUB_WORKSPACE_PATH}/scripts/blake3_nonregression.py" compare \ + --baseline "${ARTIFACT_DIR}/baseline/result.json" \ + --current "${ARTIFACT_DIR}/current/result.json" \ + --summary-out "${ARTIFACT_DIR}/summary.md" \ + --json-out "${ARTIFACT_DIR}/comparison.json" \ + --threshold-pct "${THRESHOLD_PCT}" \ + --github-output "${GITHUB_OUTPUT}" + + - name: Publish job summary + if: always() + env: + ARTIFACT_DIR: ${{ steps.dirs.outputs.artifact_dir }} + shell: bash + run: | + set -euo pipefail + if [[ -f "${ARTIFACT_DIR}/summary.md" ]]; then + cat "${ARTIFACT_DIR}/summary.md" >> "${GITHUB_STEP_SUMMARY}" + fi + + - name: Expose summary for downstream jobs + if: always() + id: summary + env: + ARTIFACT_DIR: ${{ steps.dirs.outputs.artifact_dir }} + shell: bash + run: | + set -euo pipefail + if [[ ! -f "${ARTIFACT_DIR}/summary.md" ]]; then + exit 0 + fi + { + echo "summary<> "${GITHUB_OUTPUT}" + + - name: Upload benchmark artifacts + if: always() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + with: + name: blake3-1to1-nonregression + path: ${{ steps.dirs.outputs.artifact_dir }} + if-no-files-found: warn + + - name: Remove worktrees + if: always() + env: + RUN_ROOT: ${{ steps.dirs.outputs.run_root }} + WORKTREE_DIR: ${{ steps.dirs.outputs.worktree_dir }} + shell: bash + run: | + set -euo pipefail + git worktree remove --force "${WORKTREE_DIR}/baseline" || true + git worktree remove --force "${WORKTREE_DIR}/current" || true + rm -rf "${RUN_ROOT}" + + - name: Fail on regression + if: steps.compare.outputs.regression == 'true' + env: + PROGRAM_DELTA_PCT: ${{ steps.compare.outputs.program_delta_pct }} + shell: bash + run: | + set -euo pipefail + echo "blake3 1-to-1 benchmark regressed by ${PROGRAM_DELTA_PCT}%" + exit 1 + + comment: + name: Comment on pushed commit + runs-on: ubuntu-latest + needs: + - benchmark + if: always() && github.event_name == 'push' && needs.benchmark.outputs.current_sha != '' && needs.benchmark.outputs.summary != '' + permissions: + contents: write + steps: + - name: Create or update commit comment + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b + env: + CURRENT_SHA: ${{ needs.benchmark.outputs.current_sha }} + MARKER: "" + BODY: ${{ needs.benchmark.outputs.summary }} + with: + script: | + const body = [ + process.env.MARKER, + process.env.BODY, + '', + `Workflow run: ${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, + ].join('\n'); + + const owner = context.repo.owner; + const repo = context.repo.repo; + const commitSha = process.env.CURRENT_SHA; + const marker = process.env.MARKER; + + const comments = await github.paginate( + github.rest.repos.listCommentsForCommit, + { + owner, + repo, + commit_sha: commitSha, + per_page: 100, + }, + ); + + const existing = comments.find(comment => + comment.user?.type === 'Bot' && comment.body?.includes(marker) + ); + + if (existing) { + await github.rest.repos.updateCommitComment({ + owner, + repo, + comment_id: existing.id, + body, + }); + return; + } + + await github.rest.repos.createCommitComment({ + owner, + repo, + commit_sha: commitSha, + body, + }); diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 8400212bc1..8c82d89609 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -28,10 +28,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: "20" cache: "npm" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 69cea52ee9..87310cc3f4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,9 @@ jobs: matrix: toolchain: [stable, nightly] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner - name: Build for no-std diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index f159d08757..f234c7c3b6 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -14,16 +14,5 @@ on: types: [opened, reopened, synchronize, labeled, unlabeled] jobs: - changelog: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Check for changes in changelog - env: - BASE_REF: ${{ github.event.pull_request.base.ref }} - NO_CHANGELOG_LABEL: ${{ contains(github.event.pull_request.labels.*.name, 'no changelog') }} - run: ./scripts/check-changelog.sh "${{ inputs.changelog }}" - shell: bash + changelog-reusable: + uses: 0xMiden/.github/.github/workflows/changelog.yml@d34ae3cd29234c5aa4d3ab57635b30563471c3c3 diff --git a/.github/workflows/contribution-quality.yml b/.github/workflows/contribution-quality.yml index f9790808a6..a91900a769 100644 --- a/.github/workflows/contribution-quality.yml +++ b/.github/workflows/contribution-quality.yml @@ -1,8 +1,6 @@ name: Contribution Quality -# Use pull_request_target to get write permissions for fork PRs. -# IMPORTANT: This workflow runs in the context of the BASE branch, not the PR branch. -# Do NOT checkout or run code from the PR itself, only inspect PR metadata via the API. +# Use pull_request_target so the workflow can safely comment/label on PRs. on: pull_request_target: types: [opened, reopened, edited, synchronize, ready_for_review] @@ -19,208 +17,31 @@ on: type: choice options: ["false", "true"] -permissions: - contents: read - pull-requests: write - issues: write +permissions: {} jobs: + contribution-quality-reusable: + permissions: + contents: read + pull-requests: write + issues: write + uses: 0xMiden/.github/.github/workflows/contribution-quality.yml@38552ca595c5773dd361cdc479f349ef75831386 + with: + pr_number: ${{ github.event.inputs.pr_number || '' }} + force_all: ${{ github.event.inputs.force_all || 'false' }} + gate: - if: > - github.event_name == 'workflow_dispatch' || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.fork == true) runs-on: ubuntu-latest - env: - DISPATCH_PR_NUMBER: ${{ inputs.pr_number }} - DISPATCH_FORCE_ALL: ${{ inputs.force_all }} + needs: contribution-quality-reusable + if: always() steps: - - name: Resolve PR number and event mode - id: ctx - uses: actions/github-script@v7 - with: - script: | - // pull_request_target has the same payload shape as pull_request - const isPREvent = !!context.payload.pull_request; - const fromDispatch = context.payload?.inputs?.pr_number || process.env.DISPATCH_PR_NUMBER || ''; - const prNumber = isPREvent ? String(context.payload.pull_request.number) : String(fromDispatch || ''); - if (!prNumber) { - core.setFailed('pr_number is required for manual (workflow_dispatch) runs.'); - return; - } - const forceAll = (context.payload?.inputs?.force_all || process.env.DISPATCH_FORCE_ALL || 'false').toLowerCase(); - core.setOutput('is_pr_event', String(isPREvent)); - core.setOutput('pr_number', prNumber); - core.setOutput('force_all', forceAll); - - - name: Load PR details - id: pr - uses: actions/github-script@v7 - with: - script: | - const prNumber = parseInt("${{ steps.ctx.outputs.pr_number }}", 10); - const { data: pr } = await github.rest.pulls.get({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber - }); - core.setOutput('author_association', pr.author_association || 'NONE'); - core.setOutput('draft', pr.draft ? 'true' : 'false'); - core.setOutput('body', (pr.body || '').replace(/\r/g,'')); - core.setOutput('number', String(pr.number)); - - - name: Skip trusted or drafts (unless forced) - id: gate + - name: Mirror reusable workflow result + env: + RESULT: ${{ needs.contribution-quality-reusable.result }} run: | - assoc="${{ steps.pr.outputs.author_association }}" - draft="${{ steps.pr.outputs.draft }}" - force="${{ steps.ctx.outputs.force_all }}" - if [ "$force" = "true" ]; then - echo "skip=false" >> "$GITHUB_OUTPUT" - else - case "$assoc" in - OWNER|COLLABORATOR|MEMBER) echo "skip=true" >> "$GITHUB_OUTPUT" ;; - *) echo "skip=false" >> "$GITHUB_OUTPUT" ;; - esac - [ "$draft" = "true" ] && echo "skip=true" >> "$GITHUB_OUTPUT" || true + if [ "$RESULT" = "success" ] || [ "$RESULT" = "skipped" ]; then + exit 0 fi - - name: Evaluate - if: steps.gate.outputs.skip != 'true' - id: eval - uses: actions/github-script@v7 - env: - PRNUM: ${{ steps.pr.outputs.number }} - BODY: ${{ steps.pr.outputs.body }} - with: - script: | - const prNumber = parseInt(process.env.PRNUM, 10); - const body = process.env.BODY || ''; - - const DOC_ONLY_MAX_LINES = 20; - const CODE_ONLY_MAX_LINES = 8; - const MAX_ISSUES_TO_CHECK = 5; - - const files = await github.rest.pulls.listFiles({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber, - per_page: 100 - }).then(r => r.data); - - const ext = (p) => { const i=p.lastIndexOf('.'); return i>=0?p.slice(i).toLowerCase():''; }; - const DOCS = new Set(['.md','.rst','.txt']); - const CODE = new Set(['.rs','.go','.py','.ts','.tsx','.js','.jsx','.java','.kt','.cpp','.c','.hpp','.hh','.h','.rb','.swift','.scala','.php','.sh','.bash','.zsh','.ps1','.yaml','.yml','.toml','.json']); - const TEST_HINTS = [/^tests?\//i, /\/tests?\//i, /_test\./i, /\.spec\./i, /\.test\./i]; - - const changedFiles = files.length; - const adds = files.reduce((a,f)=>a+(f.additions||0),0); - const dels = files.reduce((a,f)=>a+(f.deletions||0),0); - const onlyDocs = changedFiles>0 && files.every(f => DOCS.has(ext(f.filename))); - const onlyCode = changedFiles>0 && files.every(f => CODE.has(ext(f.filename))); - const touchesTests = files.some(f => TEST_HINTS.some(rx => rx.test(f.filename))); - - const issueNums = new Set(); - for (const m of (body.match(/(?:fixe?s?|close?s?|resolve?s?)\s*#(\d+)/ig) || [])) { - const mm = m.match(/#(\d+)/); if (mm) issueNums.add(mm[1]); - } - for (const m of (body.match(/#(\d+)/g) || [])) { - issueNums.add(m.replace('#','')); - } - - let hasLinkedIssue=false, linkedAssigned=false, linkedNumber=null; - if (issueNums.size) { - const author = (await github.rest.pulls.get({ - owner: context.repo.owner, repo: context.repo.repo, pull_number: prNumber - })).data.user.login.toLowerCase(); - for (const n of [...issueNums].slice(0,MAX_ISSUES_TO_CHECK).map(x=>parseInt(x,10)).filter(Number.isInteger)) { - try { - const { data: iss } = await github.rest.issues.get({ - owner: context.repo.owner, repo: context.repo.repo, issue_number: n - }); - if (!iss.pull_request) { - hasLinkedIssue = true; linkedNumber = n; - const assignees = (iss.assignees||[]).map(a=>a.login.toLowerCase()); - if (assignees.includes(author)) linkedAssigned = true; - break; - } - } catch (err) { core.warning(`Failed to fetch issue #${n}: ${err}`); } - } - } - - const hasRationale = /(^|\n)#{0,3}\s*(rationale|why)\b/i.test(body) || /\bbecause\b/i.test(body); - const hasTestPlan = /(^|\n)#{0,3}\s*(test\s*plan|how\s*i\s*tested)\b/i.test(body); - - const trivialDoc = onlyDocs && (adds+dels)<=DOC_ONLY_MAX_LINES && changedFiles<=2; - const trivialCode = onlyCode && !touchesTests && (adds+dels)<=CODE_ONLY_MAX_LINES && changedFiles<=1; - - const findings = []; - const recommendations = []; - if (!hasLinkedIssue) findings.push('Link an issue in the PR body (e.g., "Fixes #123").'); - else if (!linkedAssigned) findings.push(`Ensure issue #${linkedNumber} is assigned to the PR author.`); - if (!hasRationale) findings.push('Add a short Rationale explaining why the change is needed.'); - if (!hasTestPlan) recommendations.push('Consider adding a Test plan or clear review steps.'); - if (trivialDoc) findings.push('Change appears to be a trivial doc-only edit; may be batched internally.'); - if (trivialCode) findings.push('Change appears to be a trivial code-only edit without tests; may be batched internally.'); - - core.setOutput('hasFindings', String(findings.length > 0)); - core.setOutput('findings', JSON.stringify(findings)); - core.setOutput('recommendations', JSON.stringify(recommendations)); - core.setOutput('linked', linkedNumber ? String(linkedNumber) : ''); - core.setOutput('pr_number', String(prNumber)); - - - name: Apply label and comment - if: steps.gate.outputs.skip != 'true' && (steps.eval.outputs.hasFindings == 'true' || steps.eval.outputs.recommendations != '[]') - uses: actions/github-script@v7 - env: - FINDINGS: ${{ steps.eval.outputs.findings }} - RECOMMENDATIONS: ${{ steps.eval.outputs.recommendations }} - LINK: ${{ steps.eval.outputs.linked }} - PRNUM: ${{ steps.eval.outputs.pr_number }} - HAS_FINDINGS: ${{ steps.eval.outputs.hasFindings }} - with: - script: | - const issue_number = parseInt(process.env.PRNUM, 10); - const findings = JSON.parse(process.env.FINDINGS || "[]"); - const recommendations = JSON.parse(process.env.RECOMMENDATIONS || "[]"); - const linked = process.env.LINK; - const hasFindings = process.env.HAS_FINDINGS === 'true'; - - // Only apply label if there are actual findings (not just recommendations) - if (hasFindings) { - await github.rest.issues.addLabels({ - owner: context.repo.owner, repo: context.repo.repo, issue_number, - labels: ['quality-concern'] - }); - } - - const guidance = [ - linked ? `- Ensure issue #${linked} is assigned to you.` : `- Link a relevant issue (e.g., "Fixes #123") and ensure it is assigned to you.`, - '- See CONTRIBUTING.md for expectations.', - '- If this is a false positive, comment: `/quality-review`.' - ]; - - const commentBody = [ - 'Automated check (CONTRIBUTING.md)', - '' - ]; - - if (findings.length > 0) { - commentBody.push('Findings:'); - commentBody.push(...findings.map(f => `- ${f}`)); - commentBody.push(''); - } - - if (recommendations.length > 0) { - commentBody.push('Recommendations:'); - commentBody.push(...recommendations.map(f => `- ${f}`)); - commentBody.push(''); - } - - commentBody.push('Next steps:'); - commentBody.push(...guidance); - - await github.rest.issues.createComment({ - owner: context.repo.owner, repo: context.repo.repo, issue_number, - body: commentBody.join('\n') - }); + echo "Reusable contribution quality workflow concluded with $RESULT" >&2 + exit 1 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 0537b1b480..0f6a4ceb57 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -28,35 +28,59 @@ jobs: docs: name: Generate and deploy crate documentation runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner + - name: Configure GitHub Pages + uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 + - name: Generate documentation run: | rustup update --no-self-update rustup default stable make doc - - name: Prepare publish tree + - name: Prepare GitHub Pages artifact run: | set -euo pipefail - mkdir -p .gh-pages-publish/docs - if git ls-remote --heads origin gh-pages | grep -q gh-pages; then - git fetch --depth=1 origin gh-pages - git worktree add --detach .gh-pages-worktree FETCH_HEAD - rsync -a --delete --exclude ".git" .gh-pages-worktree/ .gh-pages-publish/ - git worktree remove .gh-pages-worktree --force - fi - rm -rf .gh-pages-publish/docs - mkdir -p .gh-pages-publish/docs - rsync -a --delete target/doc/ .gh-pages-publish/docs/ - touch .gh-pages-publish/.nojekyll + mkdir -p _site/docs - - name: Deploy documentation - uses: peaceiris/actions-gh-pages@373f7f263a76c20808c831209c920827a82a2847 # pin@v3 + # Publish a single Pages artifact so the live site does not depend on + # whichever Pages source GitHub happens to be configured to read. + cat > _site/index.html << 'EOF' + + + + + Redirecting to docs.miden.xyz + + + + +

Miden VM Documentation Has Moved

+

This site has moved to + docs.miden.xyz/miden-vm. + You will be redirected automatically.

+ + + EOF + + rsync -a --delete target/doc/ _site/docs/ + touch _site/.nojekyll + + - name: Upload GitHub Pages artifact + uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./.gh-pages-publish + path: ./_site + + - name: Deploy documentation + id: deployment + uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5 diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml index 094c5e4845..6d31b905d4 100644 --- a/.github/workflows/fuzz.yml +++ b/.github/workflows/fuzz.yml @@ -41,11 +41,14 @@ jobs: - package_deserialize timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner - - uses: dtolnay/rust-toolchain@nightly - - uses: Swatinem/rust-cache@v2 + - name: Install Rust toolchain + run: rustup update --no-self-update nightly + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 - name: Install cargo-fuzz run: cargo install cargo-fuzz --locked - name: Run fuzz target (smoke test) diff --git a/.github/workflows/link-checker.yml b/.github/workflows/link-checker.yml index 0155799d8d..2f210c9e27 100644 --- a/.github/workflows/link-checker.yml +++ b/.github/workflows/link-checker.yml @@ -20,20 +20,22 @@ jobs: linkChecker: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Set fail-fast flag depending on trigger id: flags run: | if [ "${{ github.event_name }}" = "schedule" ]; then - echo "fail_fast=false" >> $GITHUB_OUTPUT + echo "fail_fast=false" >> "$GITHUB_OUTPUT" else - echo "fail_fast=${{ inputs.fail-fast }}" >> $GITHUB_OUTPUT + echo "fail_fast=${{ inputs.fail-fast }}" >> "$GITHUB_OUTPUT" fi - name: Link Checker id: lychee - uses: lycheeverse/lychee-action@v2.0.2 + uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2.8.0 with: fail: ${{ steps.flags.outputs.fail_fast }} args: | @@ -51,7 +53,7 @@ jobs: - name: Open issue on failure (only if fail-fast is false) if: steps.lychee.outputs.exit_code != 0 && steps.flags.outputs.fail_fast != 'true' - uses: peter-evans/create-issue-from-file@v5 + uses: peter-evans/create-issue-from-file@e8ef132d6df98ed982188e460ebb3b5d4ef3a9cd # v5.0.1 with: title: Link Checker Report content-filepath: ./lychee/out.md diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 91ddda132a..61b7077bdb 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -16,18 +16,35 @@ jobs: name: cargo-deny on ubuntu-latest runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: taiki-e/install-action@v2 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 with: - tool: cargo-deny + persist-credentials: false + - name: Install cargo-deny + run: cargo install cargo-deny --version 0.19.1 --locked - name: Check dependencies with cargo-deny run: cargo deny check + workspace-inheritance: + name: workspace inheritance on ubuntu-latest + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false + - name: Install cargo-binstall + uses: taiki-e/install-action@c1596c3b5e0949d3aaac0490d189c853cc35deb2 # cargo-binstall + - name: Install workspace inheritance checker + run: cargo binstall --no-confirm cargo-workspace-inheritance-check@1.2.0 + - name: Check workspace inheritance + run: cargo workspace-inheritance-check --promotion-threshold 2 --promotion-failure + clippy: name: clippy nightly on ubuntu-latest runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner - name: Clippy @@ -40,7 +57,9 @@ jobs: name: rustfmt check nightly on ubuntu-latest runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner - name: Rustfmt @@ -53,7 +72,9 @@ jobs: name: doc stable on ubuntu-latest runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner - name: Build docs diff --git a/.github/workflows/redirect-pages.yml b/.github/workflows/redirect-pages.yml deleted file mode 100644 index 6a2fbef28c..0000000000 --- a/.github/workflows/redirect-pages.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: Deploy GitHub Pages redirect - -on: - workflow_dispatch: - -permissions: - pages: write - id-token: write - contents: read - -jobs: - deploy: - runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - name: Generate redirect site - run: | - mkdir _site - - cat > _site/index.html << 'EOF' - - - - - Redirecting to docs.miden.xyz - - - - -

Miden VM Documentation Has Moved

-

This site has moved to - docs.miden.xyz/miden-vm. - You will be redirected automatically.

- - - EOF - - mkdir -p _site/docs - - cat > _site/docs/index.html << 'EOF' - - - - - Miden VM - Docs Subdirectory - - -

Miden VM Docs

-

Placeholder for future rustdoc and other documentation.

- - - EOF - - touch _site/.nojekyll - - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/signed-commits.yml b/.github/workflows/signed-commits.yml new file mode 100644 index 0000000000..7d96e5f785 --- /dev/null +++ b/.github/workflows/signed-commits.yml @@ -0,0 +1,110 @@ +# Verifies that all commits in a PR are signed (GPG or SSH). +# Posts a comment with remediation steps if unsigned commits are found. + +name: signed commits + +permissions: {} + +on: + pull_request_target: + branches: + - main + - next + types: [opened, reopened, synchronize] + +jobs: + check-signed-commits: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: + - name: Resolve author permission + id: perm + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + with: + script: | + const login = (context.payload.pull_request.user?.login || '').toLowerCase(); + let permission = 'none'; + try { + // Signed-commit checks only apply to maintainers. + // GitHub repo roles are too broad here because most access + // comes from org team permissions, so this probe reads the + // PR author's effective repo write access and decides who + // should be asked to sign commits. + const { data } = await github.rest.repos.getCollaboratorPermissionLevel({ + owner: context.repo.owner, + repo: context.repo.repo, + username: login, + }); + permission = (data.permission || 'none').toLowerCase(); + } catch (error) { + if (error.status !== 404) { + core.warning(`Failed to resolve collaborator permission for ${login}: ${error.message}`); + } + } + + const enforce = ['admin', 'maintain', 'write'].includes(permission); + core.info(`author=${login} permission=${permission} enforce=${enforce}`); + core.setOutput('enforce', enforce ? 'true' : 'false'); + + - name: Check for unsigned commits + if: steps.perm.outputs.enforce == 'true' + id: check + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + with: + script: | + const prNumber = context.payload.pull_request.number; + const commits = await github.rest.pulls.listCommits({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + per_page: 250 + }); + + const unsigned = commits.data.filter(c => !c.commit.verification.verified); + + if (unsigned.length === 0) { + core.setOutput('unsigned', ''); + core.info('All commits are signed.'); + return; + } + + const lines = unsigned.map(c => + `- \`${c.sha.slice(0, 8)}\` ${c.commit.message.split('\n')[0]}` + ); + + core.setOutput('unsigned', lines.join('\n')); + core.setOutput('pr_number', String(prNumber)); + core.setFailed( + `Found ${unsigned.length} unsigned commit(s) in this PR. ` + + 'All commits must be signed (GPG or SSH).' + ); + + - name: Comment with remediation steps + if: failure() && steps.perm.outputs.enforce == 'true' && steps.check.outputs.unsigned != '' + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + env: + UNSIGNED: ${{ steps.check.outputs.unsigned }} + PRNUM: ${{ steps.check.outputs.pr_number }} + with: + script: | + const issue_number = parseInt(process.env.PRNUM, 10); + const unsignedList = process.env.UNSIGNED; + + const body = [ + 'This PR contains unsigned commits. All commits must be cryptographically signed (GPG or SSH).', + '', + 'Unsigned commits:', + unsignedList, + '', + 'For instructions on setting up commit signing and re-signing existing commits, see:', + 'https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits' + ].join('\n'); + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number, + body + }); diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b91bed1764..bddb894e76 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,14 +11,16 @@ permissions: jobs: test: - name: test on ubuntu-latest - runs-on: ubuntu-latest + name: test on warp-ubuntu-latest-x64-4x + runs-on: warp-ubuntu-latest-x64-4x steps: - - uses: actions/checkout@main + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner - - uses: taiki-e/install-action@nextest - - uses: Swatinem/rust-cache@v2 + - uses: taiki-e/install-action@dd81e62c198605dea8507fed3fb6834da354ded4 # nextest + - uses: WarpBuilds/rust-cache@9d0cc3090d9c87de74ea67617b246e978735b1a1 # v2.9.1 with: save-if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/next' }} - name: Install rust @@ -30,12 +32,14 @@ jobs: doc-tests: name: doc-tests - runs-on: ubuntu-latest + runs-on: warp-ubuntu-latest-x64-4x steps: - - uses: actions/checkout@main + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner - - uses: Swatinem/rust-cache@v2 + - uses: WarpBuilds/rust-cache@9d0cc3090d9c87de74ea67617b246e978735b1a1 # v2.9.1 with: save-if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/next' }} - name: Install rust @@ -45,13 +49,15 @@ jobs: check-core-lib-docs: name: check core library docs - runs-on: ubuntu-latest + runs-on: warp-ubuntu-latest-x64-4x needs: [test, doc-tests] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner - - uses: Swatinem/rust-cache@v2 + - uses: WarpBuilds/rust-cache@9d0cc3090d9c87de74ea67617b246e978735b1a1 # v2.9.1 with: save-if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/next' }} - name: Install rust @@ -81,14 +87,33 @@ jobs: echo "No documentation changes in crates/lib/core/docs/ - OK" fi + check-constraints: + name: check recursive constraint artifacts + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false + - name: Cleanup large tools for build space + uses: ./.github/actions/cleanup-runner + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + with: + save-if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/next' }} + - name: Install rust + run: rustup update --no-self-update + - name: Check recursive constraint artifacts for drift + run: make check-constraints + run-examples: name: run masm examples - runs-on: ubuntu-latest + runs-on: warp-ubuntu-latest-x64-4x steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner - - uses: Swatinem/rust-cache@v2 + - uses: WarpBuilds/rust-cache@9d0cc3090d9c87de74ea67617b246e978735b1a1 # v2.9.1 with: save-if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/next' }} - name: Install rust @@ -98,17 +123,19 @@ jobs: check-features: name: check all feature combinations - runs-on: ubuntu-latest + runs-on: warp-ubuntu-latest-x64-4x steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false - name: Cleanup large tools for build space uses: ./.github/actions/cleanup-runner - - uses: Swatinem/rust-cache@v2 + - uses: WarpBuilds/rust-cache@9d0cc3090d9c87de74ea67617b246e978735b1a1 # v2.9.1 with: save-if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/next' }} - name: Install rust run: rustup update --no-self-update - name: Install cargo-hack - uses: taiki-e/install-action@cargo-hack + uses: taiki-e/install-action@36052feccaae5f79088f0d62a11f9bac2a9e2ec0 # cargo-hack - name: Check all feature combinations run: make check-features diff --git a/.github/workflows/workspace-dry-run.yml b/.github/workflows/workspace-dry-run.yml index ed3d90f3f9..da2403adc8 100644 --- a/.github/workflows/workspace-dry-run.yml +++ b/.github/workflows/workspace-dry-run.yml @@ -17,17 +17,18 @@ concurrency: jobs: release-dry-run: if: ${{ github.repository_owner == '0xMiden' }} - runs-on: ubuntu-latest + runs-on: warp-ubuntu-latest-x64-4x steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 with: fetch-depth: 0 + persist-credentials: false - name: Dry-run workspace release uses: ./.github/actions/workspace-release with: mode: "dry-run" verify-main-head: "false" - # ref left blank: uses the pushed ref \ No newline at end of file + # ref left blank: uses the pushed ref diff --git a/.github/workflows/workspace-publish.yml b/.github/workflows/workspace-publish.yml index 7f6a5378b6..d729713ada 100644 --- a/.github/workflows/workspace-publish.yml +++ b/.github/workflows/workspace-publish.yml @@ -11,18 +11,19 @@ permissions: jobs: publish: if: ${{ github.repository_owner == '0xMiden' }} - runs-on: ubuntu-latest + runs-on: warp-ubuntu-latest-x64-4x environment: release # Optional: for enhanced security steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 with: fetch-depth: 0 ref: main + persist-credentials: false - name: Authenticate with crates.io - uses: rust-lang/crates-io-auth-action@v1 + uses: rust-lang/crates-io-auth-action@bbd81622f20ce9e2dd9622e3218b975523e45bbe # v1.0.4 id: auth - name: Publish workspace crates @@ -31,4 +32,4 @@ jobs: mode: "publish" verify-main-head: "true" env: - CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} \ No newline at end of file + CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml new file mode 100644 index 0000000000..f8a0571b4d --- /dev/null +++ b/.github/workflows/zizmor.yml @@ -0,0 +1,38 @@ +name: GitHub Actions Security Analysis with zizmor + +on: + push: + branches: [main, next] + paths: + - ".github/workflows/**" + - ".github/actions/**" + - "zizmor.yml" + pull_request: + types: [opened, reopened, synchronize] + paths: + - ".github/workflows/**" + - ".github/actions/**" + - "zizmor.yml" + workflow_dispatch: + +permissions: {} + +jobs: + zizmor: + name: Run zizmor + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + with: + persist-credentials: false + + - name: Run zizmor + uses: zizmorcore/zizmor-action@71321a20a9ded102f6e9ce5718a2fcec2c4f70d8 # v0.5.2 + with: + advanced-security: false + config: zizmor.yml + version: 1.23.1 diff --git a/.gitignore b/.gitignore index 88a02e29d4..5728cdb9d6 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,7 @@ crates/lib/core/assets/core.masl # mdBook book/ + +# Constraint analysis tooling +.constraint-tooling/ +scripts/__pycache__/ diff --git a/CHANGELOG.md b/CHANGELOG.md index ca81458e01..f958a5d54f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,48 @@ # Changelog +## v0.23.0 (TBD) + +#### Fixes +- Rejected non-syscall references to exported kernel procedures in the linker ([#2902](https://github.com/0xMiden/miden-vm/issues/2902)). +- Reverted the `MainTrace` typed row storage change that caused a large `blake3_1to1` trace-building regression ([#2949](https://github.com/0xMiden/miden-vm/pull/2949)). +- Fixed Falcon `mod_12289` remainder validation and `u64::rotr` overflow handling for rotations by `0` and `32` ([#2968](https://github.com/0xMiden/miden-vm/pull/2968)). + +#### Bug Fixes + +- Fixed debug-only underflow in memory range-check trace generation when the first memory access is at `clk = 0` ([#2976](https://github.com/0xMiden/miden-vm/pull/2976)). +- Replaced unsound `ptr::read` with safe unbox in panic recovery, removing UB from potential double-drop ([#2934](https://github.com/0xMiden/miden-vm/pull/2934)). +- Reverted `InvokeKind::ProcRef` back to `InvokeKind::Exec` in `visit_mut_procref` and added an explanatory comment (#2893). +- Fixed the release dry-run publish cycle between `miden-air` and `miden-ace-codegen`, and preserved leaf-only DAG imports with explicit snapshots ([#2931](https://github.com/0xMiden/miden-vm/pull/2931)). + +#### Changes + +- Documented sortedness precondition more prominently for sorted array operations ([#2832](https://github.com/0xMiden/miden-vm/pull/2832)). +- Borrowed operation slices in basic-block batching helpers to avoid cloning in the fingerprinting path ([#2994](https://github.com/0xMiden/miden-vm/pull/2994)). +- [BREAKING] Sync execution and proving APIs now require `SyncHost`; async `Host`, `execute`, and `prove` remain available ([#2865](https://github.com/0xMiden/miden-vm/pull/2865)). +- [BREAKING] `miden_processor::execute()` and `execute_sync()` now return `ExecutionOutput`; trace building remains explicit via `execute_trace_inputs*()` and `trace::build_trace()` ([#2865](https://github.com/0xMiden/miden-vm/pull/2865)). +- [BREAKING] Removed the deprecated `FastProcessor::execute_sync_mut()` alias; `execute_mut_sync()` is now the only sync mutable-execution entrypoint ([#2865](https://github.com/0xMiden/miden-vm/pull/2865)). +- [BREAKING] Removed the deprecated `FastProcessor::execute_for_trace_sync()` and `execute_for_trace()` wrappers; use `execute_trace_inputs_sync()` or `execute_trace_inputs()` instead ([#2865](https://github.com/0xMiden/miden-vm/pull/2865)). +- [BREAKING] Removed the deprecated unbound `TraceBuildInputs::new()` and `TraceBuildInputs::from_program()` constructors; use `execute_trace_inputs_sync()` or `execute_trace_inputs()` instead ([#2865](https://github.com/0xMiden/miden-vm/pull/2865)). +- Added `prove_from_trace_sync(...)` for proving from pre-executed trace inputs ([#2865](https://github.com/0xMiden/miden-vm/pull/2865)). +- [BREAKING] Reduced the prove-from-trace API to post-execution trace inputs: `TraceBuildInputs` no longer carries full execution output, `prove_from_trace_sync()` takes `TraceProvingInputs`, and `ProvingOptions` no longer include `ExecutionOptions` ([#2948](https://github.com/0xMiden/miden-vm/pull/2948)). +- Redesigned the hasher chiplet to use a controller/permutation split architecture with permutation calls deduplication ([#2927](https://github.com/0xMiden/miden-vm/pull/2927)). +- Documented that enum variants are module-level constants and must be unique within a module ([#2932]((https://github.com/0xMiden/miden-vm/pull/2932)). +- Refactor trace generation to row-major format ([#2937](https://github.com/0xMiden/miden-vm/pull/2937)). +- Documented non-overlap requirement for `memcopy_words`, `memcopy_elements`, and AEAD encrypt/decrypt procedures ([#2941](https://github.com/0xMiden/miden-vm/pull/2941)). +- Added chainable `Test` builders for common test setup in `miden-utils-testing` ([#2957](https://github.com/0xMiden/miden-vm/pull/2957)). +- Speed-up AUX range check trace generation by changing divisors to a flat Vec layout ([#2966](https://github.com/0xMiden/miden-vm/pull/2966)). +- Removed AIR constraint tagging instrumentation, applied a uniform constraint description style across components, and optimized constraint evaluation ([#2856](https://github.com/0xMiden/miden-vm/pull/2856)). + +## 0.22.1 + +#### Enhancements + +- Added `FastProcessor::into_parts()` to extract advice provider, memory, and precompile transcript after step-based execution ([#2901](https://github.com/0xMiden/miden-vm/pull/2901)). + +#### Fixes + +- Fixed stale `ReplayProcessor` doc comment links to `ExecutionTracer` after module-structure refactors. + ## 0.22.1 (2026-04-07) - Implemented project assembly ([#2877](https://github.com/0xMiden/miden-vm/pull/2877)). @@ -15,7 +58,6 @@ - Added `math::u128` division operations ([#2776](https://github.com/0xMiden/miden-vm/pull/2776)). - [BREAKING] Migrated to lifted-STARK backend and `miden-crypto` to v0.23 ([#2783](https://github.com/0xMiden/miden-vm/pull/2783)). - #### Changes - Consolidated error variants: simplified `AceError` and FRI errors to string-based types, merged `DynamicNodeNotFound`/`NoMastForestWithProcedure` into `ProcedureNotFound`, introduced `HostError` for handler-related variants ([#2675](https://github.com/0xMiden/miden-vm/pull/2675)). @@ -37,9 +79,14 @@ - [BREAKING] `StructType::new` now expects an optional name to be specified ([#2848](https://github.com/0xMiden/miden-vm/pull/2848)) - [BREAKING] `Variant::new` now expects an optional payload type to be specified ([#2848](https://github.com/0xMiden/miden-vm/pull/2848)) - [BREAKING] Enum types are now exported from libraries as a `midenc_hir_type::EnumType`, rather than the type of the discriminant. ([#2848](https://github.com/0xMiden/miden-vm/pull/2848)) +- In `ExecutionTracer`, we no longer record node flags in `CoreTraceFragmentContext` when entering a node (they are redundant) ([#2866](https://github.com/0xMiden/miden-vm/pull/2866)) +- Updated the recursive STARK verifier to work with the lifted-STARK / `p3-miden` backend ([#2869](https://github.com/0xMiden/miden-vm/pull/2869)). +- Switched Keccak STARK config to use stateful binary sponge with `[Felt; VECTOR_LEN]` packing, and reorganized `config.rs` into per-hash-family sections ([#2874](https://github.com/0xMiden/miden-vm/pull/2874)). - Add support to the `Assembler` for assembling Miden projects to Miden packages ([#2877](https://github.com/0xMiden/miden-vm/pull/2877)) #### Fixes +- Fixed C-like enum validation and constant materialization in `define_enum` ([#2887](https://github.com/0xMiden/miden-vm/pull/2887)). +- **toposort_caller**: Fixed cycle detection in assembly call graph ([#2871](https://github.com/0xMiden/miden-vm/pull/2871)). - Fixed `Constant::PartialEq` to include `visibility` field in equality comparison, making it consistent with other exportable items (`Procedure`, `TypeAlias`, `EnumType`). - Cryptostream operation now correctly sends chiplets bus memory requests ([#2686](https://github.com/0xMiden/miden-vm/pull/2686)). diff --git a/Cargo.lock b/Cargo.lock index 73ca6d82b8..c1a326829f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -36,6 +36,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse 0.2.7", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + [[package]] name = "anstream" version = "1.0.0" @@ -43,7 +58,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", - "anstyle-parse", + "anstyle-parse 1.0.0", "anstyle-query", "anstyle-wincon", "colorchoice", @@ -57,6 +72,15 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + [[package]] name = "anstyle-parse" version = "1.0.0" @@ -72,7 +96,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -83,7 +107,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -178,16 +202,16 @@ checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "blake3" -version = "1.8.4" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d2d5991425dfd0785aed03aedcf0b321d61975c9b5b3689c774a2610ae0b51e" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", - "cpufeatures 0.3.0", + "cpufeatures", ] [[package]] @@ -224,9 +248,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.59" +version = "1.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", "jobserver", @@ -248,7 +272,7 @@ checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if", "cipher", - "cpufeatures 0.2.17", + "cpufeatures", ] [[package]] @@ -318,7 +342,7 @@ version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ - "anstream", + "anstream 1.0.0", "anstyle", "clap_lex", "strsim", @@ -350,13 +374,14 @@ checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "console" -version = "0.16.3" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", "libc", - "windows-sys", + "once_cell", + "windows-sys 0.59.0", ] [[package]] @@ -380,15 +405,6 @@ dependencies = [ "libc", ] -[[package]] -name = "cpufeatures" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" -dependencies = [ - "libc", -] - [[package]] name = "criterion" version = "0.7.0" @@ -484,7 +500,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", + "cpufeatures", "curve25519-dalek-derive", "digest", "fiat-crypto", @@ -646,9 +662,9 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "env_filter" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" dependencies = [ "log", "regex", @@ -656,11 +672,11 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.10" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" dependencies = [ - "anstream", + "anstream 0.6.21", "anstyle", "env_filter", "jiff", @@ -691,7 +707,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -1005,9 +1021,9 @@ checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" [[package]] name = "indexmap" -version = "2.13.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", @@ -1026,9 +1042,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.47.2" +version = "1.46.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4a6248eb93a4401ed2f37dfe8ea592d3cf05b7cf4f8efa867b6895af7e094e" +checksum = "e82db8c87c7f1ccecb34ce0c24399b8a73081427f3c7c50a5d597925356115e4" dependencies = [ "console", "once_cell", @@ -1062,9 +1078,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.18" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jiff" @@ -1102,9 +1118,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.94" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -1130,7 +1146,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" dependencies = [ - "cpufeatures 0.2.17", + "cpufeatures", ] [[package]] @@ -1177,9 +1193,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.184" +version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "libm" @@ -1238,9 +1254,8 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "miden-ace-codegen" -version = "0.22.1" +version = "0.23.0" dependencies = [ - "miden-air", "miden-core", "miden-crypto", "thiserror", @@ -1248,8 +1263,10 @@ dependencies = [ [[package]] name = "miden-air" -version = "0.22.1" +version = "0.23.0" dependencies = [ + "insta", + "miden-ace-codegen", "miden-core", "miden-crypto", "miden-utils-indexing", @@ -1260,7 +1277,7 @@ dependencies = [ [[package]] name = "miden-assembly" -version = "0.22.1" +version = "0.23.0" dependencies = [ "env_logger", "insta", @@ -1279,7 +1296,7 @@ dependencies = [ [[package]] name = "miden-assembly-syntax" -version = "0.22.1" +version = "0.23.0" dependencies = [ "aho-corasick", "env_logger", @@ -1296,7 +1313,7 @@ dependencies = [ "proptest-derive", "regex", "rustc_version 0.4.1", - "semver 1.0.28", + "semver 1.0.27", "serde", "serde_json", "smallvec", @@ -1305,7 +1322,7 @@ dependencies = [ [[package]] name = "miden-core" -version = "0.22.1" +version = "0.23.0" dependencies = [ "criterion", "derive_more", @@ -1331,8 +1348,9 @@ dependencies = [ [[package]] name = "miden-core-lib" -version = "0.22.1" +version = "0.23.0" dependencies = [ + "bincode", "criterion", "env_logger", "fs-err", @@ -1350,9 +1368,10 @@ dependencies = [ "num", "num-bigint", "pretty_assertions", - "rand 0.9.2", + "rand 0.9.3", "rand_chacha", "rstest", + "serde", "serde_json", "thiserror", ] @@ -1387,7 +1406,7 @@ dependencies = [ "p3-miden-lifted-stark", "p3-symmetric", "p3-util", - "rand 0.9.2", + "rand 0.9.3", "rand_chacha", "rand_core 0.9.5", "rand_hc", @@ -1412,7 +1431,7 @@ dependencies = [ [[package]] name = "miden-debug-types" -version = "0.22.1" +version = "0.23.0" dependencies = [ "memchr", "miden-crypto", @@ -1438,7 +1457,7 @@ dependencies = [ "p3-field", "p3-goldilocks", "paste", - "rand 0.10.0", + "rand 0.10.1", "serde", "subtle", "thiserror", @@ -1455,7 +1474,7 @@ dependencies = [ [[package]] name = "miden-mast-package" -version = "0.22.1" +version = "0.23.0" dependencies = [ "derive_more", "miden-assembly-syntax", @@ -1507,7 +1526,7 @@ dependencies = [ [[package]] name = "miden-package-registry" -version = "0.22.1" +version = "0.23.0" dependencies = [ "miden-assembly-syntax", "miden-core", @@ -1521,7 +1540,7 @@ dependencies = [ [[package]] name = "miden-processor" -version = "0.22.1" +version = "0.23.0" dependencies = [ "insta", "itertools 0.14.0", @@ -1544,7 +1563,7 @@ dependencies = [ [[package]] name = "miden-project" -version = "0.22.1" +version = "0.23.0" dependencies = [ "miden-assembly-syntax", "miden-core", @@ -1563,10 +1582,11 @@ dependencies = [ [[package]] name = "miden-prover" -version = "0.22.1" +version = "0.23.0" dependencies = [ "bincode", "miden-air", + "miden-assembly", "miden-core", "miden-crypto", "miden-debug-types", @@ -1618,7 +1638,7 @@ dependencies = [ [[package]] name = "miden-utils-core-derive" -version = "0.22.1" +version = "0.23.0" dependencies = [ "proc-macro2", "quote", @@ -1627,7 +1647,7 @@ dependencies = [ [[package]] name = "miden-utils-diagnostics" -version = "0.22.1" +version = "0.23.0" dependencies = [ "miden-crypto", "miden-debug-types", @@ -1638,7 +1658,7 @@ dependencies = [ [[package]] name = "miden-utils-indexing" -version = "0.22.1" +version = "0.23.0" dependencies = [ "miden-crypto", "serde", @@ -1647,7 +1667,7 @@ dependencies = [ [[package]] name = "miden-utils-sync" -version = "0.22.1" +version = "0.23.0" dependencies = [ "lock_api", "loom", @@ -1658,7 +1678,7 @@ dependencies = [ [[package]] name = "miden-verifier" -version = "0.22.1" +version = "0.23.0" dependencies = [ "bincode", "miden-air", @@ -1671,7 +1691,7 @@ dependencies = [ [[package]] name = "miden-vm" -version = "0.22.1" +version = "0.23.0" dependencies = [ "assert_cmd", "bincode", @@ -1704,9 +1724,9 @@ dependencies = [ [[package]] name = "midenc-hir-type" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb29d7c049fb69373c7e775e3d4411e63e4ee608bc43826282ba62c6ec9f891" +checksum = "68c6fa22e50c8820284f857d7019e944eb4d29340f397eaabc491af446eff79b" dependencies = [ "miden-formatting", "miden-serde-utils", @@ -1743,7 +1763,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -1863,9 +1883,9 @@ checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" [[package]] name = "p3-air" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2ec9cbfc642fc5173817287c3f8b789d07743b5f7e812d058b7a03e344f9ab" +checksum = "9ebc58ec27a174420348b3f04dba836fa2e5b5fe8df74601087417352757c643" dependencies = [ "p3-field", "p3-matrix", @@ -1874,9 +1894,9 @@ dependencies = [ [[package]] name = "p3-blake3" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b667f43b19499dd939c9e2553aa95688936a88360d50117dae3c8848d07dbc70" +checksum = "b3cacb38c29fbee71fe3e5c6c0a1073632e46dc3e93fbdc50ab4e4fac137b525" dependencies = [ "blake3", "p3-symmetric", @@ -1885,9 +1905,9 @@ dependencies = [ [[package]] name = "p3-challenger" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0b490c745a7d2adeeafff06411814c8078c432740162332b3cd71be0158a76" +checksum = "af9bbcb18fe90271668259aacfc43455e328673c2b5c926cff0663edc8653e4d" dependencies = [ "p3-field", "p3-maybe-rayon", @@ -1899,9 +1919,9 @@ dependencies = [ [[package]] name = "p3-commit" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916ae7989d5c3b49f887f5c55b2f9826bdbb81aaebf834503c4145d8b267c829" +checksum = "14d07b50c6f6d3bc89ed7c54ae0c569fb4caaa58263fd389dc02fb1b0a6378fa" dependencies = [ "itertools 0.14.0", "p3-field", @@ -1912,9 +1932,9 @@ dependencies = [ [[package]] name = "p3-dft" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55301e91544440254977108b85c32c09d7ea05f2f0dd61092a2825339906a4a7" +checksum = "17e7ba0dc20be075eab3f88f0cb820a0901f86218a1c46134e7c817d41597989" dependencies = [ "itertools 0.14.0", "p3-field", @@ -1927,25 +1947,25 @@ dependencies = [ [[package]] name = "p3-field" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85affca7fc983889f260655c4cf74163eebb94605f702e4b6809ead707cba54f" +checksum = "9b8533e6c2f4d0cc61fd2ae5299bb83316898e535f47291808d37e4d666ba088" dependencies = [ "itertools 0.14.0", "num-bigint", "p3-maybe-rayon", "p3-util", "paste", - "rand 0.10.0", + "rand 0.10.1", "serde", "tracing", ] [[package]] name = "p3-goldilocks" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca1081f5c47b940f2d75a11c04f62ea1cc58a5d480dd465fef3861c045c63cd" +checksum = "d8102a8c85acee1f896c3764bef5fac908e6026dadfc557c185294970cce0746" dependencies = [ "num-bigint", "p3-challenger", @@ -1957,15 +1977,15 @@ dependencies = [ "p3-symmetric", "p3-util", "paste", - "rand 0.10.0", + "rand 0.10.1", "serde", ] [[package]] name = "p3-keccak" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcf27615ece1995e4fcf4c69740f1cf515d1481367a20b4b3ce7f4f1b8d70f7" +checksum = "b65d30dd586d2855906a01c3414c155c2d564f6677d1b51f04186dcac080f757" dependencies = [ "p3-symmetric", "p3-util", @@ -1974,39 +1994,39 @@ dependencies = [ [[package]] name = "p3-matrix" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53428126b009071563d1d07305a9de8be0d21de00b57d2475289ee32ffca6577" +checksum = "72bb78444459155c2e4711d71abbfef7b04cc2ba1fa83751ccab241b01957095" dependencies = [ "itertools 0.14.0", "p3-field", "p3-maybe-rayon", "p3-util", - "rand 0.10.0", + "rand 0.10.1", "serde", "tracing", ] [[package]] name = "p3-maybe-rayon" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "082bf467011c06c768c579ec6eb9accb5e1e62108891634cc770396e917f978a" +checksum = "70a0a54345917f500130a9986fa5ff9ecbc26f0c6313080b35b713e26ddc8053" dependencies = [ "rayon", ] [[package]] name = "p3-mds" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35209e6214102ea6ec6b8cb1b9c15a9b8e597a39f9173597c957f123bced81b3" +checksum = "3cd514bf3e9bf9f1b7db2db96e5bd2972d9963dd62430de1e193d74522ae96a6" dependencies = [ "p3-dft", "p3-field", "p3-symmetric", "p3-util", - "rand 0.10.0", + "rand 0.10.1", ] [[package]] @@ -2037,7 +2057,7 @@ dependencies = [ "p3-miden-lmcs", "p3-miden-transcript", "p3-util", - "rand 0.10.0", + "rand 0.10.1", "thiserror", "tracing", ] @@ -2077,7 +2097,7 @@ dependencies = [ "p3-miden-transcript", "p3-symmetric", "p3-util", - "rand 0.10.0", + "rand 0.10.1", "serde", "thiserror", "tracing", @@ -2107,9 +2127,9 @@ dependencies = [ [[package]] name = "p3-monty-31" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffa8c99ec50c035020bbf5457c6a729ba6a975719c1a8dd3f16421081e4f650c" +checksum = "0d9340a650f07a6cd42a4e877017ba7b206df87fe50dfc3cf110f01a3c370bd1" dependencies = [ "itertools 0.14.0", "num-bigint", @@ -2123,7 +2143,7 @@ dependencies = [ "p3-symmetric", "p3-util", "paste", - "rand 0.10.0", + "rand 0.10.1", "serde", "spin 0.10.0", "tracing", @@ -2131,33 +2151,33 @@ dependencies = [ [[package]] name = "p3-poseidon1" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a018b618e3fa0aec8be933b1d8e404edd23f46991f6bf3f5c2f3f95e9413fe9" +checksum = "6dd56ae3a51ded1b77f7b1b21d0b157ae82b9d5ca8f2cba347c0b821fe771a79" dependencies = [ "p3-field", "p3-symmetric", - "rand 0.10.0", + "rand 0.10.1", ] [[package]] name = "p3-poseidon2" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256a668a9ba916f8767552f13d0ba50d18968bc74a623bfdafa41e2970c944d0" +checksum = "858aa1c33ec983dfbb8cfc553a213de19d8fde96485e54e6e952b9ac5e70bd4e" dependencies = [ "p3-field", "p3-mds", "p3-symmetric", "p3-util", - "rand 0.10.0", + "rand 0.10.1", ] [[package]] name = "p3-symmetric" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c60a71a1507c13611b0f2b0b6e83669fd5b76f8e3115bcbced5ccfdf3ca7807" +checksum = "1a9a3b20bb8104e52d45219a78d80654c8ac6a4781be0eaa3f3e999f5ae4b9b2" dependencies = [ "itertools 0.14.0", "p3-field", @@ -2167,9 +2187,9 @@ dependencies = [ [[package]] name = "p3-util" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8b766b9e9254bf3fa98d76e42cf8a5b30628c182dfd5272d270076ee12f0fc0" +checksum = "9f24495d9cd64693165a9f1b3da0758395ad6d25d2d44dd740bdb34c2bce0c53" dependencies = [ "rayon", "serde", @@ -2274,7 +2294,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ - "cpufeatures 0.2.17", + "cpufeatures", "opaque-debug", "universal-hash", ] @@ -2390,13 +2410,13 @@ dependencies = [ [[package]] name = "proptest" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" dependencies = [ "bitflags", "num-traits", - "rand 0.9.2", + "rand 0.9.3", "rand_chacha", "rand_xorshift", "regex-syntax", @@ -2451,9 +2471,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "7ec095654a25171c2124e9e3393a930bddbffdc939556c914957a4c3e0a87166" dependencies = [ "rand_chacha", "rand_core 0.9.5", @@ -2461,9 +2481,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ "rand_core 0.10.0", ] @@ -2625,9 +2645,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc_version" @@ -2644,7 +2664,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.28", + "semver 1.0.27", ] [[package]] @@ -2657,7 +2677,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -2712,9 +2732,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.28" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", "serde_core", @@ -2794,9 +2814,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.1.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" dependencies = [ "serde_core", ] @@ -2808,7 +2828,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", + "cpufeatures", "digest", ] @@ -2985,7 +3005,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -2994,7 +3014,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8c27177b12a6399ffc08b98f76f7c9a1f4fe9fc967c784c5a071fa8d93cf7e1" dependencies = [ - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -3106,9 +3126,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.51.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd1c4c0fc4a7ab90fc15ef6daaa3ec3b893f004f915f2392557ed23237820cd" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "pin-project-lite", "tokio-macros", @@ -3116,9 +3136,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", @@ -3127,9 +3147,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.2+spec-1.1.0" +version = "1.0.7+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +checksum = "dd28d57d8a6f6e458bc0b8784f8fdcc4b99a437936056fa122cb234f18656a96" dependencies = [ "indexmap", "serde_core", @@ -3142,18 +3162,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.1.1+spec-1.1.0" +version = "1.0.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.25.10+spec-1.1.0" +version = "0.25.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82418ca169e235e6c399a84e395ab6debeb3bc90edc959bf0f48647c6a32d1b" +checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" dependencies = [ "indexmap", "toml_datetime", @@ -3163,18 +3183,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.1.2+spec-1.1.0" +version = "1.0.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.1.1+spec-1.1.0" +version = "1.0.7+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" [[package]] name = "tracing" @@ -3415,9 +3435,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.117" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -3428,9 +3448,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.117" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3438,9 +3458,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.117" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", @@ -3451,9 +3471,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.117" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] @@ -3489,14 +3509,14 @@ dependencies = [ "bitflags", "hashbrown 0.15.5", "indexmap", - "semver 1.0.28", + "semver 1.0.27", ] [[package]] name = "web-sys" -version = "0.3.94" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -3524,7 +3544,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -3548,6 +3568,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -3557,11 +3586,75 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" dependencies = [ "memchr", ] @@ -3646,7 +3739,7 @@ dependencies = [ "id-arena", "indexmap", "log", - "semver 1.0.28", + "semver 1.0.27", "serde", "serde_derive", "serde_json", @@ -3672,18 +3765,18 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 58800ec039..bb188afcb4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ homepage = "https://miden.xyz" repository = "https://github.com/0xMiden/miden-vm" exclude = [".github/"] rust-version = "1.90" -version = "0.22.1" +version = "0.23.0" [profile.optimized] inherits = "release" @@ -48,24 +48,25 @@ overflow-checks = true [workspace.dependencies] # Workspace crates -miden-air = { path = "./air", version = "0.22.0", default-features = false } -miden-assembly = { path = "./crates/assembly", version = "0.22.0", default-features = false } -miden-assembly-syntax = { path = "./crates/assembly-syntax", version = "0.22.0", default-features = false } -miden-core = { path = "./core", version = "0.22.0", default-features = false } -miden-debug-types = { path = "./crates/debug-types", version = "0.22.0", default-features = false } -miden-mast-package = { path = "./crates/mast-package", version = "0.22.0", default-features = false } -miden-package-registry = { path = "./crates/package-registry", version = "0.22.0", default-features = false } -miden-processor = { path = "./processor", version = "0.22.0", default-features = false } +miden-ace-codegen = { path = "./crates/ace-codegen", version = "0.23.0", default-features = false } +miden-air = { path = "./air", version = "0.23.0", default-features = false } +miden-assembly = { path = "./crates/assembly", version = "0.23.0", default-features = false } +miden-assembly-syntax = { path = "./crates/assembly-syntax", version = "0.23.0", default-features = false } +miden-core = { path = "./core", version = "0.23.0", default-features = false } +miden-debug-types = { path = "./crates/debug-types", version = "0.23.0", default-features = false } +miden-mast-package = { path = "./crates/mast-package", version = "0.23.0", default-features = false } +miden-package-registry = { path = "./crates/package-registry", version = "0.23.0", default-features = false } +miden-processor = { path = "./processor", version = "0.23.0", default-features = false } miden-test-serde-macros = { path = "./crates/test-serde-macros", default-features = false } -miden-project = { path = "./crates/project", version = "0.22.0", default-features = false } -miden-prover = { path = "./prover", version = "0.22.0", default-features = false } -miden-core-lib = { path = "./crates/lib/core", version = "0.22.0", default-features = false } -miden-utils-core-derive = { path = "./crates/utils-core-derive", version = "0.22.0", default-features = false } -miden-utils-diagnostics = { path = "./crates/utils-diagnostics", version = "0.22.0", default-features = false } -miden-utils-indexing = { path = "./crates/utils-indexing", version = "0.22.0", default-features = false } -miden-utils-sync = { path = "./crates/utils-sync", version = "0.22.0", default-features = false } +miden-project = { path = "./crates/project", version = "0.23.0", default-features = false } +miden-prover = { path = "./prover", version = "0.23.0", default-features = false } +miden-core-lib = { path = "./crates/lib/core", version = "0.23.0", default-features = false } +miden-utils-core-derive = { path = "./crates/utils-core-derive", version = "0.23.0", default-features = false } +miden-utils-diagnostics = { path = "./crates/utils-diagnostics", version = "0.23.0", default-features = false } +miden-utils-indexing = { path = "./crates/utils-indexing", version = "0.23.0", default-features = false } +miden-utils-sync = { path = "./crates/utils-sync", version = "0.23.0", default-features = false } miden-utils-testing = { path = "./crates/test-utils", package = "miden-test-utils" } -miden-verifier = { path = "./verifier", version = "0.22.0", default-features = false } +miden-verifier = { path = "./verifier", version = "0.23.0", default-features = false } # Miden crates miden-crypto = { version = "0.23", default-features = false } @@ -75,6 +76,9 @@ midenc-hir-type = { version = "0.5", default-features = false } # Serialization bincode = "1.3" +# Constraints to resolve duplicates +windows-sys = "0.61" + # Third-party crates criterion = { version = "0.7" } derive_more = { version = "2.0", features = ["from"] } @@ -85,11 +89,9 @@ log = { version = "0.4", default-features = false } paste = { version = "1.0", default-features = false } proptest = { version = "1.8", default-features = false, features = ["no_std", "alloc"] } proptest-derive = { version = "0.7", default-features = false } -rand = { version = "0.9", default-features = false } serde = { version = "1.0", default-features = false, features = ["alloc", "derive", "rc"] } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } serde-untagged = {version = "0.1" } -semver = { version = "1.0", default-features = false } smallvec = { version = "1.15", default-features = false, features = ["union", "const_generics", "const_new"] } syn = "1.0" tempfile = { version = "3.18", default-features = false } @@ -99,6 +101,15 @@ tracing = { version = "0.1", default-features = false, features = ["attr # WASM support getrandom = { version = "0.2", default-features = false, features = ["js"] } +loom = "0.7" +miette = { package = "miden-miette", version = "8.0", default-features = false } +num-bigint = "0.4" +pretty_assertions = { version = "1.4", default-features = false } +proc-macro2 = "1.0" +quote = "1.0" +rand_chacha = { version = "0.9", default-features = false } +rstest = "0.26" +toml = { version = "1.0", default-features = false } [workspace.lints.rust] unexpected_cfgs = { check-cfg = ['cfg(fuzzing)'], level = "warn" } diff --git a/Makefile b/Makefile index 8fac4f9457..9832fae841 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,8 @@ help: @printf " make test-prover # Test prover crate\n" @printf " make test-core-lib # Test core-lib crate\n" @printf " make test-verifier # Test verifier crate\n" + @printf " make check-constraints # Check core-lib constraint artifacts\n" + @printf " make regenerate-constraints # Regenerate core-lib constraint artifacts\n" @printf "\nExamples:\n" @printf " make test-air test=\"some_test\" # Test specific function\n" @printf " make test-fast # Fast tests (no proptests/CLI)\n" @@ -220,6 +222,14 @@ exec-avx2: ## Builds an executable with AVX2 acceleration enabled exec-sve: ## Builds an executable with SVE acceleration enabled RUSTFLAGS="-C target-feature=+sve" cargo build --profile optimized $(FEATURES_CONCURRENT_EXEC) +.PHONY: regenerate-constraints +regenerate-constraints: ## Regenerate core-lib constraint artifacts + cargo run --package miden-core-lib --features constraints-tools --bin regenerate-constraints -- --write + +.PHONY: check-constraints +check-constraints: ## Check core-lib constraint artifacts for drift + cargo run --package miden-core-lib --features constraints-tools --bin regenerate-constraints -- --check + .PHONY: exec-info exec-info: ## Builds an executable with log tree enabled cargo build --profile optimized $(FEATURES_LOG_TREE) diff --git a/air/Cargo.toml b/air/Cargo.toml index 8b8d1d3a3a..1243735a7a 100644 --- a/air/Cargo.toml +++ b/air/Cargo.toml @@ -25,6 +25,7 @@ testing = [] [dependencies] # Miden dependencies +miden-ace-codegen.workspace = true miden-core.workspace = true miden-crypto.workspace = true miden-utils-indexing.workspace = true @@ -34,4 +35,6 @@ thiserror.workspace = true tracing.workspace = true [dev-dependencies] +insta.workspace = true +miden-ace-codegen = { workspace = true, features = ["testing"] } proptest.workspace = true diff --git a/air/src/ace.rs b/air/src/ace.rs new file mode 100644 index 0000000000..16f7d85083 --- /dev/null +++ b/air/src/ace.rs @@ -0,0 +1,306 @@ +//! ACE circuit integration for ProcessorAir. +//! +//! This module contains: +//! - Batching types and functions (`MessageElement`, `ReducedAuxBatchConfig`, +//! `batch_reduced_aux_values`) that extend a constraint check DAG with the auxiliary trace +//! boundary checks. +//! - The AIR-specific `reduced_aux_batch_config()` that describes the Miden VM's auxiliary trace +//! boundary checks. +//! - The convenience function `build_batched_ace_circuit()` that builds the full batched circuit in +//! one call. +//! +//! The formula checked by the batched circuit is: +//! `constraint_check + gamma * product_check + gamma^2 * sum_check = 0` + +use alloc::vec::Vec; + +use miden_ace_codegen::{ + AceCircuit, AceConfig, AceDag, AceError, DagBuilder, InputKey, NodeId, build_ace_dag_for_air, +}; +use miden_core::{Felt, field::ExtensionField}; +use miden_crypto::{ + field::Algebra, + stark::air::{LiftedAir, symbolic::SymbolicExpressionExt}, +}; + +use crate::trace; + +// BATCHING TYPES +// ================================================================================================ + +/// An element in a bus message encoding. +/// +/// Bus messages are encoded as `alpha + sum(beta^i * elements[i])` using the +/// aux randomness challenges. Each element is either a constant base-field value +/// or a reference to a fixed-length public input. +#[derive(Debug, Clone)] +pub enum MessageElement { + /// A constant base-field value. + Constant(Felt), + /// A fixed-length public input value, indexed into the public values array. + PublicInput(usize), +} + +/// A multiplicative factor in the product check. +/// +/// The product check verifies: +/// `product(numerator) - product(denominator) = 0` +#[derive(Debug, Clone)] +pub enum ProductFactor { + /// Claimed final value of an auxiliary trace column, by column index. + BusBoundary(usize), + /// A bus message computed from its elements as `bus_prefix[bus] + sum(beta^i * elements[i])`. + /// The first field is the bus type index (see `trace::bus_types`). + Message(usize, Vec), + /// Multiset product reduced from variable-length public inputs, by group index. + Vlpi(usize), +} + +/// Configuration for building the reduced_aux_values batching in the ACE DAG. +/// +/// Describes the auxiliary trace boundary checks (product_check and sum_check). +/// Constructed by AIR-specific code (see [`reduced_aux_batch_config`]) and +/// consumed by [`batch_reduced_aux_values`]. +/// +/// The product check verifies: +/// `product(numerator) - product(denominator) = 0` +#[derive(Debug, Clone)] +pub struct ReducedAuxBatchConfig { + /// Factors multiplied into the numerator of the product check. + pub numerator: Vec, + /// Factors multiplied into the denominator of the product check. + pub denominator: Vec, + /// Auxiliary trace column indices whose claimed final values are summed in the sum check. + pub sum_columns: Vec, +} + +// BATCHING FUNCTIONS +// ================================================================================================ + +/// Extend an existing constraint DAG with auxiliary trace boundary checks. +/// +/// Takes the constraint DAG and appends the running-product identity check +/// (product_check) and the LogUp sum check (sum_check), combining all three +/// checks into a single root with gamma: +/// +/// `root = constraint_check + gamma * product_check + gamma^2 * sum_check` +/// +/// Returns the new DAG with the batched root. +pub fn batch_reduced_aux_values( + constraint_dag: AceDag, + config: &ReducedAuxBatchConfig, +) -> AceDag +where + EF: ExtensionField, +{ + let constraint_root = constraint_dag.root; + let mut builder = DagBuilder::from_dag(constraint_dag); + + // Build product_check. + let product_check = build_product_check(&mut builder, config); + + // Build sum_check. + let sum_check = build_sum_check(&mut builder, config); + + // Batch: root = constraint_check + gamma * product_check + gamma^2 * sum_check + let gamma = builder.input(InputKey::Gamma); + let gamma2 = builder.mul(gamma, gamma); + let term2 = builder.mul(gamma, product_check); + let term3 = builder.mul(gamma2, sum_check); + let partial = builder.add(constraint_root, term2); + let root = builder.add(partial, term3); + + builder.build(root) +} + +/// Build the running-product identity check. +fn build_product_check(builder: &mut DagBuilder, config: &ReducedAuxBatchConfig) -> NodeId +where + EF: ExtensionField, +{ + let numerator = build_product(builder, &config.numerator); + let denominator = build_product(builder, &config.denominator); + builder.sub(numerator, denominator) +} + +/// Build a product of factors as a single DAG node. +fn build_product(builder: &mut DagBuilder, factors: &[ProductFactor]) -> NodeId +where + EF: ExtensionField, +{ + let mut acc = builder.constant(EF::ONE); + for factor in factors { + let node = match factor { + ProductFactor::BusBoundary(idx) => builder.input(InputKey::AuxBusBoundary(*idx)), + ProductFactor::Message(bus, elements) => encode_bus_message(builder, *bus, elements), + ProductFactor::Vlpi(idx) => builder.input(InputKey::VlpiReduction(*idx)), + }; + acc = builder.mul(acc, node); + } + acc +} + +/// Build the LogUp sum check (sum_check). +/// +/// Verifies that the LogUp auxiliary columns sum to zero at the boundary. +fn build_sum_check(builder: &mut DagBuilder, config: &ReducedAuxBatchConfig) -> NodeId +where + EF: ExtensionField, +{ + let mut sum = builder.constant(EF::ZERO); + for &col_idx in &config.sum_columns { + let col = builder.input(InputKey::AuxBusBoundary(col_idx)); + sum = builder.add(sum, col); + } + sum +} + +/// Encode a bus message as `bus_prefix[bus] + sum(beta^i * elements[i])`. +/// +/// The bus prefix provides domain separation: `bus_prefix[bus] = alpha + (bus+1) * gamma` +/// where `gamma = beta^MAX_MESSAGE_WIDTH`. This matches [`trace::Challenges::encode`]. +fn encode_bus_message( + builder: &mut DagBuilder, + bus: usize, + elements: &[MessageElement], +) -> NodeId +where + EF: ExtensionField, +{ + let alpha = builder.input(InputKey::AuxRandAlpha); + let beta = builder.input(InputKey::AuxRandBeta); + + // Compute gamma = beta^MAX_MESSAGE_WIDTH. + let mut gamma = builder.constant(EF::ONE); + for _ in 0..trace::MAX_MESSAGE_WIDTH { + gamma = builder.mul(gamma, beta); + } + + // bus_prefix = alpha + (bus + 1) * gamma + let scale = builder.constant(EF::from(Felt::from_u32((bus as u32) + 1))); + let offset = builder.mul(gamma, scale); + let bus_prefix = builder.add(alpha, offset); + + // acc = bus_prefix + sum(beta^i * elem_i) + // + // Beta powers are built incrementally. The DagBuilder is hash-consed, so + // identical beta^i nodes across multiple message encodings are shared + // automatically. + let mut acc = bus_prefix; + let mut beta_power = builder.constant(EF::ONE); + for elem in elements { + let node = match elem { + MessageElement::Constant(f) => builder.constant(EF::from(*f)), + MessageElement::PublicInput(idx) => builder.input(InputKey::Public(*idx)), + }; + let term = builder.mul(beta_power, node); + acc = builder.add(acc, term); + beta_power = builder.mul(beta_power, beta); + } + acc +} + +// AIR-SPECIFIC CONFIG +// ================================================================================================ + +/// Build the [`ReducedAuxBatchConfig`] for the Miden VM ProcessorAir. +/// +/// This encodes the `reduced_aux_values` formula in the Miden VM AIR. +pub fn reduced_aux_batch_config() -> ReducedAuxBatchConfig { + use MessageElement::{Constant, PublicInput}; + use ProductFactor::{BusBoundary, Message, Vlpi}; + use trace::bus_types; + + // Aux boundary column indices. + let p1 = trace::DECODER_AUX_TRACE_OFFSET; + let p2 = trace::DECODER_AUX_TRACE_OFFSET + 1; + let p3 = trace::DECODER_AUX_TRACE_OFFSET + 2; + let s_aux = trace::STACK_AUX_TRACE_OFFSET; + let b_range = trace::RANGE_CHECK_AUX_TRACE_OFFSET; + let b_hash_kernel = trace::HASH_KERNEL_VTABLE_AUX_TRACE_OFFSET; + let b_chiplets = trace::CHIPLETS_BUS_AUX_TRACE_OFFSET; + let v_wiring = trace::ACE_CHIPLET_WIRING_BUS_OFFSET; + + // Public input layout offsets. + // [0..4] program hash, [4..20] stack inputs, [20..36] stack outputs, [36..40] transcript state + let pv_program_hash = super::PV_PROGRAM_HASH; + let pv_transcript_state = super::PV_TRANSCRIPT_STATE; + + // Bus message constants. + let log_precompile_label = Felt::from_u8(trace::LOG_PRECOMPILE_LABEL); + + // ph_msg = encode([0, ph[0], ph[1], ph[2], ph[3], 0, 0]) + // Matches program_hash_message() in lib.rs. + let ph_msg = vec![ + Constant(Felt::ZERO), // parent_id = 0 + PublicInput(pv_program_hash), // hash[0] + PublicInput(pv_program_hash + 1), // hash[1] + PublicInput(pv_program_hash + 2), // hash[2] + PublicInput(pv_program_hash + 3), // hash[3] + Constant(Felt::ZERO), // is_first_child = false + Constant(Felt::ZERO), // is_loop_body = false + ]; + + // default_msg = encode([LOG_PRECOMPILE_LABEL, 0, 0, 0, 0]) + // Matches transcript_message(challenges, PrecompileTranscriptState::default()). + let default_msg = vec![ + Constant(log_precompile_label), + Constant(Felt::ZERO), + Constant(Felt::ZERO), + Constant(Felt::ZERO), + Constant(Felt::ZERO), + ]; + + // final_msg = encode([LOG_PRECOMPILE_LABEL, ts[0], ts[1], ts[2], ts[3]]) + // Matches transcript_message(challenges, pc_transcript_state). + let final_msg = vec![ + Constant(log_precompile_label), + PublicInput(pv_transcript_state), + PublicInput(pv_transcript_state + 1), + PublicInput(pv_transcript_state + 2), + PublicInput(pv_transcript_state + 3), + ]; + + // product_check: product(numerator) - product(denominator) = 0 + // sum_check: sum(sum_columns) = 0 + ReducedAuxBatchConfig { + numerator: vec![ + BusBoundary(p1), + BusBoundary(p2), + BusBoundary(p3), + BusBoundary(s_aux), + BusBoundary(b_hash_kernel), + BusBoundary(b_chiplets), + Message(bus_types::BLOCK_HASH_TABLE, ph_msg), + Message(bus_types::LOG_PRECOMPILE_TRANSCRIPT, default_msg), + ], + denominator: vec![Message(bus_types::LOG_PRECOMPILE_TRANSCRIPT, final_msg), Vlpi(0)], + sum_columns: vec![b_range, v_wiring], + } +} + +// CONVENIENCE FUNCTION +// ================================================================================================ + +/// Build a batched ACE circuit for the provided AIR. +/// +/// This is the highest-level entry point for building the ACE circuit for Miden VM AIR. +/// It builds the constraint-evaluation DAG, extends it with the auxiliary trace +/// boundary checks and emits the off-VM circuit representation. +/// +/// The output circuit checks: +/// `constraint_check + gamma * product_check + gamma^2 * sum_check = 0` +pub fn build_batched_ace_circuit( + air: &A, + config: AceConfig, + batch_config: &ReducedAuxBatchConfig, +) -> Result, AceError> +where + A: LiftedAir, + EF: ExtensionField, + SymbolicExpressionExt: Algebra, +{ + let artifacts = build_ace_dag_for_air::(air, config)?; + let batched_dag = batch_reduced_aux_values(artifacts.dag, batch_config); + miden_ace_codegen::emit_circuit(&batched_dag, artifacts.layout) +} diff --git a/air/src/config.rs b/air/src/config.rs index 58cd2d1a66..ee16c29448 100644 --- a/air/src/config.rs +++ b/air/src/config.rs @@ -9,37 +9,59 @@ use miden_core::{Felt, field::QuadFelt}; use miden_crypto::{ field::Field, hash::{ - blake::Blake3Hasher, keccak::Keccak256Hash, poseidon2::Poseidon2Permutation256, - rpo::RpoPermutation256, rpx::RpxPermutation256, + blake::Blake3Hasher, + keccak::{Keccak256Hash, KeccakF, VECTOR_LEN}, + poseidon2::Poseidon2Permutation256, + rpo::RpoPermutation256, + rpx::RpxPermutation256, }, stark::{ GenericStarkConfig, - challenger::{DuplexChallenger, HashChallenger, SerializingChallenger64}, + challenger::{CanObserve, DuplexChallenger, HashChallenger, SerializingChallenger64}, dft::Radix2DitParallel, fri::PcsParams, - hasher::{ChainingHasher, StatefulSponge}, + hasher::{ChainingHasher, SerializingStatefulSponge, StatefulSponge}, lmcs::LmcsConfig, - symmetric::{CompressionFunctionFromHasher, TruncatedPermutation}, + symmetric::{ + CompressionFunctionFromHasher, CryptographicPermutation, PaddingFreeSponge, + TruncatedPermutation, + }, }, }; +// SHARED TYPES +// ================================================================================================ + +/// Miden VM STARK configuration with pre-filled common type parameters. +/// +/// All Miden configurations use `Felt` as the base field, `QuadFelt` as the extension field, +/// and `Radix2DitParallel` as the DFT. Only the LMCS commitment scheme (`L`) and +/// Fiat-Shamir challenger (`Ch`) vary by hash function. +pub type MidenStarkConfig = + GenericStarkConfig, Ch>; + +type PackedFelt = ::Packing; + +/// Number of inputs to the Merkle compression function. +const COMPRESSION_INPUTS: usize = 2; + // PCS PARAMETERS // ================================================================================================ /// Log2 of the FRI blowup factor (blowup = 8). const LOG_BLOWUP: u8 = 3; /// Log2 of the FRI folding arity (arity = 4). -const LOG_FOLDING_ARITY: u8 = 2; +pub const LOG_FOLDING_ARITY: u8 = 2; /// Log2 of the final polynomial degree (degree = 128). const LOG_FINAL_DEGREE: u8 = 7; /// Proof-of-work bits for FRI folding challenges. -const FOLDING_POW_BITS: usize = 16; +pub const FOLDING_POW_BITS: usize = 4; /// Proof-of-work bits for DEEP composition polynomial. -const DEEP_POW_BITS: usize = 0; +pub const DEEP_POW_BITS: usize = 12; /// Number of FRI query repetitions. const NUM_QUERIES: usize = 27; /// Proof-of-work bits for query phase. -const QUERY_POW_BITS: usize = 0; +const QUERY_POW_BITS: usize = 16; /// Default PCS parameters shared by all hash function configurations. pub fn pcs_params() -> PcsParams { @@ -55,17 +77,80 @@ pub fn pcs_params() -> PcsParams { .expect("invalid PCS parameters") } -// HASH FUNCTION PARAMETERS +// DOMAIN-SEPARATED FIAT-SHAMIR TRANSCRIPT // ================================================================================================ -// Byte-oriented hashes (Blake3, Keccak). +/// RELATION_DIGEST = Poseidon2::hash_elements([PROTOCOL_ID, CIRCUIT_COMMITMENT]). +/// +/// Compile-time constant binding the Fiat-Shamir transcript to the Miden VM AIR. +/// Must match the constants in `crates/lib/core/asm/sys/vm/mod.masm`. +pub const RELATION_DIGEST: [Felt; 4] = [ + Felt::new(7682526984894530630), + Felt::new(13019009422810970716), + Felt::new(16037978224454945133), + Felt::new(1332031755710493241), +]; -/// Digest size in bytes for byte-oriented hashes. -const BYTE_DIGEST_SIZE: usize = 32; -/// Number of inputs to the Merkle compression function. -const COMPRESSION_INPUTS: usize = 2; +/// Observes PCS protocol parameters and per-proof trace height into the challenger. +/// +/// Call on a challenger obtained from `config.challenger()` to complete the +/// domain-separated transcript initialization. The config factories already bind +/// RELATION_DIGEST into the prototype challenger; this function adds the remaining +/// protocol parameters and per-proof trace height. +pub fn observe_protocol_params(challenger: &mut impl CanObserve, log_trace_height: u64) { + // Batch 1: PCS parameters, zero-padded to SPONGE_RATE. + challenger.observe(Felt::new(NUM_QUERIES as u64)); + challenger.observe(Felt::new(QUERY_POW_BITS as u64)); + challenger.observe(Felt::new(DEEP_POW_BITS as u64)); + challenger.observe(Felt::new(FOLDING_POW_BITS as u64)); + challenger.observe(Felt::new(LOG_BLOWUP as u64)); + challenger.observe(Felt::new(LOG_FINAL_DEGREE as u64)); + challenger.observe(Felt::new(1_u64 << LOG_FOLDING_ARITY)); + challenger.observe(Felt::ZERO); -// Algebraic hashes (RPO, Poseidon2, RPX). + // Batch 2: per-proof trace height, zero-padded to SPONGE_RATE. + challenger.observe(Felt::new(log_trace_height)); + for _ in 1..SPONGE_RATE { + challenger.observe(Felt::ZERO); + } +} + +/// Absorbs variable-length public inputs into the challenger. +/// +/// Each VLPI group is a flat slice of fixed-width messages. `message_widths[i]` gives the +/// width of each message in group `i`. Every message is zero-padded to the next multiple +/// of `SPONGE_RATE` and reversed before observation, matching the layout the MASM recursive +/// verifier's `mem_stream` + `horner_eval_base` expects. +pub fn observe_var_len_public_inputs>( + challenger: &mut C, + var_len_public_inputs: &[&[Felt]], + message_widths: &[usize], +) { + assert_eq!( + var_len_public_inputs.len(), + message_widths.len(), + "must provide one message width per VLPI group" + ); + for (group, &msg_width) in var_len_public_inputs.iter().zip(message_widths) { + assert!(msg_width > 0, "VLPI message width must be positive"); + let padded_width = msg_width.next_multiple_of(SPONGE_RATE); + for message in group.chunks(msg_width) { + assert_eq!( + message.len(), + msg_width, + "VLPI group has trailing elements that don't form a complete message" + ); + let mut padded = vec![Felt::ZERO; padded_width]; + for (i, &elem) in message.iter().enumerate() { + padded[padded_width - 1 - i] = elem; + } + challenger.observe_slice(&padded); + } + } +} + +// ALGEBRAIC HASHES (RPO, Poseidon2, RPX) +// ================================================================================================ /// Sponge state width in field elements. const SPONGE_WIDTH: usize = 12; @@ -73,32 +158,8 @@ const SPONGE_WIDTH: usize = 12; const SPONGE_RATE: usize = 8; /// Sponge digest width in field elements. const DIGEST_WIDTH: usize = 4; - -// SHARED TYPE ALIASES -// ================================================================================================ - -type PackedFelt = ::Packing; - -/// Miden VM STARK configuration with pre-filled common type parameters. -/// -/// All Miden configurations use `Felt` as the base field, `QuadFelt` as the extension field, -/// and `Radix2DitParallel` as the DFT. Only the LMCS commitment scheme (`L`) and -/// Fiat-Shamir challenger (`Ch`) vary by hash function. -pub type MidenStarkConfig = - GenericStarkConfig, Ch>; - -/// Byte-oriented LMCS (for Blake3, Keccak). -type ByteLmcs = LmcsConfig< - Felt, - u8, - ChainingHasher, - CompressionFunctionFromHasher, - BYTE_DIGEST_SIZE, - BYTE_DIGEST_SIZE, ->; - -/// Byte-oriented challenger (for Blake3, Keccak). -type ByteChallenger = SerializingChallenger64>; +/// Range of capacity slots within the sponge state array. +const CAPACITY_RANGE: core::ops::Range = SPONGE_RATE..SPONGE_WIDTH; /// Algebraic LMCS (for RPO, Poseidon2, RPX). type AlgLmcs

= LmcsConfig< @@ -113,57 +174,178 @@ type AlgLmcs

= LmcsConfig< /// Algebraic duplex challenger (for RPO, Poseidon2, RPX). type AlgChallenger

= DuplexChallenger; -// CONFIGURATION FACTORIES -// ================================================================================================ - -/// Creates a Blake3_256-based STARK configuration. -pub fn blake3_256_config( - params: PcsParams, -) -> MidenStarkConfig, ByteChallenger> { - let lmcs = LmcsConfig::new( - ChainingHasher::new(Blake3Hasher), - CompressionFunctionFromHasher::new(Blake3Hasher), - ); - let challenger = SerializingChallenger64::from_hasher(vec![], Blake3Hasher); - GenericStarkConfig::new(params, lmcs, Radix2DitParallel::default(), challenger) -} - -/// Creates a Keccak-based STARK configuration. -pub fn keccak_config( - params: PcsParams, -) -> MidenStarkConfig, ByteChallenger> { - let hash = Keccak256Hash {}; - let lmcs = LmcsConfig::new(ChainingHasher::new(hash), CompressionFunctionFromHasher::new(hash)); - let challenger = SerializingChallenger64::from_hasher(vec![], hash); - GenericStarkConfig::new(params, lmcs, Radix2DitParallel::default(), challenger) -} +/// Concrete STARK configuration type for Poseidon2. +pub type Poseidon2Config = + MidenStarkConfig, AlgChallenger>; /// Creates an RPO-based STARK configuration. pub fn rpo_config( params: PcsParams, ) -> MidenStarkConfig, AlgChallenger> { - let perm = RpoPermutation256; - let lmcs = LmcsConfig::new(StatefulSponge::new(perm), TruncatedPermutation::new(perm)); - let challenger = DuplexChallenger::new(perm); - GenericStarkConfig::new(params, lmcs, Radix2DitParallel::default(), challenger) + alg_config(params, RpoPermutation256) } /// Creates a Poseidon2-based STARK configuration. pub fn poseidon2_config( params: PcsParams, ) -> MidenStarkConfig, AlgChallenger> { - let perm = Poseidon2Permutation256; - let lmcs = LmcsConfig::new(StatefulSponge::new(perm), TruncatedPermutation::new(perm)); - let challenger = DuplexChallenger::new(perm); - GenericStarkConfig::new(params, lmcs, Radix2DitParallel::default(), challenger) + alg_config(params, Poseidon2Permutation256) } /// Creates an RPX-based STARK configuration. pub fn rpx_config( params: PcsParams, ) -> MidenStarkConfig, AlgChallenger> { - let perm = RpxPermutation256; + alg_config(params, RpxPermutation256) +} + +/// Internal helper: builds an algebraic STARK configuration from a permutation. +/// +/// The prototype challenger has RELATION_DIGEST pre-loaded in the sponge capacity. +/// When `observe_protocol_params` is called, the first duplexing permutes this +/// capacity together with the PCS parameters written into the rate. +fn alg_config

(params: PcsParams, perm: P) -> MidenStarkConfig, AlgChallenger

> +where + P: CryptographicPermutation<[Felt; SPONGE_WIDTH]> + Copy, +{ let lmcs = LmcsConfig::new(StatefulSponge::new(perm), TruncatedPermutation::new(perm)); - let challenger = DuplexChallenger::new(perm); + let mut state = [Felt::ZERO; SPONGE_WIDTH]; + state[CAPACITY_RANGE].copy_from_slice(&RELATION_DIGEST); + let challenger = DuplexChallenger { + sponge_state: state, + input_buffer: vec![], + output_buffer: vec![], + permutation: perm, + }; GenericStarkConfig::new(params, lmcs, Radix2DitParallel::default(), challenger) } + +// BLAKE3 +// ================================================================================================ + +/// Digest size in bytes for Blake3. +const BLAKE_DIGEST_SIZE: usize = 32; + +/// Blake3 LMCS. +type BlakeLmcs = LmcsConfig< + Felt, + u8, + ChainingHasher, + CompressionFunctionFromHasher, + BLAKE_DIGEST_SIZE, + BLAKE_DIGEST_SIZE, +>; + +/// Blake3 challenger. +type BlakeChallenger = + SerializingChallenger64>; + +/// Creates a Blake3_256-based STARK configuration. +pub fn blake3_256_config(params: PcsParams) -> MidenStarkConfig { + let lmcs = LmcsConfig::new( + ChainingHasher::new(Blake3Hasher), + CompressionFunctionFromHasher::new(Blake3Hasher), + ); + let mut challenger = SerializingChallenger64::from_hasher(vec![], Blake3Hasher); + challenger.observe_slice(&RELATION_DIGEST); + GenericStarkConfig::new(params, lmcs, Radix2DitParallel::default(), challenger) +} + +// KECCAK +// ================================================================================================ + +/// Keccak permutation state width (in u64 elements). +const KECCAK_WIDTH: usize = 25; +/// Keccak sponge rate (absorbable u64 elements per permutation). +const KECCAK_RATE: usize = 17; +/// Keccak digest width (in u64 elements). +const KECCAK_DIGEST: usize = 4; +/// Keccak-256 digest size in bytes (for the Fiat-Shamir challenger). +const KECCAK_CHALLENGER_DIGEST_SIZE: usize = 32; + +/// Keccak MMCS sponge (padding-free, used for compression). +type KeccakMmcsSponge = PaddingFreeSponge; + +/// Keccak LMCS using the stateful binary sponge with `[Felt; VECTOR_LEN]` packing. +type KeccakLmcs = LmcsConfig< + [Felt; VECTOR_LEN], + [u64; VECTOR_LEN], + SerializingStatefulSponge>, + CompressionFunctionFromHasher, + KECCAK_WIDTH, + KECCAK_DIGEST, +>; + +/// Keccak challenger. +type KeccakChallenger = + SerializingChallenger64>; + +/// Creates a Keccak-based STARK configuration. +/// +/// Uses the stateful binary sponge with the Keccak permutation and `[Felt; VECTOR_LEN]` packing +/// for SIMD parallelization. +pub fn keccak_config(params: PcsParams) -> MidenStarkConfig { + let mmcs_sponge = KeccakMmcsSponge::new(KeccakF {}); + let compress = CompressionFunctionFromHasher::new(mmcs_sponge); + let sponge = SerializingStatefulSponge::new(StatefulSponge::new(KeccakF {})); + let lmcs = LmcsConfig::new(sponge, compress); + let mut challenger = SerializingChallenger64::from_hasher(vec![], Keccak256Hash {}); + challenger.observe_slice(&RELATION_DIGEST); + GenericStarkConfig::new(params, lmcs, Radix2DitParallel::default(), challenger) +} + +#[cfg(test)] +mod tests { + extern crate alloc; + use alloc::vec::Vec; + + use miden_ace_codegen::{AceConfig, LayoutKind}; + use miden_core::{Felt, crypto::hash::Poseidon2, field::QuadFelt}; + + use crate::{ProcessorAir, ace}; + + const PROTOCOL_ID: u64 = 0; + const REGEN_HINT: &str = "cargo run -p miden-core-lib --features constraints-tools --bin regenerate-constraints -- --write"; + + /// Snapshot test: catches any AIR change that alters the constraint circuit. + /// + /// If this test fails, regenerate with: + /// cargo run -p miden-core-lib --features constraints-tools --bin regenerate-constraints -- + /// --write + #[test] + fn relation_digest_matches_current_air() { + let config = AceConfig { + num_quotient_chunks: 8, + num_vlpi_groups: 1, + layout: LayoutKind::Masm, + }; + let air = ProcessorAir; + let batch_config = ace::reduced_aux_batch_config(); + let circuit = + ace::build_batched_ace_circuit::<_, QuadFelt>(&air, config, &batch_config).unwrap(); + let encoded = circuit.to_ace().unwrap(); + let circuit_commitment: [Felt; 4] = encoded.circuit_hash().into(); + + let input: Vec = core::iter::once(Felt::new(PROTOCOL_ID)) + .chain(circuit_commitment.iter().copied()) + .collect(); + let digest = Poseidon2::hash_elements(&input); + let expected: Vec = + digest.as_elements().iter().map(|f| f.as_canonical_u64()).collect(); + + let snapshot = format!( + "num_inputs: {}\nnum_eval_gates: {}\nrelation_digest: {:?}", + encoded.num_vars(), + encoded.num_eval_rows(), + expected, + ); + insta::assert_snapshot!(snapshot); + + let actual: Vec = + super::RELATION_DIGEST.iter().map(|f| f.as_canonical_u64()).collect(); + assert_eq!( + actual, expected, + "RELATION_DIGEST in config.rs is stale. Regenerate with: {REGEN_HINT}" + ); + } +} diff --git a/air/src/constraints/bus.rs b/air/src/constraints/bus.rs index 12dfd65b10..a6183d3e0c 100644 --- a/air/src/constraints/bus.rs +++ b/air/src/constraints/bus.rs @@ -10,7 +10,6 @@ //! - v_wiring (ACE wiring LogUp) /// Auxiliary trace column indices. -#[allow(dead_code)] pub mod indices { /// Block stack table (decoder control flow) pub const P1_BLOCK_STACK: usize = 0; diff --git a/air/src/constraints/chiplets/ace.rs b/air/src/constraints/chiplets/ace.rs index 35279ed6f2..e8c4bab43a 100644 --- a/air/src/constraints/chiplets/ace.rs +++ b/air/src/constraints/chiplets/ace.rs @@ -28,465 +28,183 @@ //! | m0 | Wire bus multiplicity for node 0 | use miden_core::field::PrimeCharacteristicRing; +use miden_crypto::stark::air::AirBuilder; -use super::selectors::{ace_chiplet_flag, memory_chiplet_flag}; +use super::selectors::ChipletFlags; use crate::{ - Felt, MainTraceRow, - constraints::tagging::{TagGroup, TaggingAirBuilderExt, tagged_assert_zero_integrity}, - trace::chiplets::ace::{ - CLK_IDX, CTX_IDX, EVAL_OP_IDX, ID_0_IDX, ID_1_IDX, PTR_IDX, READ_NUM_EVAL_IDX, - SELECTOR_BLOCK_IDX, SELECTOR_START_IDX, V_0_0_IDX, V_0_1_IDX, V_1_0_IDX, V_1_1_IDX, - V_2_0_IDX, V_2_1_IDX, + MainCols, MidenAirBuilder, + constraints::{ + constants::{F_1, F_4}, + ext_field::{QuadFeltAirBuilder, QuadFeltExpr}, + utils::BoolNot, }, }; -// CONSTANTS -// ================================================================================================ - -// ACE chiplet offset from CHIPLETS_OFFSET (after s0, s1, s2, s3). -const ACE_OFFSET: usize = 4; - -// TAGGING IDS -// ================================================================================================ - -const ACE_BASE_ID: usize = super::memory::MEMORY_BASE_ID + super::memory::MEMORY_COUNT; -pub(super) const ACE_COUNT: usize = 20; - -const ACE_BINARY_BASE_ID: usize = ACE_BASE_ID; -const ACE_SECTION_BASE_ID: usize = ACE_BASE_ID + 2; -const ACE_WITHIN_SECTION_BASE_ID: usize = ACE_BASE_ID + 7; -const ACE_READ_ID_ID: usize = ACE_BASE_ID + 11; -const ACE_READ_TO_EVAL_ID: usize = ACE_BASE_ID + 12; -const ACE_EVAL_OP_ID: usize = ACE_BASE_ID + 13; -const ACE_EVAL_RESULT_BASE_ID: usize = ACE_BASE_ID + 14; -const ACE_FINAL_BASE_ID: usize = ACE_BASE_ID + 16; -const ACE_FIRST_ROW_ID: usize = ACE_BASE_ID + 19; - -const ACE_BINARY_NAMESPACE: &str = "chiplets.ace.selector.binary"; -const ACE_SECTION_NAMESPACE: &str = "chiplets.ace.section.flags"; -const ACE_WITHIN_SECTION_NAMESPACE: &str = "chiplets.ace.section.transition"; -const ACE_READ_ID_NAMESPACE: &str = "chiplets.ace.read.ids"; -const ACE_READ_TO_EVAL_NAMESPACE: &str = "chiplets.ace.read.to_eval"; -const ACE_EVAL_OP_NAMESPACE: &str = "chiplets.ace.eval.op"; -const ACE_EVAL_RESULT_NAMESPACE: &str = "chiplets.ace.eval.result"; -const ACE_FINAL_NAMESPACE: &str = "chiplets.ace.final.zero"; -const ACE_FIRST_ROW_NAMESPACE: &str = "chiplets.ace.first_row.start"; - -const ACE_BINARY_NAMES: [&str; 2] = [ACE_BINARY_NAMESPACE; 2]; -const ACE_SECTION_NAMES: [&str; 5] = [ACE_SECTION_NAMESPACE; 5]; -const ACE_WITHIN_SECTION_NAMES: [&str; 4] = [ACE_WITHIN_SECTION_NAMESPACE; 4]; -const ACE_READ_ID_NAMES: [&str; 1] = [ACE_READ_ID_NAMESPACE; 1]; -const ACE_READ_TO_EVAL_NAMES: [&str; 1] = [ACE_READ_TO_EVAL_NAMESPACE; 1]; -const ACE_EVAL_OP_NAMES: [&str; 1] = [ACE_EVAL_OP_NAMESPACE; 1]; -const ACE_EVAL_RESULT_NAMES: [&str; 2] = [ACE_EVAL_RESULT_NAMESPACE; 2]; -const ACE_FINAL_NAMES: [&str; 3] = [ACE_FINAL_NAMESPACE; 3]; -const ACE_FIRST_ROW_NAMES: [&str; 1] = [ACE_FIRST_ROW_NAMESPACE; 1]; - -const ACE_BINARY_TAGS: TagGroup = TagGroup { - base: ACE_BINARY_BASE_ID, - names: &ACE_BINARY_NAMES, -}; -const ACE_SECTION_TAGS: TagGroup = TagGroup { - base: ACE_SECTION_BASE_ID, - names: &ACE_SECTION_NAMES, -}; -const ACE_WITHIN_SECTION_TAGS: TagGroup = TagGroup { - base: ACE_WITHIN_SECTION_BASE_ID, - names: &ACE_WITHIN_SECTION_NAMES, -}; -const ACE_READ_ID_TAGS: TagGroup = TagGroup { - base: ACE_READ_ID_ID, - names: &ACE_READ_ID_NAMES, -}; -const ACE_READ_TO_EVAL_TAGS: TagGroup = TagGroup { - base: ACE_READ_TO_EVAL_ID, - names: &ACE_READ_TO_EVAL_NAMES, -}; -const ACE_EVAL_OP_TAGS: TagGroup = TagGroup { - base: ACE_EVAL_OP_ID, - names: &ACE_EVAL_OP_NAMES, -}; -const ACE_EVAL_RESULT_TAGS: TagGroup = TagGroup { - base: ACE_EVAL_RESULT_BASE_ID, - names: &ACE_EVAL_RESULT_NAMES, -}; -const ACE_FINAL_TAGS: TagGroup = TagGroup { - base: ACE_FINAL_BASE_ID, - names: &ACE_FINAL_NAMES, -}; -const ACE_FIRST_ROW_TAGS: TagGroup = TagGroup { - base: ACE_FIRST_ROW_ID, - names: &ACE_FIRST_ROW_NAMES, -}; - // ENTRY POINTS // ================================================================================================ -/// Enforce ACE chiplet constraints with transition handling. -pub fn enforce_ace_constraints( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, -) where - AB: TaggingAirBuilderExt, -{ - // Load selectors - let s0: AB::Expr = local.chiplets[0].clone().into(); - let s1: AB::Expr = local.chiplets[1].clone().into(); - let s2: AB::Expr = local.chiplets[2].clone().into(); - let s2_next: AB::Expr = next.chiplets[2].clone().into(); - let s3_next: AB::Expr = next.chiplets[3].clone().into(); - - // Gate transition constraints by is_transition() to avoid last-row issues - let is_transition: AB::Expr = builder.is_transition(); - - // ACE constraints on all rows (already internally gated) - enforce_ace_constraints_all_rows(builder, local, next); - - // ACE first row constraints (transitioning from memory to ACE) - // Flag: current row is memory (s0*s1*!s2), next row is ACE (s2'=1 AND s3'=0) - // The s3'=0 check is critical because: - // 1. A trace may skip ACE entirely (going memory -> kernel ROM) - // 2. When not in ACE, chiplets[4] is s4 (selector), not sstart - // 3. Without the s3'=0 check, we'd read the wrong column - // Must be gated by is_transition since it accesses next-row values - let memory_flag = memory_chiplet_flag(s0, s1, s2); - // ace_next = s2' * !s3' - let ace_next = s2_next * (AB::Expr::ONE - s3_next); - let flag_next_row_first_ace = is_transition * memory_flag * ace_next; - enforce_ace_constraints_first_row(builder, local, next, flag_next_row_first_ace); -} - /// Enforce ACE chiplet constraints that apply to all rows. pub fn enforce_ace_constraints_all_rows( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, + flags: &ChipletFlags, ) where - AB: TaggingAirBuilderExt, + AB: MidenAirBuilder, { - // Compute ACE active flag from top-level selectors - let s0: AB::Expr = local.chiplets[0].clone().into(); - let s1: AB::Expr = local.chiplets[1].clone().into(); - let s2: AB::Expr = local.chiplets[2].clone().into(); - let s3: AB::Expr = local.chiplets[3].clone().into(); - let s3_next: AB::Expr = next.chiplets[3].clone().into(); - - let ace_flag = ace_chiplet_flag(s0.clone(), s1.clone(), s2.clone(), s3.clone()); - - // Load ACE columns - let sstart: AB::Expr = load_ace_col::(local, SELECTOR_START_IDX); - let sstart_next: AB::Expr = load_ace_col::(next, SELECTOR_START_IDX); - let sblock: AB::Expr = load_ace_col::(local, SELECTOR_BLOCK_IDX); - let sblock_next: AB::Expr = load_ace_col::(next, SELECTOR_BLOCK_IDX); - let ctx: AB::Expr = load_ace_col::(local, CTX_IDX); - let ctx_next: AB::Expr = load_ace_col::(next, CTX_IDX); - let ptr: AB::Expr = load_ace_col::(local, PTR_IDX); - let ptr_next: AB::Expr = load_ace_col::(next, PTR_IDX); - let clk: AB::Expr = load_ace_col::(local, CLK_IDX); - let clk_next: AB::Expr = load_ace_col::(next, CLK_IDX); - let op: AB::Expr = load_ace_col::(local, EVAL_OP_IDX); - let id0: AB::Expr = load_ace_col::(local, ID_0_IDX); - let id0_next: AB::Expr = load_ace_col::(next, ID_0_IDX); - let id1: AB::Expr = load_ace_col::(local, ID_1_IDX); - // n_eval stores (num_eval_rows - 1) so READ→EVAL switches when id0' == n_eval. - let n_eval: AB::Expr = load_ace_col::(local, READ_NUM_EVAL_IDX); - let n_eval_next: AB::Expr = load_ace_col::(next, READ_NUM_EVAL_IDX); - - let v0_0: AB::Expr = load_ace_col::(local, V_0_0_IDX); - let v0_1: AB::Expr = load_ace_col::(local, V_0_1_IDX); - let v1_0: AB::Expr = load_ace_col::(local, V_1_0_IDX); - let v1_1: AB::Expr = load_ace_col::(local, V_1_1_IDX); - let v2_0: AB::Expr = load_ace_col::(local, V_2_0_IDX); - let v2_1: AB::Expr = load_ace_col::(local, V_2_1_IDX); - - let one: AB::Expr = AB::Expr::ONE; - let four: AB::Expr = AB::Expr::from_u32(4); - - // Gate all transition constraints by is_transition() to avoid last-row issues - let is_transition: AB::Expr = builder.is_transition(); - - // ACE continuing to the next row (not transitioning out). - // Includes is_transition because it reads next-row values. - let flag_ace_next = is_transition.clone() * (one.clone() - s3_next.clone()); - // Last ACE row (next row transitions out of ACE). - // Includes is_transition because it reads next-row values. - let flag_ace_last = is_transition.clone() * s3_next.clone(); + let local = local.ace(); + let next = next.ace(); + + let ace_flag = flags.is_active.clone(); + let ace_transition = flags.is_transition.clone(); + let ace_last = flags.is_last.clone(); + + // Derived section flags + let s_start = local.s_start; + let s_start_next = next.s_start; + let s_transition = s_start_next.into().not(); + + // ========================================================================== + // FIRST ROW CONSTRAINTS + // ========================================================================== + + // First row of ACE must have sstart' = 1 + builder.when(flags.next_is_first.clone()).assert_one(s_start_next); // ========================================================================== // BINARY CONSTRAINTS // ========================================================================== - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &ACE_BINARY_TAGS, - &mut idx, - ace_flag.clone() * sstart.clone() * (sstart.clone() - one.clone()), - ); - tagged_assert_zero_integrity( - builder, - &ACE_BINARY_TAGS, - &mut idx, - ace_flag.clone() * sblock.clone() * (sblock.clone() - one.clone()), - ); + // When ACE is active, section flags must be boolean. + { + let builder = &mut builder.when(ace_flag.clone()); + builder.assert_bool(local.s_start); + builder.assert_bool(local.s_block); + } + + let f_eval = local.s_block; + let f_eval_next = next.s_block; + let f_read = f_eval.into().not(); + let f_read_next = f_eval_next.into().not(); // ========================================================================== // SECTION/BLOCK FLAGS CONSTRAINTS // ========================================================================== + { + // Last row of ACE chiplet cannot be section start + builder.when(ace_last.clone()).assert_zero(s_start); + + // Prevent consecutive section starts within ACE chiplet + builder.when(ace_transition.clone()).when(s_start).assert_zero(s_start_next); + + // Sections must start with READ blocks (not EVAL) + builder.when(ace_flag.clone()).when(s_start).assert_zero(f_eval); - let f_next = one.clone() - sstart_next.clone(); - - // Sections must end with EVAL blocks (not READ). - // OR(t*a, t*b) = t*OR(a, b) when t is binary. - let f_end = binary_or((one.clone() - s3_next.clone()) * sstart_next.clone(), s3_next.clone()); - - let mut idx = 0; - // Last row of ACE chiplet cannot be section start - tagged_assert_zero_integrity( - builder, - &ACE_SECTION_TAGS, - &mut idx, - ace_flag.clone() * flag_ace_last.clone() * sstart.clone(), - ); - // Prevent consecutive section starts within ACE chiplet - tagged_assert_zero_integrity( - builder, - &ACE_SECTION_TAGS, - &mut idx, - ace_flag.clone() * flag_ace_next.clone() * sstart.clone() * sstart_next.clone(), - ); - // Sections must start with READ blocks (not EVAL): f_eval = 0 when f_start - tagged_assert_zero_integrity( - builder, - &ACE_SECTION_TAGS, - &mut idx, - ace_flag.clone() * sstart.clone() * sblock.clone(), - ); - // EVAL blocks cannot be followed by READ blocks within same section - tagged_assert_zero_integrity( - builder, - &ACE_SECTION_TAGS, - &mut idx, - ace_flag.clone() - * flag_ace_next.clone() - * f_next.clone() - * sblock.clone() - * (one.clone() - sblock_next.clone()), - ); - // Sections must end with EVAL blocks (not READ) - tagged_assert_zero_integrity( - builder, - &ACE_SECTION_TAGS, - &mut idx, - ace_flag.clone() * is_transition.clone() * f_end.clone() * (one.clone() - sblock.clone()), - ); + // EVAL blocks cannot be followed by READ blocks within same section + builder + .when(ace_transition.clone()) + .when(s_transition.clone()) + .when(f_eval) + .assert_zero(f_read_next.clone()); + } // ========================================================================== // SECTION CONSTRAINTS (within section) // ========================================================================== - let flag_within_section = one.clone() - sstart_next.clone(); - let f_read = one.clone() - sblock.clone(); - let f_eval = sblock.clone(); - - // Context consistency within a section - // Use a combined gate to share `ace_flag * flag_ace_next * flag_within_section` - // across all within-section transition constraints. - let within_section_gate = - ace_flag.clone() * flag_ace_next.clone() * flag_within_section.clone(); - - // Memory pointer increments: +4 in READ, +1 in EVAL - // ptr' = ptr + 4 * f_read + f_eval - let expected_ptr_next = ptr.clone() + four.clone() * f_read.clone() + f_eval.clone(); - - // Node ID decrements: -2 in READ, -1 in EVAL - // id0 = id0' + 2 * f_read + f_eval - let expected_id0 = id0_next.clone() + f_read.clone().double() + f_eval.clone(); - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &ACE_WITHIN_SECTION_TAGS, - &mut idx, - within_section_gate.clone() * (ctx_next.clone() - ctx.clone()), - ); - tagged_assert_zero_integrity( - builder, - &ACE_WITHIN_SECTION_TAGS, - &mut idx, - within_section_gate.clone() * (clk_next.clone() - clk.clone()), - ); - tagged_assert_zero_integrity( - builder, - &ACE_WITHIN_SECTION_TAGS, - &mut idx, - within_section_gate.clone() * (ptr_next.clone() - expected_ptr_next), - ); - tagged_assert_zero_integrity( - builder, - &ACE_WITHIN_SECTION_TAGS, - &mut idx, - within_section_gate * (id0.clone() - expected_id0), - ); + // Within-section transitions: context, clock, pointer, and node ID consistency. + { + let builder = &mut builder.when(ace_transition.clone() * s_transition); + + // clk and ctx are stable + builder.assert_eq(next.ctx, local.ctx); + builder.assert_eq(next.clk, local.clk); + + // Memory pointer increments: +4 in READ, +1 in EVAL + // ptr' = ptr + 4 * f_read + f_eval + let expected_ptr: AB::Expr = local.ptr + f_read.clone() * F_4 + f_eval; + builder.assert_eq(next.ptr, expected_ptr); + + // Node ID decrements: -2 in READ, -1 in EVAL + // id0 = id0' + 2 * f_read + f_eval + let expected_id0: AB::Expr = next.id_0 + f_read.double() + f_eval; + builder.assert_eq(local.id_0, expected_id0); + } // ========================================================================== // READ BLOCK CONSTRAINTS // ========================================================================== // In READ block, the two node IDs should be consecutive (id1 = id0 - 1) - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &ACE_READ_ID_TAGS, - &mut idx, - ace_flag.clone() * f_read.clone() * (id1.clone() - id0.clone() + one.clone()), - ); + builder + .when(ace_flag.clone()) + .when(f_read.clone()) + .assert_eq(local.id_1, local.id_0 - F_1); // READ→EVAL transition occurs when n_eval matches the first EVAL id0. // n_eval is constant across READ rows and encodes (num_eval_rows - 1). // Enforce: f_read * (f_read' * n_eval' + f_eval' * id0' - n_eval) = 0 - let f_read_next = one.clone() - sblock_next.clone(); - let f_eval_next = sblock_next.clone(); - let selected = f_read_next * n_eval_next.clone() + f_eval_next * id0_next.clone(); - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &ACE_READ_TO_EVAL_TAGS, - &mut idx, - is_transition.clone() * ace_flag.clone() * f_read.clone() * (selected - n_eval), - ); + let selected: AB::Expr = f_read_next * next.read().num_eval + f_eval_next * next.id_0; + builder + .when(ace_transition.clone()) + .when(f_read.clone()) + .assert_eq(selected, local.read().num_eval); // ========================================================================== // EVAL BLOCK CONSTRAINTS // ========================================================================== - // op must be -1, 0, or 1: op * (op - 1) * (op + 1) = 0 - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &ACE_EVAL_OP_TAGS, - &mut idx, - ace_flag.clone() - * f_eval.clone() - * op.clone() - * (op.clone() - one.clone()) - * (op.clone() + one.clone()), - ); - - // Arithmetic operation constraints - let eval_gate = ace_flag.clone() * f_eval.clone(); - let (expected_0, expected_1) = compute_arithmetic_expected::(op, v1_0, v1_1, v2_0, v2_1); - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &ACE_EVAL_RESULT_TAGS, - &mut idx, - eval_gate.clone() * (expected_0 - v0_0.clone()), - ); - tagged_assert_zero_integrity( - builder, - &ACE_EVAL_RESULT_TAGS, - &mut idx, - eval_gate.clone() * (expected_1 - v0_1.clone()), - ); + // EVAL block: op ternary validity and arithmetic operation result. + { + let builder = &mut builder.when(ace_flag.clone() * f_eval); + let op: AB::Expr = local.eval_op.into(); + + let op_square = op.square(); + // op must be -1, 0, or 1: ternary validity + // op * (op² - 1) = op ( op - 1) ( op + 1 ) + builder.assert_zero(op.clone() * (op_square.clone() - F_1)); + + // Compute expected EVAL block output (v0) from op and operands. + // + // Operations in extension field 𝔽ₚ[x]/(x² - 7): + // - op = -1: Subtraction (v0 = v1 - v2) + // - op = 0: Multiplication (v0 = v1 × v2) + // - op = 1: Addition (v0 = v1 + v2) + let v0: QuadFeltExpr = local.v_0.into_expr(); + let v1: QuadFeltExpr = local.v_1.into_expr(); + let v2: QuadFeltExpr = local.eval().v_2.into_expr(); + + let expected = { + // Linear operation: v1 + op * v2 (works for ADD when op=1, SUB when op=-1) + let linear = v1.clone() + v2.clone() * op; + + // Non-linear operation: multiplication in extension field (α² = 7) + let nonlinear = v1 * v2; + + // Select based on op²: if op² = 1, use linear; if op² = 0, use nonlinear + // result = op² * (linear - nonlinear) + nonlinear + (linear - nonlinear.clone()) * op_square + nonlinear + }; + builder.assert_eq_quad(v0, expected); + } // ========================================================================== // FINALIZATION CONSTRAINTS // ========================================================================== - // At section end: v0 = 0, id0 = 0 - // Use a combined gate to share `ace_flag * is_transition * f_end` across all finalization - // constraints. - let gate = ace_flag * is_transition * f_end; - let mut idx = 0; - tagged_assert_zero_integrity(builder, &ACE_FINAL_TAGS, &mut idx, gate.clone() * v0_0); - tagged_assert_zero_integrity(builder, &ACE_FINAL_TAGS, &mut idx, gate.clone() * v0_1); - tagged_assert_zero_integrity(builder, &ACE_FINAL_TAGS, &mut idx, gate * id0); -} - -/// Enforce ACE first row constraints. -/// -/// On the first row of ACE chiplet, sstart' must be 1. -pub fn enforce_ace_constraints_first_row( - builder: &mut AB, - _local: &MainTraceRow, - next: &MainTraceRow, - flag_next_row_first_ace: AB::Expr, -) where - AB: TaggingAirBuilderExt, -{ - let sstart_next: AB::Expr = load_ace_col::(next, SELECTOR_START_IDX); - let one: AB::Expr = AB::Expr::ONE; - - // First row of ACE must have sstart' = 1 - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &ACE_FIRST_ROW_TAGS, - &mut idx, - flag_next_row_first_ace * (sstart_next - one), - ); -} + // At section end: result value and node ID must be zero. + { + // f_end fires on the last ACE row or on section boundaries. + let f_end = flags.is_last.clone() + flags.is_transition.clone() * s_start_next; + let builder = &mut builder.when(f_end); -// INTERNAL HELPERS -// ================================================================================================ + // Sections must end with EVAL blocks (not READ). + builder.assert_zero(f_read); -/// Load a column from the ACE section of chiplets. -fn load_ace_col(row: &MainTraceRow, ace_col_idx: usize) -> AB::Expr -where - AB: TaggingAirBuilderExt, -{ - // ACE columns start after s0, s1, s2, s3 (4 selectors) - let local_idx = ACE_OFFSET + ace_col_idx; - row.chiplets[local_idx].clone().into() -} - -/// Compute expected EVAL block outputs (v0) from op and operands. -/// -/// Operations in extension field 𝔽ₚ[x]/(x² - 7): -/// - op = -1: Subtraction (v0 = v1 - v2) -/// - op = 0: Multiplication (v0 = v1 × v2) -/// - op = 1: Addition (v0 = v1 + v2) -fn compute_arithmetic_expected( - op: AB::Expr, - v1_0: AB::Expr, - v1_1: AB::Expr, - v2_0: AB::Expr, - v2_1: AB::Expr, -) -> (AB::Expr, AB::Expr) -where - AB: TaggingAirBuilderExt, -{ - use crate::constraints::ext_field::QuadFeltExpr; + let v0: QuadFeltExpr = local.v_0.into_expr(); - let v1 = QuadFeltExpr(v1_0, v1_1); - let v2 = QuadFeltExpr(v2_0, v2_1); + builder.assert_eq_quad(v0, QuadFeltExpr::new(AB::Expr::ZERO, AB::Expr::ZERO)); - // Linear operation: v1 + op * v2 (works for ADD when op=1, SUB when op=-1) - let linear = v1.clone() + v2.clone() * op.clone(); - - // Non-linear operation: multiplication in extension field (α² = 7) - let nonlinear = v1 * v2; - - // Select based on op²: if op² = 1, use linear; if op² = 0, use nonlinear - // op_square * (linear - nonlinear) + nonlinear = v0 - let op_square = op.clone() * op; - let expected = QuadFeltExpr( - op_square.clone() * (linear.0.clone() - nonlinear.0.clone()) + nonlinear.0, - op_square * (linear.1.clone() - nonlinear.1.clone()) + nonlinear.1, - ); - - expected.into_parts().into() -} - -/// Computes binary OR: `a + b - a * b` -/// -/// Assumes both a and b are binary (0 or 1). -/// Returns 1 if either a=1 or b=1. -#[inline] -pub fn binary_or(a: E, b: E) -> E -where - E: Clone + core::ops::Add + core::ops::Sub + core::ops::Mul, -{ - a.clone() + b.clone() - a * b + builder.assert_zero(local.id_0); + } } diff --git a/air/src/constraints/chiplets/bitwise.rs b/air/src/constraints/chiplets/bitwise.rs index dcc8c58395..afe74e1bbd 100644 --- a/air/src/constraints/chiplets/bitwise.rs +++ b/air/src/constraints/chiplets/bitwise.rs @@ -21,102 +21,20 @@ //! | zp | Previous aggregated output | //! | z | Current aggregated output | -use alloc::vec::Vec; +use core::{array, borrow::Borrow}; use miden_core::field::PrimeCharacteristicRing; -use super::{ - hasher::periodic::NUM_PERIODIC_COLUMNS as HASHER_NUM_PERIODIC_COLUMNS, - selectors::bitwise_chiplet_flag, -}; +use super::selectors::ChipletFlags; use crate::{ - Felt, MainTraceRow, - constraints::tagging::{TagGroup, TaggingAirBuilderExt, tagged_assert_zero_integrity}, - trace::{ - CHIPLETS_OFFSET, - chiplets::{ - BITWISE_A_COL_IDX, BITWISE_A_COL_RANGE, BITWISE_B_COL_IDX, BITWISE_B_COL_RANGE, - BITWISE_OUTPUT_COL_IDX, BITWISE_PREV_OUTPUT_COL_IDX, BITWISE_SELECTOR_COL_IDX, - }, + AirBuilder, MainCols, MidenAirBuilder, + constraints::{ + chiplets::columns::{BitwiseCols, PeriodicCols}, + constants::F_16, + utils::horner_eval_bits, }, }; -// CONSTANTS -// ================================================================================================ - -/// Index of k_first periodic column (marks first row of 8-row cycle). -/// Placed after hasher periodic columns. -pub const P_BITWISE_K_FIRST: usize = HASHER_NUM_PERIODIC_COLUMNS; - -/// Index of k_transition periodic column (marks non-last rows of 8-row cycle). -pub const P_BITWISE_K_TRANSITION: usize = HASHER_NUM_PERIODIC_COLUMNS + 1; - -/// Total number of periodic columns (hasher + bitwise periodic columns). -#[cfg(all(test, feature = "std"))] -pub const NUM_PERIODIC_COLUMNS: usize = HASHER_NUM_PERIODIC_COLUMNS + 2; - -/// Number of bits processed per row. -const NUM_BITS_PER_ROW: usize = 4; - -// TAGGING IDS -// ================================================================================================ - -pub(super) const BITWISE_BASE_ID: usize = super::hasher::HASHER_MERKLE_ABSORB_BASE_ID + 12; -pub(super) const BITWISE_COUNT: usize = 17; -const BITWISE_OP_BINARY_ID: usize = BITWISE_BASE_ID; -const BITWISE_A_BITS_BINARY_BASE_ID: usize = BITWISE_BASE_ID + 2; -const BITWISE_B_BITS_BINARY_BASE_ID: usize = BITWISE_A_BITS_BINARY_BASE_ID + NUM_BITS_PER_ROW; -const BITWISE_FIRST_ROW_BASE_ID: usize = BITWISE_B_BITS_BINARY_BASE_ID + NUM_BITS_PER_ROW; -const BITWISE_INPUT_TRANSITION_BASE_ID: usize = BITWISE_FIRST_ROW_BASE_ID + 3; -const BITWISE_OUTPUT_PREV_ID: usize = BITWISE_INPUT_TRANSITION_BASE_ID + 2; -const BITWISE_OUTPUT_AGG_ID: usize = BITWISE_OUTPUT_PREV_ID + 1; - -const OP_BINARY_NAMESPACE: &str = "chiplets.bitwise.op.binary"; -const OP_STABILITY_NAMESPACE: &str = "chiplets.bitwise.op.stability"; -const A_BITS_BINARY_NAMESPACE: &str = "chiplets.bitwise.a_bits.binary"; -const B_BITS_BINARY_NAMESPACE: &str = "chiplets.bitwise.b_bits.binary"; -const FIRST_ROW_NAMESPACE: &str = "chiplets.bitwise.first_row"; -const INPUT_TRANSITION_NAMESPACE: &str = "chiplets.bitwise.input.transition"; -const OUTPUT_PREV_NAMESPACE: &str = "chiplets.bitwise.output.prev"; -const OUTPUT_AGG_NAMESPACE: &str = "chiplets.bitwise.output.aggregate"; - -const OP_NAMES: [&str; 2] = [OP_BINARY_NAMESPACE, OP_STABILITY_NAMESPACE]; -const A_BITS_NAMES: [&str; NUM_BITS_PER_ROW] = [A_BITS_BINARY_NAMESPACE; NUM_BITS_PER_ROW]; -const B_BITS_NAMES: [&str; NUM_BITS_PER_ROW] = [B_BITS_BINARY_NAMESPACE; NUM_BITS_PER_ROW]; -const FIRST_ROW_NAMES: [&str; 3] = [FIRST_ROW_NAMESPACE; 3]; -const INPUT_TRANSITION_NAMES: [&str; 2] = [INPUT_TRANSITION_NAMESPACE; 2]; -const OUTPUT_PREV_NAMES: [&str; 1] = [OUTPUT_PREV_NAMESPACE; 1]; -const OUTPUT_AGG_NAMES: [&str; 1] = [OUTPUT_AGG_NAMESPACE; 1]; - -const OP_TAGS: TagGroup = TagGroup { - base: BITWISE_OP_BINARY_ID, - names: &OP_NAMES, -}; -const A_BITS_TAGS: TagGroup = TagGroup { - base: BITWISE_A_BITS_BINARY_BASE_ID, - names: &A_BITS_NAMES, -}; -const B_BITS_TAGS: TagGroup = TagGroup { - base: BITWISE_B_BITS_BINARY_BASE_ID, - names: &B_BITS_NAMES, -}; -const FIRST_ROW_TAGS: TagGroup = TagGroup { - base: BITWISE_FIRST_ROW_BASE_ID, - names: &FIRST_ROW_NAMES, -}; -const INPUT_TRANSITION_TAGS: TagGroup = TagGroup { - base: BITWISE_INPUT_TRANSITION_BASE_ID, - names: &INPUT_TRANSITION_NAMES, -}; -const OUTPUT_PREV_TAGS: TagGroup = TagGroup { - base: BITWISE_OUTPUT_PREV_ID, - names: &OUTPUT_PREV_NAMES, -}; -const OUTPUT_AGG_TAGS: TagGroup = TagGroup { - base: BITWISE_OUTPUT_AGG_ID, - names: &OUTPUT_AGG_NAMES, -}; - // ENTRY POINTS // ================================================================================================ @@ -128,102 +46,73 @@ const OUTPUT_AGG_TAGS: TagGroup = TagGroup { /// 3. Output aggregation constraints pub fn enforce_bitwise_constraints( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, + flags: &ChipletFlags, ) where - AB: TaggingAirBuilderExt, + AB: MidenAirBuilder, { - let (k_first, k_transition) = { - // Clone out what we need to avoid holding a borrow of `builder` while asserting - // constraints. - let periodic = builder.periodic_values(); - debug_assert!(periodic.len() > P_BITWISE_K_TRANSITION); - (periodic[P_BITWISE_K_FIRST].into(), periodic[P_BITWISE_K_TRANSITION].into()) - }; + let periodic: &PeriodicCols<_> = builder.periodic_values().borrow(); + let k_first = periodic.bitwise.k_first; + let k_transition = periodic.bitwise.k_transition; - // Compute bitwise active flag from top-level selectors - let s0: AB::Expr = local.chiplets[0].clone().into(); - let s1: AB::Expr = local.chiplets[1].clone().into(); - let bitwise_flag = bitwise_chiplet_flag(s0, s1); + let bitwise_flag = flags.is_active.clone(); - // Load bitwise columns using typed struct - let cols: BitwiseColumns = BitwiseColumns::from_row(local); - let cols_next: BitwiseColumns = BitwiseColumns::from_row(next); + let cols: &BitwiseCols = local.bitwise(); + let cols_next: &BitwiseCols = next.bitwise(); - let one: AB::Expr = AB::Expr::ONE; - let sixteen: AB::Expr = AB::Expr::from_u32(16); + // All bitwise constraints are gated on the bitwise chiplet being active. + let bitwise_builder = &mut builder.when(bitwise_flag); // ========================================================================== // OPERATION FLAG CONSTRAINTS // ========================================================================== // op_flag must be binary (0 for AND, 1 for XOR) - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &OP_TAGS, - &mut idx, - bitwise_flag.clone() * cols.op_flag.clone() * (cols.op_flag.clone() - one.clone()), - ); + let op_flag = cols.op_flag; + bitwise_builder.assert_bool(op_flag); // op_flag must remain constant within the 8-row cycle (can only change when k1=0) - let gate_transition = k_transition.clone() * bitwise_flag.clone(); - tagged_assert_zero_integrity( - builder, - &OP_TAGS, - &mut idx, - gate_transition.clone() * (cols.op_flag.clone() - cols_next.op_flag.clone()), - ); + let op_flag_next = cols_next.op_flag; + bitwise_builder.when(k_transition).assert_eq(op_flag, op_flag_next); // ========================================================================== // INPUT DECOMPOSITION CONSTRAINTS // ========================================================================== + let (a, a_bits) = (cols.a, cols.a_bits); + let (b, b_bits) = (cols.b, cols.b_bits); // Bit decomposition columns must be binary - let gate = bitwise_flag.clone(); - let mut idx = 0; - for i in 0..NUM_BITS_PER_ROW { - tagged_assert_zero_integrity( - builder, - &A_BITS_TAGS, - &mut idx, - gate.clone() * cols.a_bits[i].clone() * (cols.a_bits[i].clone() - one.clone()), - ); - } - - let mut idx = 0; - for i in 0..NUM_BITS_PER_ROW { - tagged_assert_zero_integrity( - builder, - &B_BITS_TAGS, - &mut idx, - gate.clone() * cols.b_bits[i].clone() * (cols.b_bits[i].clone() - one.clone()), - ); - } + bitwise_builder.assert_bools(a_bits); + bitwise_builder.assert_bools(b_bits); // First row of cycle (k0=1): a = aggregated bits, b = aggregated bits - let a_agg = aggregate_limbs(&cols.a_bits); - let b_agg = aggregate_limbs(&cols.b_bits); - let gate_first = k_first.clone() * bitwise_flag.clone(); - let mut idx = 0; - for expr in [cols.a.clone() - a_agg, cols.b.clone() - b_agg, cols.prev_output.clone()] { - tagged_assert_zero_integrity(builder, &FIRST_ROW_TAGS, &mut idx, gate_first.clone() * expr); + // First row: input aggregation must match, and previous output must be zero. + { + let builder = &mut bitwise_builder.when(k_first); + + let a_expected = horner_eval_bits(&a_bits); + builder.assert_eq(a, a_expected); + + let b_expected = horner_eval_bits(&b_bits); + builder.assert_eq(b, b_expected); + + builder.assert_zero(cols.prev_output); } + let (a_next, a_next_bits) = (cols_next.a, cols_next.a_bits); + let (b_next, b_next_bits) = (cols_next.b, cols_next.b_bits); + // Transition rows (k1=1): a' = 16*a + agg(a'_bits), b' = 16*b + agg(b'_bits) - let a_agg_next = aggregate_limbs(&cols_next.a_bits); - let b_agg_next = aggregate_limbs(&cols_next.b_bits); - let mut idx = 0; - for expr in [ - cols_next.a.clone() - (cols.a.clone() * sixteen.clone() + a_agg_next), - cols_next.b.clone() - (cols.b.clone() * sixteen.clone() + b_agg_next), - ] { - tagged_assert_zero_integrity( - builder, - &INPUT_TRANSITION_TAGS, - &mut idx, - gate_transition.clone() * expr, - ); + // Transition rows: inputs aggregate with 16x shift. + { + let builder = &mut bitwise_builder.when(k_transition); + + let a_next_expected = a * F_16 + horner_eval_bits(&a_next_bits); + builder.assert_eq(a_next, a_next_expected); + + let b_next_expected = b * F_16 + horner_eval_bits(&b_next_bits); + builder.assert_eq(b_next, b_next_expected); } // ========================================================================== @@ -231,148 +120,27 @@ pub fn enforce_bitwise_constraints( // ========================================================================== // Transition rows (k1=1): output_prev' = output - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &OUTPUT_PREV_TAGS, - &mut idx, - gate_transition * (cols_next.prev_output.clone() - cols.output.clone()), - ); + let output = cols.output; + let prev_output_next = cols_next.prev_output; + bitwise_builder.when(k_transition).assert_eq(output, prev_output_next); // Every row: output = 16*output_prev + bitwise_result - let a_and_b = compute_limb_and(&cols.a_bits, &cols.b_bits); - let a_xor_b = compute_limb_xor(&cols.a_bits, &cols.b_bits); - - // z = zp * 16 + (op_flag ? a_xor_b : a_and_b) - // Equivalent: z = zp * 16 + a_and_b + op_flag * (a_xor_b - a_and_b) - let expected_z = cols.prev_output.clone() * sixteen - + a_and_b.clone() - + cols.op_flag.clone() * (a_xor_b.clone() - a_and_b); - - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &OUTPUT_AGG_TAGS, - &mut idx, - bitwise_flag * (cols.output.clone() - expected_z), - ); -} -// INTERNAL HELPERS -// ================================================================================================ + // Compute AND of 4-bit limbs: sum(2^i * (a[i] * b[i])) + let a_and_b_bits: [AB::Expr; 4] = array::from_fn(|i| a_bits[i] * b_bits[i]); + let a_and_b: AB::Expr = horner_eval_bits(&a_and_b_bits); -/// Typed access to bitwise chiplet columns. -/// -/// This struct provides named access to bitwise columns, eliminating error-prone -/// index arithmetic. Created from a `MainTraceRow` reference. -pub struct BitwiseColumns { - /// Operation flag: 0=AND, 1=XOR - pub op_flag: E, - /// Aggregated value of input a - pub a: E, - /// Aggregated value of input b - pub b: E, - /// 4-bit decomposition of a (little-endian) - pub a_bits: [E; NUM_BITS_PER_ROW], - /// 4-bit decomposition of b (little-endian) - pub b_bits: [E; NUM_BITS_PER_ROW], - /// Previous aggregated output - pub prev_output: E, - /// Current aggregated output - pub output: E, -} + // Compute XOR of 4-bit limbs: sum(2^i * (a[i] + b[i] - 2*a[i]*b[i])) + // Reuses a_and_b_bits: xor_bit = a + b - 2*and_bit + let a_xor_b_bits: [AB::Expr; 4] = + array::from_fn(|i| a_bits[i] + b_bits[i] - a_and_b_bits[i].clone().double()); + let a_xor_b: AB::Expr = horner_eval_bits(&a_xor_b_bits); -impl BitwiseColumns { - /// Extract bitwise columns from a main trace row. - pub fn from_row(row: &MainTraceRow) -> Self - where - V: Into + Clone, - { - let op_idx = BITWISE_SELECTOR_COL_IDX - CHIPLETS_OFFSET; - let a_idx = BITWISE_A_COL_IDX - CHIPLETS_OFFSET; - let b_idx = BITWISE_B_COL_IDX - CHIPLETS_OFFSET; - let a_bits_start = BITWISE_A_COL_RANGE.start - CHIPLETS_OFFSET; - let b_bits_start = BITWISE_B_COL_RANGE.start - CHIPLETS_OFFSET; - let zp_idx = BITWISE_PREV_OUTPUT_COL_IDX - CHIPLETS_OFFSET; - let z_idx = BITWISE_OUTPUT_COL_IDX - CHIPLETS_OFFSET; - - BitwiseColumns { - op_flag: row.chiplets[op_idx].clone().into(), - a: row.chiplets[a_idx].clone().into(), - b: row.chiplets[b_idx].clone().into(), - a_bits: core::array::from_fn(|i| row.chiplets[a_bits_start + i].clone().into()), - b_bits: core::array::from_fn(|i| row.chiplets[b_bits_start + i].clone().into()), - prev_output: row.chiplets[zp_idx].clone().into(), - output: row.chiplets[z_idx].clone().into(), - } - } -} - -/// Aggregate 4 bits into a value (little-endian): sum(2^i * limb[i]) -/// Uses Horner's method: ((b3*2 + b2)*2 + b1)*2 + b0 -fn aggregate_limbs(limbs: &[E; 4]) -> E { - limbs - .iter() - .rev() - .cloned() - .reduce(|acc, bit| acc.double() + bit) - .expect("non-empty array") -} - -/// Compute AND of 4-bit limbs: sum(2^i * (a[i] * b[i])) -/// Uses Horner's method for aggregation -fn compute_limb_and(a: &[E; 4], b: &[E; 4]) -> E { - (0..4) - .rev() - .map(|i| a[i].clone() * b[i].clone()) - .reduce(|acc, bit| acc.double() + bit) - .expect("non-empty range") -} - -/// Compute XOR of 4-bit limbs: sum(2^i * (a[i] + b[i] - 2*a[i]*b[i])) -/// Uses Horner's method for aggregation -fn compute_limb_xor(a: &[E; 4], b: &[E; 4]) -> E { - (0..4) - .rev() - .map(|i| { - let and_bit = a[i].clone() * b[i].clone(); - a[i].clone() + b[i].clone() - and_bit.double() - }) - .reduce(|acc, bit| acc.double() + bit) - .expect("non-empty range") -} - -// ============================================================================= -// PERIODIC COLUMNS -// ============================================================================= - -/// Generate periodic columns for the bitwise chiplet. -/// -/// Returns [k_first, k_transition] where: -/// - k_first: [1, 0, 0, 0, 0, 0, 0, 0] (period 8) -/// - k_transition: [1, 1, 1, 1, 1, 1, 1, 0] (period 8) -pub fn periodic_columns() -> [Vec; 2] { - let k_first = vec![ - Felt::ONE, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - ]; - - let k_transition = vec![ - Felt::ONE, - Felt::ONE, - Felt::ONE, - Felt::ONE, - Felt::ONE, - Felt::ONE, - Felt::ONE, - Felt::ZERO, - ]; + // z = zp * 16 + (op_flag ? a_xor_b : a_and_b) + // Equivalent: z = zp * 16 + a_and_b + op_flag * (a_xor_b - a_and_b) + let zp = cols.prev_output; + let expected_z = zp * F_16 + a_and_b.clone() + op_flag * (a_xor_b - a_and_b); - [k_first, k_transition] + let z = cols.output; + bitwise_builder.assert_eq(z, expected_z); } diff --git a/air/src/constraints/chiplets/bus/chiplets.rs b/air/src/constraints/chiplets/bus/chiplets.rs index b03d71133a..fe2cf466b9 100644 --- a/air/src/constraints/chiplets/bus/chiplets.rs +++ b/air/src/constraints/chiplets/bus/chiplets.rs @@ -22,29 +22,29 @@ //! - state = sum(beta^(3+i) * hasher_state[i]) for i in 0..12 //! //! ### Bitwise Chiplet Messages (5 elements) -//! Format: alpha + beta^0*label + beta^1*a + beta^2*b + beta^3*z +//! Format: bus_prefix[CHIPLETS_BUS] + beta^0*label + beta^1*a + beta^2*b + beta^3*z //! //! ### Memory Chiplet Messages (6-9 elements) //! Element format: alpha + beta^0*label + ... + beta^4*element //! Word format: alpha + beta^0*label + ... + beta^7*word[3] //! //! ## References -//! - Air-script: ~/air-script/constraints/chiplets.air //! - Processor: processor/src/chiplets/aux_trace/bus/ +use core::borrow::Borrow; + use miden_core::{FMP_ADDR, FMP_INIT_VALUE, field::PrimeCharacteristicRing, operations::opcodes}; -use miden_crypto::stark::air::{ExtensionBuilder, LiftedAirBuilder, WindowAccess}; +use miden_crypto::stark::air::{ExtensionBuilder, WindowAccess}; use crate::{ - Felt, MainTraceRow, + Felt, MainCols, MidenAirBuilder, constraints::{ bus::indices::B_CHIPLETS, - chiplets::{bitwise::P_BITWISE_K_TRANSITION, hasher}, + chiplets::{columns::PeriodicCols, selectors::ChipletSelectors}, op_flags::OpFlags, - tagging::{TaggingAirBuilderExt, ids::TAG_CHIPLETS_BUS_BASE}, }, trace::{ - Challenges, + Challenges, bus_types, chiplets::{ NUM_ACE_SELECTORS, NUM_KERNEL_ROM_SELECTORS, ace::{ @@ -53,8 +53,8 @@ use crate::{ }, bitwise::{self, BITWISE_AND_LABEL, BITWISE_XOR_LABEL}, hasher::{ - HASH_CYCLE_LEN, LINEAR_HASH_LABEL, MP_VERIFY_LABEL, MR_UPDATE_NEW_LABEL, - MR_UPDATE_OLD_LABEL, RETURN_HASH_LABEL, RETURN_STATE_LABEL, + CONTROLLER_ROWS_PER_PERMUTATION, LINEAR_HASH_LABEL, MP_VERIFY_LABEL, + MR_UPDATE_NEW_LABEL, MR_UPDATE_OLD_LABEL, RETURN_HASH_LABEL, RETURN_STATE_LABEL, }, kernel_rom::{KERNEL_PROC_CALL_LABEL, KERNEL_PROC_INIT_LABEL}, memory::{ @@ -62,7 +62,6 @@ use crate::{ MEMORY_WRITE_WORD_LABEL, }, }, - decoder::{ADDR_COL_IDX, HASHER_STATE_RANGE, USER_OP_HELPERS_OFFSET}, log_precompile::{ HELPER_ADDR_IDX, HELPER_CAP_PREV_RANGE, STACK_CAP_NEXT_RANGE, STACK_COMM_RANGE, STACK_R0_RANGE, STACK_R1_RANGE, STACK_TAG_RANGE, @@ -70,9 +69,10 @@ use crate::{ }, }; -/// Tag ID and namespace for the main chiplets bus transition constraint. -const CHIPLET_BUS_ID: usize = TAG_CHIPLETS_BUS_BASE; -const CHIPLET_BUS_NAMESPACE: &str = "chiplets.bus.chiplets.transition"; +/// Label offset for input (start) messages on the chiplets bus. +const INPUT_LABEL_OFFSET: u16 = 16; +/// Label offset for output (end) messages on the chiplets bus. +const OUTPUT_LABEL_OFFSET: u16 = 32; // ENTRY POINTS // ================================================================================================ @@ -89,12 +89,13 @@ const CHIPLET_BUS_NAMESPACE: &str = "chiplets.bus.chiplets.transition"; /// `responses` are messages removed by chiplet operations. pub fn enforce_chiplets_bus_constraint( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, challenges: &Challenges, + selectors: &ChipletSelectors, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { // Auxiliary trace must be present. @@ -247,51 +248,31 @@ pub fn enforce_chiplets_bus_constraint( // ========================================================================= // Responses come from chiplet rows. Chiplet selectors are mutually exclusive. - // --- Get periodic columns we need for hasher cycle detection and bitwise cycle gating --- - let (cycle_row_0, cycle_row_31, k_transition) = { - let p = builder.periodic_values(); - let cycle_row_0: AB::Expr = p[hasher::periodic::P_CYCLE_ROW_0].into(); - let cycle_row_31: AB::Expr = p[hasher::periodic::P_CYCLE_ROW_31].into(); - let k_transition: AB::Expr = p[P_BITWISE_K_TRANSITION].into(); - (cycle_row_0, cycle_row_31, k_transition) - }; + // --- Get periodic columns for bitwise cycle gating --- + let periodic: &PeriodicCols = builder.periodic_values().borrow(); + let k_transition: AB::Expr = periodic.bitwise.k_transition.into(); + + // --- Chiplet response flags (from precomputed ChipletSelectors) --- + // Bitwise responds only on the last row of its 8-row cycle (k_transition=0). + let is_bitwise_responding: AB::Expr = + selectors.bitwise.is_active.clone() * (AB::Expr::ONE - k_transition); + + let is_memory: AB::Expr = selectors.memory.is_active.clone(); - // --- Chiplet selector flags (from chiplets columns) --- - let chiplet_s0: AB::Expr = local.chiplets[0].clone().into(); - let chiplet_s1: AB::Expr = local.chiplets[1].clone().into(); - let chiplet_s2: AB::Expr = local.chiplets[2].clone().into(); - let chiplet_s3: AB::Expr = local.chiplets[3].clone().into(); - let chiplet_s4: AB::Expr = local.chiplets[4].clone().into(); - - // Bitwise chiplet active: s0=1, s1=0 - // Bitwise responds only on last row of 8-row cycle (when k_transition=0) - let is_bitwise_row: AB::Expr = chiplet_s0.clone() * (AB::Expr::ONE - chiplet_s1.clone()); - let is_bitwise_responding: AB::Expr = is_bitwise_row * (AB::Expr::ONE - k_transition); - - // Memory chiplet active: s0=1, s1=1, s2=0 - let is_memory: AB::Expr = - chiplet_s0.clone() * chiplet_s1.clone() * (AB::Expr::ONE - chiplet_s2.clone()); - - // ACE chiplet active: s0=1, s1=1, s2=1, s3=0 - // Response only on start rows (ace_start_selector = 1) - let is_ace_row: AB::Expr = chiplet_s0.clone() - * chiplet_s1.clone() - * chiplet_s2.clone() - * (AB::Expr::ONE - chiplet_s3.clone()); + // ACE responds only on start rows (ace_start_selector = 1). let ace_start_selector: AB::Expr = - local.chiplets[NUM_ACE_SELECTORS + SELECTOR_START_IDX].clone().into(); - let is_ace: AB::Expr = is_ace_row * ace_start_selector; + local.chiplets[NUM_ACE_SELECTORS + SELECTOR_START_IDX].into(); + let is_ace: AB::Expr = selectors.ace.is_active.clone() * ace_start_selector; - // Kernel ROM chiplet active: s0=1, s1=1, s2=1, s3=1, s4=0 - let is_kernel_rom: AB::Expr = chiplet_s0.clone() - * chiplet_s1.clone() - * chiplet_s2.clone() - * chiplet_s3.clone() - * (AB::Expr::ONE - chiplet_s4.clone()); + let is_kernel_rom: AB::Expr = selectors.kernel_rom.is_active.clone(); // --- Hasher response (complex, depends on cycle position and selectors) --- - let hasher_response = - compute_hasher_response::(local, next, challenges, cycle_row_0, cycle_row_31); + let hasher_response = compute_hasher_response::( + local, + next, + challenges, + selectors.controller.is_active.clone(), + ); // --- Bitwise response --- let v_bitwise = compute_bitwise_response::(local, challenges); @@ -326,9 +307,7 @@ pub fn enforce_chiplets_bus_constraint( let lhs: AB::ExprEF = Into::::into(b_next_val) * requests; let rhs: AB::ExprEF = Into::::into(b_local_val) * responses; - builder.tagged(CHIPLET_BUS_ID, CHIPLET_BUS_NAMESPACE, |builder| { - builder.when_transition().assert_zero_ext(lhs - rhs); - }); + builder.when_transition().assert_eq_ext(lhs, rhs); } // BITWISE MESSAGE HELPERS @@ -336,12 +315,12 @@ pub fn enforce_chiplets_bus_constraint( /// Computes the bitwise request message value. /// -/// Format: alpha + beta^0*label + beta^1*a + beta^2*b + beta^3*z +/// Format: bus_prefix[CHIPLETS_BUS] + beta^0*label + beta^1*a + beta^2*b + beta^3*z /// /// Stack layout for U32AND/U32XOR: [a, b, ...] -> [z, ...] -fn compute_bitwise_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_bitwise_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, is_xor: bool, ) -> AB::ExprEF { @@ -349,18 +328,18 @@ fn compute_bitwise_request>( let label: AB::Expr = AB::Expr::from(label); // Stack values - let a: AB::Expr = local.stack[0].clone().into(); - let b: AB::Expr = local.stack[1].clone().into(); - let z: AB::Expr = next.stack[0].clone().into(); + let a: AB::Expr = local.stack.get(0).into(); + let b: AB::Expr = local.stack.get(1).into(); + let z: AB::Expr = next.stack.get(0).into(); - challenges.encode([label, a, b, z]) + challenges.encode(bus_types::CHIPLETS_BUS, [label, a, b, z]) } /// Computes the bitwise chiplet response message value. /// -/// Format: alpha + beta^0*label + beta^1*a + beta^2*b + beta^3*z -fn compute_bitwise_response>( - local: &MainTraceRow, +/// Format: bus_prefix[CHIPLETS_BUS] + beta^0*label + beta^1*a + beta^2*b + beta^3*z +fn compute_bitwise_response( + local: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { use crate::trace::chiplets::NUM_BITWISE_SELECTORS; @@ -371,17 +350,17 @@ fn compute_bitwise_response>( // Get bitwise operation selector and compute label // The AND/XOR selector is at bitwise[0] = local.chiplets[bw_offset] // label = (1 - sel) * AND_LABEL + sel * XOR_LABEL - let sel: AB::Expr = local.chiplets[bw_offset].clone().into(); + let sel: AB::Expr = local.chiplets[bw_offset].into(); let one_minus_sel = AB::Expr::ONE - sel.clone(); let label = one_minus_sel * AB::Expr::from(BITWISE_AND_LABEL) + sel.clone() * AB::Expr::from(BITWISE_XOR_LABEL); // Bitwise chiplet data columns (offset by bw_offset + bitwise internal indices) - let a: AB::Expr = local.chiplets[bw_offset + bitwise::A_COL_IDX].clone().into(); - let b: AB::Expr = local.chiplets[bw_offset + bitwise::B_COL_IDX].clone().into(); - let z: AB::Expr = local.chiplets[bw_offset + bitwise::OUTPUT_COL_IDX].clone().into(); + let a: AB::Expr = local.chiplets[bw_offset + bitwise::A_COL_IDX].into(); + let b: AB::Expr = local.chiplets[bw_offset + bitwise::B_COL_IDX].into(); + let z: AB::Expr = local.chiplets[bw_offset + bitwise::OUTPUT_COL_IDX].into(); - challenges.encode([label, a, b, z]) + challenges.encode(bus_types::CHIPLETS_BUS, [label, a, b, z]) } // MEMORY MESSAGE HELPERS @@ -389,14 +368,14 @@ fn compute_bitwise_response>( /// Computes the memory word request message value. /// -/// Format: alpha + beta^0*label + beta^1*ctx + beta^2*addr + beta^3*clk + +/// Format: bus_prefix[CHIPLETS_BUS] + beta^0*label + beta^1*ctx + beta^2*addr + beta^3*clk + /// beta^4..beta^7 * word /// /// Stack layout for MLOADW: [addr, ...] -> [word[0], word[1], word[2], word[3], ...] /// Stack layout for MSTOREW: [addr, word[0], word[1], word[2], word[3], ...] -fn compute_memory_word_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_memory_word_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, is_read: bool, ) -> AB::ExprEF { @@ -408,40 +387,41 @@ fn compute_memory_word_request>( let label: AB::Expr = AB::Expr::from_u16(label as u16); // Context and clock from system columns - let ctx: AB::Expr = local.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); + let ctx: AB::Expr = local.system.ctx.into(); + let clk: AB::Expr = local.system.clk.into(); // Address is at stack[0] - let addr: AB::Expr = local.stack[0].clone().into(); + let addr: AB::Expr = local.stack.get(0).into(); // Word values depend on read vs write let (w0, w1, w2, w3) = if is_read { // MLOADW: word comes from next stack state ( - next.stack[0].clone().into(), - next.stack[1].clone().into(), - next.stack[2].clone().into(), - next.stack[3].clone().into(), + next.stack.get(0).into(), + next.stack.get(1).into(), + next.stack.get(2).into(), + next.stack.get(3).into(), ) } else { // MSTOREW: word comes from current stack[1..5] ( - local.stack[1].clone().into(), - local.stack[2].clone().into(), - local.stack[3].clone().into(), - local.stack[4].clone().into(), + local.stack.get(1).into(), + local.stack.get(2).into(), + local.stack.get(3).into(), + local.stack.get(4).into(), ) }; - challenges.encode([label, ctx, addr, clk, w0, w1, w2, w3]) + challenges.encode(bus_types::CHIPLETS_BUS, [label, ctx, addr, clk, w0, w1, w2, w3]) } /// Computes the memory element request message value. /// -/// Format: alpha + beta^0*label + beta^1*ctx + beta^2*addr + beta^3*clk + beta^4*element -fn compute_memory_element_request>( - local: &MainTraceRow, - next: &MainTraceRow, +/// Format: bus_prefix[CHIPLETS_BUS] + beta^0*label + beta^1*ctx + beta^2*addr + beta^3*clk + +/// beta^4*element +fn compute_memory_element_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, is_read: bool, ) -> AB::ExprEF { @@ -453,248 +433,275 @@ fn compute_memory_element_request>( let label: AB::Expr = AB::Expr::from_u16(label as u16); // Context and clock from system columns - let ctx: AB::Expr = local.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); + let ctx: AB::Expr = local.system.ctx.into(); + let clk: AB::Expr = local.system.clk.into(); // Address is at stack[0] - let addr: AB::Expr = local.stack[0].clone().into(); + let addr: AB::Expr = local.stack.get(0).into(); // Element value let element = if is_read { // MLOAD: element comes from next stack[0] - next.stack[0].clone().into() + next.stack.get(0).into() } else { // MSTORE: element comes from current stack[1] - local.stack[1].clone().into() + local.stack.get(1).into() }; - challenges.encode([label, ctx, addr, clk, element]) + challenges.encode(bus_types::CHIPLETS_BUS, [label, ctx, addr, clk, element]) } /// Computes the MSTREAM request message value (two word reads). -fn compute_mstream_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_mstream_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { let label: AB::Expr = AB::Expr::from_u16(MEMORY_READ_WORD_LABEL as u16); - let ctx: AB::Expr = local.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); - let addr: AB::Expr = local.stack[12].clone().into(); + let ctx: AB::Expr = local.system.ctx.into(); + let clk: AB::Expr = local.system.clk.into(); + let addr: AB::Expr = local.stack.get(12).into(); let four: AB::Expr = AB::Expr::from_u16(4); // First word: next.stack[0..4] at addr let word1 = [ - next.stack[0].clone().into(), - next.stack[1].clone().into(), - next.stack[2].clone().into(), - next.stack[3].clone().into(), + next.stack.get(0).into(), + next.stack.get(1).into(), + next.stack.get(2).into(), + next.stack.get(3).into(), ]; // Second word: next.stack[4..8] at addr + 4 let word2 = [ - next.stack[4].clone().into(), - next.stack[5].clone().into(), - next.stack[6].clone().into(), - next.stack[7].clone().into(), + next.stack.get(4).into(), + next.stack.get(5).into(), + next.stack.get(6).into(), + next.stack.get(7).into(), ]; - let msg1 = challenges.encode([ - label.clone(), - ctx.clone(), - addr.clone(), - clk.clone(), - word1[0].clone(), - word1[1].clone(), - word1[2].clone(), - word1[3].clone(), - ]); - - let msg2 = challenges.encode([ - label, - ctx, - addr + four.clone(), - clk, - word2[0].clone(), - word2[1].clone(), - word2[2].clone(), - word2[3].clone(), - ]); + let msg1 = challenges.encode( + bus_types::CHIPLETS_BUS, + [ + label.clone(), + ctx.clone(), + addr.clone(), + clk.clone(), + word1[0].clone(), + word1[1].clone(), + word1[2].clone(), + word1[3].clone(), + ], + ); + + let msg2 = challenges.encode( + bus_types::CHIPLETS_BUS, + [ + label, + ctx, + addr + four.clone(), + clk, + word2[0].clone(), + word2[1].clone(), + word2[2].clone(), + word2[3].clone(), + ], + ); msg1 * msg2 } /// Computes the PIPE request message value (two word writes). -fn compute_pipe_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_pipe_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { let label: AB::Expr = AB::Expr::from_u16(MEMORY_WRITE_WORD_LABEL as u16); - let ctx: AB::Expr = local.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); - let addr: AB::Expr = local.stack[12].clone().into(); + let ctx: AB::Expr = local.system.ctx.into(); + let clk: AB::Expr = local.system.clk.into(); + let addr: AB::Expr = local.stack.get(12).into(); let four: AB::Expr = AB::Expr::from_u16(4); // First word to addr: next.stack[0..4] let word1 = [ - next.stack[0].clone().into(), - next.stack[1].clone().into(), - next.stack[2].clone().into(), - next.stack[3].clone().into(), + next.stack.get(0).into(), + next.stack.get(1).into(), + next.stack.get(2).into(), + next.stack.get(3).into(), ]; // Second word to addr + 4: next.stack[4..8] let word2 = [ - next.stack[4].clone().into(), - next.stack[5].clone().into(), - next.stack[6].clone().into(), - next.stack[7].clone().into(), + next.stack.get(4).into(), + next.stack.get(5).into(), + next.stack.get(6).into(), + next.stack.get(7).into(), ]; - let msg1 = challenges.encode([ - label.clone(), - ctx.clone(), - addr.clone(), - clk.clone(), - word1[0].clone(), - word1[1].clone(), - word1[2].clone(), - word1[3].clone(), - ]); - - let msg2 = challenges.encode([ - label, - ctx, - addr + four.clone(), - clk, - word2[0].clone(), - word2[1].clone(), - word2[2].clone(), - word2[3].clone(), - ]); + let msg1 = challenges.encode( + bus_types::CHIPLETS_BUS, + [ + label.clone(), + ctx.clone(), + addr.clone(), + clk.clone(), + word1[0].clone(), + word1[1].clone(), + word1[2].clone(), + word1[3].clone(), + ], + ); + + let msg2 = challenges.encode( + bus_types::CHIPLETS_BUS, + [ + label, + ctx, + addr + four.clone(), + clk, + word2[0].clone(), + word2[1].clone(), + word2[2].clone(), + word2[3].clone(), + ], + ); msg1 * msg2 } /// Computes the CRYPTOSTREAM request value (two word reads + two word writes). -fn compute_cryptostream_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_cryptostream_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { let read_label: AB::Expr = AB::Expr::from_u16(MEMORY_READ_WORD_LABEL as u16); let write_label: AB::Expr = AB::Expr::from_u16(MEMORY_WRITE_WORD_LABEL as u16); - let ctx: AB::Expr = local.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); - let src: AB::Expr = local.stack[12].clone().into(); - let dst: AB::Expr = local.stack[13].clone().into(); + let ctx: AB::Expr = local.system.ctx.into(); + let clk: AB::Expr = local.system.clk.into(); + let src: AB::Expr = local.stack.get(12).into(); + let dst: AB::Expr = local.stack.get(13).into(); let four: AB::Expr = AB::Expr::from_u16(4); - let rate: [AB::Expr; 8] = core::array::from_fn(|i| local.stack[i].clone().into()); - let cipher: [AB::Expr; 8] = core::array::from_fn(|i| next.stack[i].clone().into()); + let rate: [AB::Expr; 8] = core::array::from_fn(|i| local.stack.get(i).into()); + let cipher: [AB::Expr; 8] = core::array::from_fn(|i| next.stack.get(i).into()); let plain: [AB::Expr; 8] = core::array::from_fn(|i| cipher[i].clone() - rate[i].clone()); - let read_msg1 = challenges.encode([ - read_label.clone(), - ctx.clone(), - src.clone(), - clk.clone(), - plain[0].clone(), - plain[1].clone(), - plain[2].clone(), - plain[3].clone(), - ]); - - let read_msg2 = challenges.encode([ - read_label, - ctx.clone(), - src + four.clone(), - clk.clone(), - plain[4].clone(), - plain[5].clone(), - plain[6].clone(), - plain[7].clone(), - ]); - - let write_msg1 = challenges.encode([ - write_label.clone(), - ctx.clone(), - dst.clone(), - clk.clone(), - cipher[0].clone(), - cipher[1].clone(), - cipher[2].clone(), - cipher[3].clone(), - ]); - - let write_msg2 = challenges.encode([ - write_label, - ctx, - dst + four, - clk, - cipher[4].clone(), - cipher[5].clone(), - cipher[6].clone(), - cipher[7].clone(), - ]); + let read_msg1 = challenges.encode( + bus_types::CHIPLETS_BUS, + [ + read_label.clone(), + ctx.clone(), + src.clone(), + clk.clone(), + plain[0].clone(), + plain[1].clone(), + plain[2].clone(), + plain[3].clone(), + ], + ); + + let read_msg2 = challenges.encode( + bus_types::CHIPLETS_BUS, + [ + read_label, + ctx.clone(), + src + four.clone(), + clk.clone(), + plain[4].clone(), + plain[5].clone(), + plain[6].clone(), + plain[7].clone(), + ], + ); + + let write_msg1 = challenges.encode( + bus_types::CHIPLETS_BUS, + [ + write_label.clone(), + ctx.clone(), + dst.clone(), + clk.clone(), + cipher[0].clone(), + cipher[1].clone(), + cipher[2].clone(), + cipher[3].clone(), + ], + ); + + let write_msg2 = challenges.encode( + bus_types::CHIPLETS_BUS, + [ + write_label, + ctx, + dst + four, + clk, + cipher[4].clone(), + cipher[5].clone(), + cipher[6].clone(), + cipher[7].clone(), + ], + ); read_msg1 * read_msg2 * write_msg1 * write_msg2 } /// Computes the HORNERBASE request value (two element reads). -fn compute_hornerbase_request>( - local: &MainTraceRow, +fn compute_hornerbase_request( + local: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { let label: AB::Expr = AB::Expr::from_u16(MEMORY_READ_ELEMENT_LABEL as u16); - let ctx: AB::Expr = local.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); - let addr: AB::Expr = local.stack[13].clone().into(); + let ctx: AB::Expr = local.system.ctx.into(); + let clk: AB::Expr = local.system.clk.into(); + let addr: AB::Expr = local.stack.get(13).into(); let one: AB::Expr = AB::Expr::ONE; // Helper registers hold eval_point_0 and eval_point_1 - let helper0_idx = USER_OP_HELPERS_OFFSET; - let helper1_idx = helper0_idx + 1; - let eval0: AB::Expr = local.decoder[helper0_idx].clone().into(); - let eval1: AB::Expr = local.decoder[helper1_idx].clone().into(); + let eval0: AB::Expr = local.decoder.hasher_state[2].into(); + let eval1: AB::Expr = local.decoder.hasher_state[3].into(); - let msg0 = challenges.encode([label.clone(), ctx.clone(), addr.clone(), clk.clone(), eval0]); + let msg0 = challenges.encode( + bus_types::CHIPLETS_BUS, + [label.clone(), ctx.clone(), addr.clone(), clk.clone(), eval0], + ); - let msg1 = challenges.encode([label, ctx, addr + one, clk, eval1]); + let msg1 = challenges.encode(bus_types::CHIPLETS_BUS, [label, ctx, addr + one, clk, eval1]); msg0 * msg1 } /// Computes the HORNEREXT request value (one word read). -fn compute_hornerext_request>( - local: &MainTraceRow, +fn compute_hornerext_request( + local: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { let label: AB::Expr = AB::Expr::from_u16(MEMORY_READ_WORD_LABEL as u16); - let ctx: AB::Expr = local.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); - let addr: AB::Expr = local.stack[13].clone().into(); + let ctx: AB::Expr = local.system.ctx.into(); + let clk: AB::Expr = local.system.clk.into(); + let addr: AB::Expr = local.stack.get(13).into(); // Helpers 0..3 hold eval_point_0, eval_point_1, mem_junk_0, mem_junk_1 - let base = USER_OP_HELPERS_OFFSET; let word = [ - local.decoder[base].clone().into(), - local.decoder[base + 1].clone().into(), - local.decoder[base + 2].clone().into(), - local.decoder[base + 3].clone().into(), + local.decoder.hasher_state[2].into(), + local.decoder.hasher_state[3].into(), + local.decoder.hasher_state[4].into(), + local.decoder.hasher_state[5].into(), ]; - challenges.encode([ - label, - ctx, - addr, - clk, - word[0].clone(), - word[1].clone(), - word[2].clone(), - word[3].clone(), - ]) + challenges.encode( + bus_types::CHIPLETS_BUS, + [ + label, + ctx, + addr, + clk, + word[0].clone(), + word[1].clone(), + word[2].clone(), + word[3].clone(), + ], + ) } /// Computes the memory chiplet response message value. @@ -702,8 +709,8 @@ fn compute_hornerext_request>( /// The memory chiplet uses different labels for read/write and element/word operations. /// Address is computed as: word + 2*idx1 + idx0 /// For element access, the correct element is selected based on idx0, idx1. -fn compute_memory_response>( - local: &MainTraceRow, +fn compute_memory_response( + local: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { use crate::trace::chiplets::{NUM_MEMORY_SELECTORS, memory}; @@ -711,14 +718,13 @@ fn compute_memory_response>( // Memory chiplet columns (offset by NUM_MEMORY_SELECTORS=3 for s0, s1, s2 selectors) // local.chiplets is relative to CHIPLETS_OFFSET, memory columns start at index 3 let mem_offset = NUM_MEMORY_SELECTORS; - let is_read: AB::Expr = local.chiplets[mem_offset + memory::IS_READ_COL_IDX].clone().into(); - let is_word: AB::Expr = - local.chiplets[mem_offset + memory::IS_WORD_ACCESS_COL_IDX].clone().into(); - let ctx: AB::Expr = local.chiplets[mem_offset + memory::CTX_COL_IDX].clone().into(); - let word: AB::Expr = local.chiplets[mem_offset + memory::WORD_COL_IDX].clone().into(); - let idx0: AB::Expr = local.chiplets[mem_offset + memory::IDX0_COL_IDX].clone().into(); - let idx1: AB::Expr = local.chiplets[mem_offset + memory::IDX1_COL_IDX].clone().into(); - let clk: AB::Expr = local.chiplets[mem_offset + memory::CLK_COL_IDX].clone().into(); + let is_read: AB::Expr = local.chiplets[mem_offset + memory::IS_READ_COL_IDX].into(); + let is_word: AB::Expr = local.chiplets[mem_offset + memory::IS_WORD_ACCESS_COL_IDX].into(); + let ctx: AB::Expr = local.chiplets[mem_offset + memory::CTX_COL_IDX].into(); + let word: AB::Expr = local.chiplets[mem_offset + memory::WORD_COL_IDX].into(); + let idx0: AB::Expr = local.chiplets[mem_offset + memory::IDX0_COL_IDX].into(); + let idx1: AB::Expr = local.chiplets[mem_offset + memory::IDX1_COL_IDX].into(); + let clk: AB::Expr = local.chiplets[mem_offset + memory::CLK_COL_IDX].into(); // Compute address: addr = word + 2*idx1 + idx0 let addr: AB::Expr = word + idx1.clone() * AB::Expr::from_u16(2) + idx0.clone(); @@ -736,10 +742,10 @@ fn compute_memory_response>( let label = (one.clone() - is_read.clone()) * write_label + is_read.clone() * read_label; // Get value columns (v0, v1, v2, v3) - let v0: AB::Expr = local.chiplets[mem_offset + memory::V_COL_RANGE.start].clone().into(); - let v1: AB::Expr = local.chiplets[mem_offset + memory::V_COL_RANGE.start + 1].clone().into(); - let v2: AB::Expr = local.chiplets[mem_offset + memory::V_COL_RANGE.start + 2].clone().into(); - let v3: AB::Expr = local.chiplets[mem_offset + memory::V_COL_RANGE.start + 3].clone().into(); + let v0: AB::Expr = local.chiplets[mem_offset + memory::V_COL_RANGE.start].into(); + let v1: AB::Expr = local.chiplets[mem_offset + memory::V_COL_RANGE.start + 1].into(); + let v2: AB::Expr = local.chiplets[mem_offset + memory::V_COL_RANGE.start + 2].into(); + let v3: AB::Expr = local.chiplets[mem_offset + memory::V_COL_RANGE.start + 3].into(); // For element access, select the correct element based on idx0, idx1: // - (0,0) -> v0, (1,0) -> v1, (0,1) -> v2, (1,1) -> v3 @@ -754,11 +760,14 @@ fn compute_memory_response>( let is_element = one.clone() - is_word.clone(); // Element access: include the selected element in the last slot. - let element_msg = - challenges.encode([label.clone(), ctx.clone(), addr.clone(), clk.clone(), element]); + let element_msg = challenges.encode( + bus_types::CHIPLETS_BUS, + [label.clone(), ctx.clone(), addr.clone(), clk.clone(), element], + ); // Word access: include all 4 values. - let word_msg = challenges.encode([label, ctx, addr, clk, v0, v1, v2, v3]); + let word_msg = + challenges.encode(bus_types::CHIPLETS_BUS, [label, ctx, addr, clk, v0, v1, v2, v3]); // Select based on is_word element_msg * is_element + word_msg * is_word @@ -773,138 +782,114 @@ struct HasherResponse { flag_sum: E, } -/// Computes the hasher chiplet response message value. +/// Computes the hasher chiplet response. +/// +/// Only hasher controller rows (dispatch, `s_ctrl = 1`) produce bus responses. +/// Hasher permutation segment rows (compute, `s_perm = 1`) do not contribute. +/// +/// **Controller input rows** (`s0 = 1`): +/// - Sponge start (`is_boundary=1`, `s1=0`, `s2=0`): full 12-element state +/// - Sponge continuation (`is_boundary=0`, `s1=0`, `s2=0`): rate-only 8 elements (RESPAN) +/// - Tree start (`is_boundary=1`, `s1=1` or `s2=1`): leaf word /// -/// The hasher responds at two cycle positions: -/// - Row 0: Initialization (f_bp, f_mp, f_mv, f_mu) -/// - Row 31: Output/Absorption (f_hout, f_sout, f_abp) -fn compute_hasher_response>( - local: &MainTraceRow, - next: &MainTraceRow, +/// **Controller output rows** (`s0 = 0`, `s1 = 0`): +/// - HOUT (`s2=0`): digest +/// - SOUT (`s2=1`) + `is_boundary=1`: full 12-element state +/// +/// No response on: hasher permutation segment rows, padding rows (`s0=0, s1=1`), +/// tree continuations (`is_boundary=0`), or intermediate SOUT (`is_boundary=0`). +fn compute_hasher_response( + local: &MainCols, + next: &MainCols, challenges: &Challenges, - cycle_row_0: AB::Expr, - cycle_row_31: AB::Expr, + controller_flag: AB::Expr, ) -> HasherResponse { use crate::trace::{ CHIPLETS_OFFSET, - chiplets::{HASHER_NODE_INDEX_COL_IDX, HASHER_STATE_COL_RANGE}, + chiplets::{HASHER_IS_BOUNDARY_COL_IDX, HASHER_NODE_INDEX_COL_IDX, HASHER_STATE_COL_RANGE}, }; let one = AB::Expr::ONE; - // Hasher is active when chiplets[0] == 0 - let hasher_active: AB::Expr = one.clone() - local.chiplets[0].clone().into(); - - // Hasher selectors (when hasher is active, chiplets[0]=0) - // chiplets[1..4] are the hasher's internal selectors s0, s1, s2 - let hs0: AB::Expr = local.chiplets[1].clone().into(); - let hs1: AB::Expr = local.chiplets[2].clone().into(); - let hs2: AB::Expr = local.chiplets[3].clone().into(); - - // Compute operation flags (each flag is active at most once) - // All hasher flags require hasher_active (chiplets[0] == 0) - // Row 0 flags: - // f_bp = hasher_active * cycle_row_0 * s0 * !s1 * !s2 - let f_bp = hasher_active.clone() - * cycle_row_0.clone() - * hs0.clone() - * (one.clone() - hs1.clone()) - * (one.clone() - hs2.clone()); - // f_mp = hasher_active * cycle_row_0 * s0 * !s1 * s2 - let f_mp = hasher_active.clone() - * cycle_row_0.clone() - * hs0.clone() - * (one.clone() - hs1.clone()) - * hs2.clone(); - // f_mv = hasher_active * cycle_row_0 * s0 * s1 * !s2 - let f_mv = hasher_active.clone() - * cycle_row_0.clone() - * hs0.clone() - * hs1.clone() - * (one.clone() - hs2.clone()); - // f_mu = hasher_active * cycle_row_0 * s0 * s1 * s2 - let f_mu = - hasher_active.clone() * cycle_row_0.clone() * hs0.clone() * hs1.clone() * hs2.clone(); - - // Row 31 flags: - // f_hout = hasher_active * cycle_row_31 * !s0 * !s1 * !s2 - let f_hout = hasher_active.clone() - * cycle_row_31.clone() - * (one.clone() - hs0.clone()) - * (one.clone() - hs1.clone()) - * (one.clone() - hs2.clone()); - // f_sout = hasher_active * cycle_row_31 * !s0 * !s1 * s2 - let f_sout = hasher_active.clone() - * cycle_row_31.clone() - * (one.clone() - hs0.clone()) - * (one.clone() - hs1.clone()) - * hs2.clone(); - // f_abp = hasher_active * cycle_row_31 * s0 * !s1 * !s2 - let f_abp = hasher_active.clone() - * cycle_row_31.clone() - * hs0.clone() - * (one.clone() - hs1.clone()) - * (one.clone() - hs2.clone()); - - // Get current hasher state (12 elements) and node index - let state: [AB::Expr; 12] = core::array::from_fn(|i| { - let col_idx = HASHER_STATE_COL_RANGE.start - CHIPLETS_OFFSET + i; - local.chiplets[col_idx].clone().into() - }); - let node_index: AB::Expr = - local.chiplets[HASHER_NODE_INDEX_COL_IDX - CHIPLETS_OFFSET].clone().into(); - // Get next row's hasher state (for f_abp) - let state_next: [AB::Expr; 12] = core::array::from_fn(|i| { + // Hasher internal selectors + let s0: AB::Expr = local.chiplets[1].into(); + let s1: AB::Expr = local.chiplets[2].into(); + let s2: AB::Expr = local.chiplets[3].into(); + + // Lifecycle columns + let is_boundary: AB::Expr = local.chiplets[HASHER_IS_BOUNDARY_COL_IDX - CHIPLETS_OFFSET].into(); + // State and node_index + let state: [AB::Expr; 12] = core::array::from_fn(|i| { let col_idx = HASHER_STATE_COL_RANGE.start - CHIPLETS_OFFSET + i; - next.chiplets[col_idx].clone().into() + local.chiplets[col_idx].into() }); - - // Get next row's node_index for computing the node_index bit - let node_index_next: AB::Expr = - next.chiplets[HASHER_NODE_INDEX_COL_IDX - CHIPLETS_OFFSET].clone().into(); - - // addr_next = row + 1 (using clk as proxy since clk = row in the trace) - let addr_next: AB::Expr = local.clk.clone().into() + one.clone(); - - // Build message values for each operation type using canonical labels. - let label_bp = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + 16); - let label_mp = AB::Expr::from_u16(MP_VERIFY_LABEL as u16 + 16); - let label_mv = AB::Expr::from_u16(MR_UPDATE_OLD_LABEL as u16 + 16); - let label_mu = AB::Expr::from_u16(MR_UPDATE_NEW_LABEL as u16 + 16); - let label_hout = AB::Expr::from_u16(RETURN_HASH_LABEL as u16 + 32); - let label_sout = AB::Expr::from_u16(RETURN_STATE_LABEL as u16 + 32); - let label_abp = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + 32); - - // v_bp: Full state message for f_bp (linear hash / 2-to-1 hash init) - let v_bp = compute_hasher_message::( + let node_index: AB::Expr = local.chiplets[HASHER_NODE_INDEX_COL_IDX - CHIPLETS_OFFSET].into(); + + // Address + let addr_next: AB::Expr = local.system.clk.into() + one.clone(); + + // --- Response flags (inner, without controller_flag to keep degree low) --- + // + // controller_flag (degree 1, = s_ctrl) is factored out and applied to the entire response + // sum, keeping the max inner flag*message degree at 6 and the final degree at 7. + + // Sponge start: input, s1=0, s2=0, is_boundary=1 + let f_sponge_start = + s0.clone() * (one.clone() - s1.clone()) * (one.clone() - s2.clone()) * is_boundary.clone(); + + // Sponge continuation (RESPAN): input, s1=0, s2=0, is_boundary=0 + let f_sponge_respan = s0.clone() + * (one.clone() - s1.clone()) + * (one.clone() - s2.clone()) + * (one.clone() - is_boundary.clone()); + + // Merkle tree op start inputs (only is_boundary=1 produces response) + let f_mp_start = s0.clone() * (one.clone() - s1.clone()) * s2.clone() * is_boundary.clone(); + let f_mv_start = s0.clone() * s1.clone() * (one.clone() - s2.clone()) * is_boundary.clone(); + let f_mu_start = s0.clone() * s1.clone() * s2.clone() * is_boundary.clone(); + + // HOUT output (always responds) + let f_hout = + (one.clone() - s0.clone()) * (one.clone() - s1.clone()) * (one.clone() - s2.clone()); + + // SOUT output with is_boundary=1 only (HPERM return) + let f_sout_final = + (one.clone() - s0.clone()) * (one.clone() - s1.clone()) * s2.clone() * is_boundary; + + // --- Message values --- + + let label_sponge_start = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + INPUT_LABEL_OFFSET); + let label_sponge_respan = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + OUTPUT_LABEL_OFFSET); + let label_mp = AB::Expr::from_u16(MP_VERIFY_LABEL as u16 + INPUT_LABEL_OFFSET); + let label_mv = AB::Expr::from_u16(MR_UPDATE_OLD_LABEL as u16 + INPUT_LABEL_OFFSET); + let label_mu = AB::Expr::from_u16(MR_UPDATE_NEW_LABEL as u16 + INPUT_LABEL_OFFSET); + let label_hout = AB::Expr::from_u16(RETURN_HASH_LABEL as u16 + OUTPUT_LABEL_OFFSET); + let label_sout = AB::Expr::from_u16(RETURN_STATE_LABEL as u16 + OUTPUT_LABEL_OFFSET); + + // Sponge start: full 12-element state, node_index=0 (sponge doesn't use index) + let v_sponge_start = compute_hasher_message::( challenges, - label_bp, + label_sponge_start, addr_next.clone(), - node_index.clone(), + AB::Expr::ZERO, &state, ); - // v_sout: Full state message for f_sout (return full state) - let v_sout = compute_hasher_message::( + // Sponge continuation (RESPAN): rate-only 8 elements, addr_next directly + let rate: [AB::Expr; 8] = core::array::from_fn(|i| state[i].clone()); + let v_sponge_respan = compute_hasher_rate_message::( challenges, - label_sout, + label_sponge_respan, addr_next.clone(), - node_index.clone(), - &state, + AB::Expr::ZERO, + &rate, ); - // v_leaf: Leaf node message (for f_mp, f_mv, f_mu) - // The leaf is encoded as a 4-lane word, matching the processor. - // The bit determines which part of the trace state to use: - // - bit=0: use RATE0 (state[0..4]) - // - bit=1: use RATE1 (state[4..8]) - // The bit can be computed as: bit = node_index - 2 * node_index_next + // Merkle tree inputs: leaf word selected by direction bit let two = AB::Expr::from_u16(2); - let bit = node_index.clone() - two * node_index_next.clone(); - - // Leaf word uses RATE0 or RATE1 depending on bit: - // bit=0: use state[0..4] (RATE0) - // bit=1: use state[4..8] (RATE1) + let node_index_next: AB::Expr = + next.chiplets[HASHER_NODE_INDEX_COL_IDX - CHIPLETS_OFFSET].into(); + let bit = node_index.clone() - two * node_index_next; let leaf_word: [AB::Expr; 4] = [ (one.clone() - bit.clone()) * state[0].clone() + bit.clone() * state[4].clone(), (one.clone() - bit.clone()) * state[1].clone() + bit.clone() * state[5].clone(), @@ -933,55 +918,46 @@ fn compute_hasher_response>( &leaf_word, ); - // v_hout: Hash output message (for f_hout) - // Digest from RATE0 (state[0..4]) encoded as a 4-lane word. - let result_word: [AB::Expr; 4] = - [state[0].clone(), state[1].clone(), state[2].clone(), state[3].clone()]; + // HOUT: digest from RATE0 (state[0..4]) + let digest: [AB::Expr; 4] = core::array::from_fn(|i| state[i].clone()); let v_hout = compute_hasher_word_message::( challenges, label_hout, addr_next.clone(), node_index.clone(), - &result_word, + &digest, ); - // v_abp: Absorption message (for f_abp) - uses NEXT row's rate (8 elements) - // Rate from state_next[0..8] is encoded as an 8-lane rate message. - let rate_next: [AB::Expr; 8] = [ - state_next[0].clone(), - state_next[1].clone(), - state_next[2].clone(), - state_next[3].clone(), - state_next[4].clone(), - state_next[5].clone(), - state_next[6].clone(), - state_next[7].clone(), - ]; - let v_abp = compute_hasher_rate_message::( - challenges, - label_abp, - addr_next.clone(), - node_index.clone(), - &rate_next, - ); - - // Sum of all hasher response flags - let flag_sum = f_bp.clone() - + f_mp.clone() - + f_mv.clone() - + f_mu.clone() + // SOUT: full 12-element state (HPERM return), node_index=0 + let v_sout = + compute_hasher_message::(challenges, label_sout, addr_next, AB::Expr::ZERO, &state); + + // --- Additive OR combination --- + // + // The inner flag_sum and sum are computed without controller_flag. The controller_flag + // is applied as a multiplicative factor to the entire sum, keeping the degree within + // budget: inner_flag(4) * message(2) = 6, * controller_flag(1) = 7. + + let inner_flag_sum = f_sponge_start.clone() + + f_sponge_respan.clone() + + f_mp_start.clone() + + f_mv_start.clone() + + f_mu_start.clone() + f_hout.clone() - + f_sout.clone() - + f_abp.clone(); - - // Sum of response values (rest term handled by caller). - let sum = v_bp * f_bp - + v_mp * f_mp - + v_mv * f_mv - + v_mu * f_mu + + f_sout_final.clone(); + + let inner_sum = v_sponge_start * f_sponge_start + + v_sponge_respan * f_sponge_respan + + v_mp * f_mp_start + + v_mv * f_mv_start + + v_mu * f_mu_start + v_hout * f_hout - + v_sout * f_sout - + v_abp * f_abp; + + v_sout * f_sout_final; + + // Apply controller_flag to the entire response. On perm segment and non-hasher rows, + // controller_flag=0 so the hasher contributes nothing (identity via the outer 1-flag_sum). + let flag_sum = controller_flag.clone() * inner_flag_sum; + let sum = inner_sum * controller_flag; HasherResponse { sum, flag_sum } } @@ -998,24 +974,22 @@ fn compute_hasher_response>( /// The combined request is the product of these two message values. /// /// Stack layout: [s0, s1, ..., s11, ...] -> [s0', s1', ..., s11', ...] -fn compute_hperm_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_hperm_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { - use crate::trace::decoder::USER_OP_HELPERS_OFFSET; - // Hasher address from helper register 0 - let addr: AB::Expr = local.decoder[USER_OP_HELPERS_OFFSET].clone().into(); + let addr: AB::Expr = local.decoder.hasher_state[2].into(); // Input state from current stack[0..12] - let input_state: [AB::Expr; 12] = core::array::from_fn(|i| local.stack[i].clone().into()); + let input_state: [AB::Expr; 12] = core::array::from_fn(|i| local.stack.get(i).into()); // Output state from next stack[0..12] - let output_state: [AB::Expr; 12] = core::array::from_fn(|i| next.stack[i].clone().into()); + let output_state: [AB::Expr; 12] = core::array::from_fn(|i| next.stack.get(i).into()); // Input message: transition_label = LINEAR_HASH_LABEL + 16 = 3 + 16 = 19 - let input_label: AB::Expr = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + 16); + let input_label: AB::Expr = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + INPUT_LABEL_OFFSET); let node_index_zero: AB::Expr = AB::Expr::ZERO; let input_msg = compute_hasher_message::( @@ -1026,10 +1000,11 @@ fn compute_hperm_request>( &input_state, ); - // Output message: transition_label = RETURN_STATE_LABEL + 32 = 9 + 32 = 41 - // addr_next = addr + (HASH_CYCLE_LEN - 1) = addr + 31 - let output_label: AB::Expr = AB::Expr::from_u16(RETURN_STATE_LABEL as u16 + 32); - let addr_offset: AB::Expr = AB::Expr::from_u16((HASH_CYCLE_LEN - 1) as u16); + // Output message: transition_label = RETURN_STATE_LABEL + 32 + // addr_next = addr + (CONTROLLER_ROWS_PER_PERMUTATION - 1) = addr + 1 + let output_label: AB::Expr = + AB::Expr::from_u16(RETURN_STATE_LABEL as u16 + OUTPUT_LABEL_OFFSET); + let addr_offset: AB::Expr = AB::Expr::from_u16((CONTROLLER_ROWS_PER_PERMUTATION - 1) as u16); let addr_next = addr + addr_offset; let output_msg = compute_hasher_message::( @@ -1048,25 +1023,24 @@ fn compute_hperm_request>( /// /// LOG_PRECOMPILE absorbs `[COMM, TAG]` with capacity `CAP_PREV` and returns `[R0, R1, CAP_NEXT]`. /// The request is the product of input (LINEAR_HASH + 16) and output (RETURN_STATE + 32) messages. -fn compute_log_precompile_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_log_precompile_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { - // Helper registers - let helper_base = USER_OP_HELPERS_OFFSET; - let addr: AB::Expr = local.decoder[helper_base + HELPER_ADDR_IDX].clone().into(); + // Helper registers (user op helpers start at hasher_state[2]) + let addr: AB::Expr = local.decoder.hasher_state[2 + HELPER_ADDR_IDX].into(); // CAP_PREV from helper registers (4 lanes) let cap_prev: [AB::Expr; 4] = core::array::from_fn(|i| { - local.decoder[helper_base + HELPER_CAP_PREV_RANGE.start + i].clone().into() + local.decoder.hasher_state[2 + HELPER_CAP_PREV_RANGE.start + i].into() }); // COMM and TAG from the current stack let comm: [AB::Expr; 4] = - core::array::from_fn(|i| local.stack[STACK_COMM_RANGE.start + i].clone().into()); + core::array::from_fn(|i| local.stack.get(STACK_COMM_RANGE.start + i).into()); let tag: [AB::Expr; 4] = - core::array::from_fn(|i| local.stack[STACK_TAG_RANGE.start + i].clone().into()); + core::array::from_fn(|i| local.stack.get(STACK_TAG_RANGE.start + i).into()); // Input state [COMM, TAG, CAP_PREV] let state_input: [AB::Expr; 12] = [ @@ -1086,11 +1060,11 @@ fn compute_log_precompile_request>( // Output state from next stack [R0, R1, CAP_NEXT] let r0: [AB::Expr; 4] = - core::array::from_fn(|i| next.stack[STACK_R0_RANGE.start + i].clone().into()); + core::array::from_fn(|i| next.stack.get(STACK_R0_RANGE.start + i).into()); let r1: [AB::Expr; 4] = - core::array::from_fn(|i| next.stack[STACK_R1_RANGE.start + i].clone().into()); + core::array::from_fn(|i| next.stack.get(STACK_R1_RANGE.start + i).into()); let cap_next: [AB::Expr; 4] = - core::array::from_fn(|i| next.stack[STACK_CAP_NEXT_RANGE.start + i].clone().into()); + core::array::from_fn(|i| next.stack.get(STACK_CAP_NEXT_RANGE.start + i).into()); let state_output: [AB::Expr; 12] = [ r0[0].clone(), r0[1].clone(), @@ -1107,7 +1081,7 @@ fn compute_log_precompile_request>( ]; // Input message: LINEAR_HASH_LABEL + 16 - let input_label: AB::Expr = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + 16); + let input_label: AB::Expr = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + INPUT_LABEL_OFFSET); let input_msg = compute_hasher_message::( challenges, input_label, @@ -1116,9 +1090,11 @@ fn compute_log_precompile_request>( &state_input, ); - // Output message: RETURN_STATE_LABEL + 32 with addr offset by HASH_CYCLE_LEN - 1 - let output_label: AB::Expr = AB::Expr::from_u16(RETURN_STATE_LABEL as u16 + 32); - let addr_offset: AB::Expr = AB::Expr::from_u16((HASH_CYCLE_LEN - 1) as u16); + // Output message: RETURN_STATE_LABEL + 32 with addr offset by CONTROLLER_ROWS_PER_PERMUTATION - + // 1 + let output_label: AB::Expr = + AB::Expr::from_u16(RETURN_STATE_LABEL as u16 + OUTPUT_LABEL_OFFSET); + let addr_offset: AB::Expr = AB::Expr::from_u16((CONTROLLER_ROWS_PER_PERMUTATION - 1) as u16); let output_msg = compute_hasher_message::( challenges, output_label, @@ -1135,72 +1111,81 @@ fn compute_log_precompile_request>( /// Format: header + state where: /// - header = alpha + beta^0 * transition_label + beta^1 * addr + beta^2 * node_index /// - state = sum(beta^(3+i) * hasher_state[i]) for i in 0..12 -fn compute_hasher_message>( +fn compute_hasher_message( challenges: &Challenges, transition_label: AB::Expr, addr: AB::Expr, node_index: AB::Expr, state: &[AB::Expr; 12], ) -> AB::ExprEF { - challenges.encode([ - transition_label, - addr, - node_index, - state[0].clone(), - state[1].clone(), - state[2].clone(), - state[3].clone(), - state[4].clone(), - state[5].clone(), - state[6].clone(), - state[7].clone(), - state[8].clone(), - state[9].clone(), - state[10].clone(), - state[11].clone(), - ]) + challenges.encode( + bus_types::CHIPLETS_BUS, + [ + transition_label, + addr, + node_index, + state[0].clone(), + state[1].clone(), + state[2].clone(), + state[3].clone(), + state[4].clone(), + state[5].clone(), + state[6].clone(), + state[7].clone(), + state[8].clone(), + state[9].clone(), + state[10].clone(), + state[11].clone(), + ], + ) } /// Computes a hasher message for a 4-lane word. -fn compute_hasher_word_message>( +fn compute_hasher_word_message( challenges: &Challenges, transition_label: AB::Expr, addr: AB::Expr, node_index: AB::Expr, word: &[AB::Expr; 4], ) -> AB::ExprEF { - challenges.encode([ - transition_label, - addr, - node_index, - word[0].clone(), - word[1].clone(), - word[2].clone(), - word[3].clone(), - ]) + challenges.encode( + bus_types::CHIPLETS_BUS, + [ + transition_label, + addr, + node_index, + word[0].clone(), + word[1].clone(), + word[2].clone(), + word[3].clone(), + ], + ) } /// Computes a hasher message for an 8-lane rate. -fn compute_hasher_rate_message>( +fn compute_hasher_rate_message( challenges: &Challenges, transition_label: AB::Expr, addr: AB::Expr, node_index: AB::Expr, rate: &[AB::Expr; 8], ) -> AB::ExprEF { - challenges.encode([ - transition_label, - addr, - node_index, - rate[0].clone(), - rate[1].clone(), - rate[2].clone(), - rate[3].clone(), - rate[4].clone(), - rate[5].clone(), - rate[6].clone(), - rate[7].clone(), - ]) + challenges.encode( + bus_types::CHIPLETS_BUS, + [ + transition_label, + addr, + node_index, + rate[0].clone(), + rate[1].clone(), + rate[2].clone(), + rate[3].clone(), + rate[4].clone(), + rate[5].clone(), + rate[6].clone(), + rate[7].clone(), + ], + ) } // ACE MESSAGE HELPERS @@ -1208,32 +1193,32 @@ fn compute_hasher_rate_message>( /// Computes the ACE request message value. /// -/// Format: alpha + beta^0*label + beta^1*clk + beta^2*ctx + beta^3*ptr +/// Format: bus_prefix[CHIPLETS_BUS] + beta^0*label + beta^1*clk + beta^2*ctx + beta^3*ptr /// + beta^4*num_read_rows + beta^5*num_eval_rows /// /// Stack layout for EVALCIRCUIT: [ptr, num_read_rows, num_eval_rows, ...] -fn compute_ace_request>( - local: &MainTraceRow, +fn compute_ace_request( + local: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { // Label is ACE_INIT_LABEL let label: AB::Expr = AB::Expr::from(ACE_INIT_LABEL); // Context and clock from system columns - let ctx: AB::Expr = local.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); + let ctx: AB::Expr = local.system.ctx.into(); + let clk: AB::Expr = local.system.clk.into(); // Stack values - let ptr: AB::Expr = local.stack[0].clone().into(); - let num_read_rows: AB::Expr = local.stack[1].clone().into(); - let num_eval_rows: AB::Expr = local.stack[2].clone().into(); + let ptr: AB::Expr = local.stack.get(0).into(); + let num_read_rows: AB::Expr = local.stack.get(1).into(); + let num_eval_rows: AB::Expr = local.stack.get(2).into(); - challenges.encode([label, clk, ctx, ptr, num_read_rows, num_eval_rows]) + challenges.encode(bus_types::CHIPLETS_BUS, [label, clk, ctx, ptr, num_read_rows, num_eval_rows]) } /// Computes the ACE chiplet response message value. /// -/// Format: alpha + beta^0*label + beta^1*clk + beta^2*ctx + beta^3*ptr +/// Format: bus_prefix[CHIPLETS_BUS] + beta^0*label + beta^1*clk + beta^2*ctx + beta^3*ptr /// + beta^4*num_read_rows + beta^5*num_eval_rows /// /// The chiplet reads from its internal columns: @@ -1242,30 +1227,29 @@ fn compute_ace_request>( /// - ptr from PTR_IDX /// - num_eval_rows computed from READ_NUM_EVAL_IDX + 1 /// - num_read_rows = id_0 + 1 - num_eval_rows -fn compute_ace_response>( - local: &MainTraceRow, +fn compute_ace_response( + local: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { // Label is ACE_INIT_LABEL let label: AB::Expr = AB::Expr::from(ACE_INIT_LABEL); // Read values from ACE chiplet columns (offset by NUM_ACE_SELECTORS) - let clk: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + CLK_IDX].clone().into(); - let ctx: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + CTX_IDX].clone().into(); - let ptr: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + PTR_IDX].clone().into(); + let clk: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + CLK_IDX].into(); + let ctx: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + CTX_IDX].into(); + let ptr: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + PTR_IDX].into(); // num_eval_rows = READ_NUM_EVAL_IDX value + 1 - let read_num_eval: AB::Expr = - local.chiplets[NUM_ACE_SELECTORS + READ_NUM_EVAL_IDX].clone().into(); + let read_num_eval: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + READ_NUM_EVAL_IDX].into(); let num_eval_rows: AB::Expr = read_num_eval + AB::Expr::ONE; // id_0 from ID_0_IDX - let id_0: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + ID_0_IDX].clone().into(); + let id_0: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + ID_0_IDX].into(); // num_read_rows = id_0 + 1 - num_eval_rows let num_read_rows: AB::Expr = id_0 + AB::Expr::ONE - num_eval_rows.clone(); - challenges.encode([label, clk, ctx, ptr, num_read_rows, num_eval_rows]) + challenges.encode(bus_types::CHIPLETS_BUS, [label, clk, ctx, ptr, num_read_rows, num_eval_rows]) } // KERNEL ROM MESSAGE HELPERS @@ -1273,18 +1257,18 @@ fn compute_ace_response>( /// Computes the kernel ROM chiplet response message value. /// -/// Format: alpha + beta^0*label + beta^1*digest[0] + beta^2*digest[1] +/// Format: bus_prefix[CHIPLETS_BUS] + beta^0*label + beta^1*digest[0] + beta^2*digest[1] /// + beta^3*digest[2] + beta^4*digest[3] /// /// The label depends on s_first flag: /// - s_first=1: KERNEL_PROC_INIT_LABEL (responding to verifier/public input init request) /// - s_first=0: KERNEL_PROC_CALL_LABEL (responding to decoder SYSCALL request) -fn compute_kernel_rom_response>( - local: &MainTraceRow, +fn compute_kernel_rom_response( + local: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { // s_first flag is at CHIPLETS_OFFSET + 5 (after 5 selectors), which is chiplets[5] - let s_first: AB::Expr = local.chiplets[NUM_KERNEL_ROM_SELECTORS].clone().into(); + let s_first: AB::Expr = local.chiplets[NUM_KERNEL_ROM_SELECTORS].into(); // Label depends on s_first: // label = s_first * INIT_LABEL + (1 - s_first) * CALL_LABEL @@ -1294,12 +1278,12 @@ fn compute_kernel_rom_response>( // Kernel procedure digest (root0..root3) at columns 6, 7, 8, 9 relative to chiplets // These are at NUM_KERNEL_ROM_SELECTORS + 1..5 (after s_first which is at +0) - let root0: AB::Expr = local.chiplets[NUM_KERNEL_ROM_SELECTORS + 1].clone().into(); - let root1: AB::Expr = local.chiplets[NUM_KERNEL_ROM_SELECTORS + 2].clone().into(); - let root2: AB::Expr = local.chiplets[NUM_KERNEL_ROM_SELECTORS + 3].clone().into(); - let root3: AB::Expr = local.chiplets[NUM_KERNEL_ROM_SELECTORS + 4].clone().into(); + let root0: AB::Expr = local.chiplets[NUM_KERNEL_ROM_SELECTORS + 1].into(); + let root1: AB::Expr = local.chiplets[NUM_KERNEL_ROM_SELECTORS + 2].into(); + let root2: AB::Expr = local.chiplets[NUM_KERNEL_ROM_SELECTORS + 3].into(); + let root3: AB::Expr = local.chiplets[NUM_KERNEL_ROM_SELECTORS + 4].into(); - challenges.encode([label, root0, root1, root2, root3]) + challenges.encode(bus_types::CHIPLETS_BUS, [label, root0, root1, root2, root3]) } // CONTROL BLOCK REQUEST HELPERS @@ -1335,24 +1319,25 @@ impl ControlBlockOp { /// - state = 12-lane sponge with 8-element decoder hasher state as rate + opcode as domain /// /// The message reconstructs: -/// - transition_label = LINEAR_HASH_LABEL + 16 = 3 + 16 = 19 +/// - transition_label = LINEAR_HASH_LABEL + 16 /// - addr_next = decoder address at next row (from next row's addr column) /// - hasher_state = rate lanes from decoder hasher columns + opcode in capacity domain position -fn compute_control_block_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_control_block_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, op: ControlBlockOp, ) -> AB::ExprEF { - // transition_label = LINEAR_HASH_LABEL + 16 = 19 - let transition_label: AB::Expr = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + 16); + // transition_label = LINEAR_HASH_LABEL + + let transition_label: AB::Expr = + AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + INPUT_LABEL_OFFSET); // addr_next = next row's decoder address - let addr_next: AB::Expr = next.decoder[ADDR_COL_IDX].clone().into(); + let addr_next: AB::Expr = next.decoder.addr.into(); // Get decoder hasher state (8 elements) let hasher_state: [AB::Expr; 8] = - core::array::from_fn(|i| local.decoder[HASHER_STATE_RANGE.start + i].clone().into()); + core::array::from_fn(|i| local.decoder.hasher_state[i].into()); // op_code as domain in capacity position let op_code: AB::Expr = AB::Expr::from_u16(op.opcode() as u16); @@ -1383,9 +1368,9 @@ fn compute_control_block_request>( /// CALL sends: /// 1. Control block request (with decoder hasher state) /// 2. FMP initialization write request (to set up new execution context) -fn compute_call_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_call_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { // Control block request @@ -1403,9 +1388,9 @@ fn compute_call_request>( /// DYN sends: /// 1. Control block request (with zeros for hasher state since callee is dynamic) /// 2. Memory read request for callee hash from stack[0] -fn compute_dyn_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_dyn_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { // Control block request with zeros for hasher state (callee is dynamic) @@ -1424,9 +1409,9 @@ fn compute_dyn_request>( /// 1. Control block request (with zeros for hasher state since callee is dynamic) /// 2. Memory read request for callee hash from stack[0] /// 3. FMP initialization write request -fn compute_dyncall_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_dyncall_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { // Control block request with zeros for hasher state (callee is dynamic) @@ -1447,9 +1432,9 @@ fn compute_dyncall_request>( /// SYSCALL sends: /// 1. Control block request (with decoder hasher state) /// 2. Kernel ROM lookup request (to verify kernel procedure) -fn compute_syscall_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_syscall_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { // Control block request @@ -1457,13 +1442,14 @@ fn compute_syscall_request>( compute_control_block_request::(local, next, challenges, ControlBlockOp::Syscall); // Kernel ROM lookup request (digest from first 4 elements of decoder hasher state) - let root0: AB::Expr = local.decoder[HASHER_STATE_RANGE.start].clone().into(); - let root1: AB::Expr = local.decoder[HASHER_STATE_RANGE.start + 1].clone().into(); - let root2: AB::Expr = local.decoder[HASHER_STATE_RANGE.start + 2].clone().into(); - let root3: AB::Expr = local.decoder[HASHER_STATE_RANGE.start + 3].clone().into(); + let root0: AB::Expr = local.decoder.hasher_state[0].into(); + let root1: AB::Expr = local.decoder.hasher_state[1].into(); + let root2: AB::Expr = local.decoder.hasher_state[2].into(); + let root3: AB::Expr = local.decoder.hasher_state[3].into(); let label: AB::Expr = AB::Expr::from(KERNEL_PROC_CALL_LABEL); - let kernel_req = challenges.encode([label, root0, root1, root2, root3]); + let kernel_req = + challenges.encode(bus_types::CHIPLETS_BUS, [label, root0, root1, root2, root3]); control_req * kernel_req } @@ -1471,20 +1457,21 @@ fn compute_syscall_request>( /// Computes the SPAN block request message value. /// /// Format: header + full 12-lane sponge state (8 rate lanes + 4 capacity lanes zeroed) -fn compute_span_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_span_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { - // transition_label = LINEAR_HASH_LABEL + 16 = 19 - let transition_label: AB::Expr = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + 16); + // transition_label = LINEAR_HASH_LABEL + 16 + let transition_label: AB::Expr = + AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + INPUT_LABEL_OFFSET); // addr_next = next row's decoder address - let addr_next: AB::Expr = next.decoder[ADDR_COL_IDX].clone().into(); + let addr_next: AB::Expr = next.decoder.addr.into(); // Get decoder hasher state (8 elements) let hasher_state: [AB::Expr; 8] = - core::array::from_fn(|i| local.decoder[HASHER_STATE_RANGE.start + i].clone().into()); + core::array::from_fn(|i| local.decoder.hasher_state[i].into()); // Build full 12-lane state with capacity zeroed let state: [AB::Expr; 12] = [ @@ -1508,21 +1495,24 @@ fn compute_span_request>( /// Computes the RESPAN block request message value. /// /// Rate occupies message positions 3..10 (after label/addr/node_index). -fn compute_respan_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_respan_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { - // transition_label = LINEAR_HASH_LABEL + 32 = 35 - let transition_label: AB::Expr = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + 32); + // transition_label = LINEAR_HASH_LABEL + 32 + let transition_label: AB::Expr = + AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + OUTPUT_LABEL_OFFSET); - // RESPAN message uses addr_next - 1, where addr_next is the next row's decoder address - let addr_next: AB::Expr = next.decoder[ADDR_COL_IDX].clone().into(); - let addr_for_msg = addr_next - AB::Expr::ONE; + // RESPAN message uses addr_next directly (the next row's decoder address). + // In the controller/perm split, addr_next points directly to the continuation + // input row -- no offset needed. + let addr_next: AB::Expr = next.decoder.addr.into(); + let addr_for_msg = addr_next; // Get decoder hasher state (8 elements) let hasher_state: [AB::Expr; 8] = - core::array::from_fn(|i| local.decoder[HASHER_STATE_RANGE.start + i].clone().into()); + core::array::from_fn(|i| local.decoder.hasher_state[i].into()); compute_hasher_rate_message::( challenges, @@ -1536,36 +1526,37 @@ fn compute_respan_request>( /// Computes the END block request message value. /// /// Digest occupies message positions 3..6 (after label/addr/node_index). -fn compute_end_request>( - local: &MainTraceRow, +fn compute_end_request( + local: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { - // transition_label = RETURN_HASH_LABEL + 32 = 1 + 32 = 33 - let transition_label: AB::Expr = AB::Expr::from_u16(RETURN_HASH_LABEL as u16 + 32); + // transition_label = RETURN_HASH_LABEL + 32 = 1 + 32 + let transition_label: AB::Expr = + AB::Expr::from_u16(RETURN_HASH_LABEL as u16 + OUTPUT_LABEL_OFFSET); - // addr = decoder.addr + (HASH_CYCLE_LEN - 1) = addr + 31 - let addr: AB::Expr = local.decoder[ADDR_COL_IDX].clone().into() - + AB::Expr::from_u16((HASH_CYCLE_LEN - 1) as u16); + // addr = decoder.addr + (CONTROLLER_ROWS_PER_PERMUTATION - 1) = addr + 1 + let addr: AB::Expr = local.decoder.addr.into() + + AB::Expr::from_u16((CONTROLLER_ROWS_PER_PERMUTATION - 1) as u16); // Get digest from decoder hasher state (first 4 elements) - let digest: [AB::Expr; 4] = - core::array::from_fn(|i| local.decoder[HASHER_STATE_RANGE.start + i].clone().into()); + let digest: [AB::Expr; 4] = core::array::from_fn(|i| local.decoder.hasher_state[i].into()); compute_hasher_word_message::(challenges, transition_label, addr, AB::Expr::ZERO, &digest) } /// Computes control block request with zeros for hasher state (for DYN/DYNCALL). -fn compute_control_block_request_zeros>( - _local: &MainTraceRow, - next: &MainTraceRow, +fn compute_control_block_request_zeros( + _local: &MainCols, + next: &MainCols, challenges: &Challenges, opcode: u8, ) -> AB::ExprEF { - // transition_label = LINEAR_HASH_LABEL + 16 = 19 - let transition_label: AB::Expr = AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + 16); + // transition_label = LINEAR_HASH_LABEL + 16 + let transition_label: AB::Expr = + AB::Expr::from_u16(LINEAR_HASH_LABEL as u16 + INPUT_LABEL_OFFSET); // addr_next = next row's decoder address - let addr_next: AB::Expr = next.decoder[ADDR_COL_IDX].clone().into(); + let addr_next: AB::Expr = next.decoder.addr.into(); // op_code as domain let op_code: AB::Expr = AB::Expr::from_u16(opcode as u16); @@ -1592,42 +1583,42 @@ fn compute_control_block_request_zeros>( /// Computes the FMP initialization write request. /// /// This writes FMP_INIT_VALUE to FMP_ADDR in the new context. -fn compute_fmp_write_request>( - local: &MainTraceRow, - next: &MainTraceRow, +fn compute_fmp_write_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { let label: AB::Expr = AB::Expr::from_u16(MEMORY_WRITE_ELEMENT_LABEL as u16); // ctx from next row (new execution context) - let ctx: AB::Expr = next.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); + let ctx: AB::Expr = next.system.ctx.into(); + let clk: AB::Expr = local.system.clk.into(); let addr: AB::Expr = AB::Expr::from(FMP_ADDR); let element: AB::Expr = AB::Expr::from(FMP_INIT_VALUE); - challenges.encode([label, ctx, addr, clk, element]) + challenges.encode(bus_types::CHIPLETS_BUS, [label, ctx, addr, clk, element]) } /// Computes the callee hash read request for DYN/DYNCALL. /// /// Reads a word from the address at stack[0] containing the callee hash. -fn compute_dyn_callee_hash_read>( - local: &MainTraceRow, +fn compute_dyn_callee_hash_read( + local: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { let label: AB::Expr = AB::Expr::from_u16(MEMORY_READ_WORD_LABEL as u16); - let ctx: AB::Expr = local.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); - let addr: AB::Expr = local.stack[0].clone().into(); + let ctx: AB::Expr = local.system.ctx.into(); + let clk: AB::Expr = local.system.clk.into(); + let addr: AB::Expr = local.stack.get(0).into(); // The callee hash is read into decoder hasher state first half - let w0: AB::Expr = local.decoder[HASHER_STATE_RANGE.start].clone().into(); - let w1: AB::Expr = local.decoder[HASHER_STATE_RANGE.start + 1].clone().into(); - let w2: AB::Expr = local.decoder[HASHER_STATE_RANGE.start + 2].clone().into(); - let w3: AB::Expr = local.decoder[HASHER_STATE_RANGE.start + 3].clone().into(); + let w0: AB::Expr = local.decoder.hasher_state[0].into(); + let w1: AB::Expr = local.decoder.hasher_state[1].into(); + let w2: AB::Expr = local.decoder.hasher_state[2].into(); + let w3: AB::Expr = local.decoder.hasher_state[3].into(); - challenges.encode([label, ctx, addr, clk, w0, w1, w2, w3]) + challenges.encode(bus_types::CHIPLETS_BUS, [label, ctx, addr, clk, w0, w1, w2, w3]) } // MPVERIFY/MRUPDATE REQUEST HELPERS @@ -1635,25 +1626,23 @@ fn compute_dyn_callee_hash_read>( /// Computes the MPVERIFY request message value. /// -/// MPVERIFY sends two messages: -/// 1. Input: node value at RATE1 (indices 4..8) -/// 2. Output: root value at RATE1 (indices 4..8) -fn compute_mpverify_request>( - local: &MainTraceRow, +/// MPVERIFY sends two messages as a product: +/// 1. Input: node value (stack[0..4]) with node_index +/// 2. Output: root digest (stack[6..10]) at the computed output address +fn compute_mpverify_request( + local: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { - use crate::trace::decoder::USER_OP_HELPERS_OFFSET; - - let helper_0: AB::Expr = local.decoder[USER_OP_HELPERS_OFFSET].clone().into(); - let merkle_cycle_len: AB::Expr = AB::Expr::from_u16(HASH_CYCLE_LEN as u16); + let helper_0: AB::Expr = local.decoder.hasher_state[2].into(); + let rows_per_perm: AB::Expr = AB::Expr::from_u16(CONTROLLER_ROWS_PER_PERMUTATION as u16); // Stack layout: [node_value0..3, node_depth, node_index, root0..3, ...] - let node_value: [AB::Expr; 4] = core::array::from_fn(|i| local.stack[i].clone().into()); - let node_depth: AB::Expr = local.stack[4].clone().into(); - let node_index: AB::Expr = local.stack[5].clone().into(); - let root: [AB::Expr; 4] = core::array::from_fn(|i| local.stack[6 + i].clone().into()); + let node_value: [AB::Expr; 4] = core::array::from_fn(|i| local.stack.get(i).into()); + let node_depth: AB::Expr = local.stack.get(4).into(); + let node_index: AB::Expr = local.stack.get(5).into(); + let root: [AB::Expr; 4] = core::array::from_fn(|i| local.stack.get(6 + i).into()); - let input_label: AB::Expr = AB::Expr::from_u16(MP_VERIFY_LABEL as u16 + 16); + let input_label: AB::Expr = AB::Expr::from_u16(MP_VERIFY_LABEL as u16 + INPUT_LABEL_OFFSET); let input_msg = compute_hasher_word_message::( challenges, input_label, @@ -1662,9 +1651,9 @@ fn compute_mpverify_request>( &node_value, ); - // addr_next = helper_0 + node_depth * merkle_cycle_len - 1 - let output_addr = helper_0 + node_depth * merkle_cycle_len - AB::Expr::ONE; - let output_label: AB::Expr = AB::Expr::from_u16(RETURN_HASH_LABEL as u16 + 32); + // Output address = start + depth * rows_per_perm - 1 (last output row of the path) + let output_addr = helper_0 + node_depth * rows_per_perm - AB::Expr::ONE; + let output_label: AB::Expr = AB::Expr::from_u16(RETURN_HASH_LABEL as u16 + OUTPUT_LABEL_OFFSET); let output_msg = compute_hasher_word_message::( challenges, output_label, @@ -1678,32 +1667,31 @@ fn compute_mpverify_request>( /// Computes the MRUPDATE request message value. /// -/// MRUPDATE sends four messages: -/// 1. Input old: old node value at RATE0 (positions 0-3 in LE layout) -/// 2. Output old: old root at RATE0 -/// 3. Input new: new node value at RATE0 -/// 4. Output new: new root at RATE0 -fn compute_mrupdate_request>( - local: &MainTraceRow, - next: &MainTraceRow, +/// MRUPDATE sends four messages as a product: +/// 1. Input old: old node value (stack[0..4]) with node_index +/// 2. Output old: old root digest (stack[6..10]) at computed output address +/// 3. Input new: new node value (stack[10..14]) with node_index +/// 4. Output new: new root digest (next.stack[0..4]) at computed output address +fn compute_mrupdate_request( + local: &MainCols, + next: &MainCols, challenges: &Challenges, ) -> AB::ExprEF { - use crate::trace::decoder::USER_OP_HELPERS_OFFSET; - - let helper_0: AB::Expr = local.decoder[USER_OP_HELPERS_OFFSET].clone().into(); - let merkle_cycle_len: AB::Expr = AB::Expr::from_u16(HASH_CYCLE_LEN as u16); - let two_merkle_cycles: AB::Expr = merkle_cycle_len.clone() + merkle_cycle_len.clone(); + let helper_0: AB::Expr = local.decoder.hasher_state[2].into(); + let rows_per_perm: AB::Expr = AB::Expr::from_u16(CONTROLLER_ROWS_PER_PERMUTATION as u16); + let two_legs_rows: AB::Expr = rows_per_perm.clone() + rows_per_perm.clone(); // Stack layout: [old_node0..3, depth, index, old_root0..3, new_node0..3, ...] - let old_node: [AB::Expr; 4] = core::array::from_fn(|i| local.stack[i].clone().into()); - let depth: AB::Expr = local.stack[4].clone().into(); - let index: AB::Expr = local.stack[5].clone().into(); - let old_root: [AB::Expr; 4] = core::array::from_fn(|i| local.stack[6 + i].clone().into()); - let new_node: [AB::Expr; 4] = core::array::from_fn(|i| local.stack[10 + i].clone().into()); + let old_node: [AB::Expr; 4] = core::array::from_fn(|i| local.stack.get(i).into()); + let depth: AB::Expr = local.stack.get(4).into(); + let index: AB::Expr = local.stack.get(5).into(); + let old_root: [AB::Expr; 4] = core::array::from_fn(|i| local.stack.get(6 + i).into()); + let new_node: [AB::Expr; 4] = core::array::from_fn(|i| local.stack.get(10 + i).into()); // New root is at next.stack[0..4] - let new_root: [AB::Expr; 4] = core::array::from_fn(|i| next.stack[i].clone().into()); + let new_root: [AB::Expr; 4] = core::array::from_fn(|i| next.stack.get(i).into()); - let input_old_label: AB::Expr = AB::Expr::from_u16(MR_UPDATE_OLD_LABEL as u16 + 16); + let input_old_label: AB::Expr = + AB::Expr::from_u16(MR_UPDATE_OLD_LABEL as u16 + INPUT_LABEL_OFFSET); let input_old_msg = compute_hasher_word_message::( challenges, input_old_label, @@ -1712,9 +1700,9 @@ fn compute_mrupdate_request>( &old_node, ); - let output_old_addr = - helper_0.clone() + depth.clone() * merkle_cycle_len.clone() - AB::Expr::ONE; - let output_old_label: AB::Expr = AB::Expr::from_u16(RETURN_HASH_LABEL as u16 + 32); + let output_old_addr = helper_0.clone() + depth.clone() * rows_per_perm.clone() - AB::Expr::ONE; + let output_old_label: AB::Expr = + AB::Expr::from_u16(RETURN_HASH_LABEL as u16 + OUTPUT_LABEL_OFFSET); let output_old_msg = compute_hasher_word_message::( challenges, output_old_label.clone(), @@ -1723,8 +1711,9 @@ fn compute_mrupdate_request>( &old_root, ); - let input_new_addr = helper_0.clone() + depth.clone() * merkle_cycle_len.clone(); - let input_new_label: AB::Expr = AB::Expr::from_u16(MR_UPDATE_NEW_LABEL as u16 + 16); + let input_new_addr = helper_0.clone() + depth.clone() * rows_per_perm; + let input_new_label: AB::Expr = + AB::Expr::from_u16(MR_UPDATE_NEW_LABEL as u16 + INPUT_LABEL_OFFSET); let input_new_msg = compute_hasher_word_message::( challenges, input_new_label, @@ -1733,7 +1722,7 @@ fn compute_mrupdate_request>( &new_node, ); - let output_new_addr = helper_0 + depth * two_merkle_cycles - AB::Expr::ONE; + let output_new_addr = helper_0 + depth * two_legs_rows - AB::Expr::ONE; let output_new_msg = compute_hasher_word_message::( challenges, output_old_label, diff --git a/air/src/constraints/chiplets/bus/hash_kernel.rs b/air/src/constraints/chiplets/bus/hash_kernel.rs index 0356fbaa2b..172979d5a2 100644 --- a/air/src/constraints/chiplets/bus/hash_kernel.rs +++ b/air/src/constraints/chiplets/bus/hash_kernel.rs @@ -9,34 +9,28 @@ //! //! Rows contribute either a request term, a response term, or the identity (when no flag is set). //! The request/response values use the standard message format: -//! `alpha + sum_i beta^i * element[i]`. +//! `bus_prefix[bus] + sum_i beta^i * element[i]`. use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::{LiftedAirBuilder, WindowAccess}; +use miden_crypto::stark::air::{ExtensionBuilder, LiftedAirBuilder, WindowAccess}; use crate::{ - Felt, MainTraceRow, + Felt, MainCols, MidenAirBuilder, constraints::{ - bus::indices::B_HASH_KERNEL, - chiplets::hasher::{flags, periodic}, - op_flags::OpFlags, - tagging::{ - TagGroup, TaggingAirBuilderExt, ids::TAG_HASH_KERNEL_BUS_BASE, tagged_assert_zero_ext, - }, + bus::indices::B_HASH_KERNEL, chiplets::selectors::ChipletSelectors, op_flags::OpFlags, }, trace::{ - CHIPLETS_OFFSET, Challenges, LOG_PRECOMPILE_LABEL, + CHIPLETS_OFFSET, Challenges, LOG_PRECOMPILE_LABEL, bus_types, chiplets::{ - HASHER_NODE_INDEX_COL_IDX, HASHER_SELECTOR_COL_RANGE, HASHER_STATE_COL_RANGE, + HASHER_MRUPDATE_ID_COL_IDX, HASHER_NODE_INDEX_COL_IDX, HASHER_STATE_COL_RANGE, NUM_ACE_SELECTORS, ace::{ ACE_INSTRUCTION_ID1_OFFSET, ACE_INSTRUCTION_ID2_OFFSET, CLK_IDX, CTX_IDX, - EVAL_OP_IDX, ID_1_IDX, ID_2_IDX, PTR_IDX, SELECTOR_BLOCK_IDX, V_0_0_IDX, V_0_1_IDX, - V_1_0_IDX, V_1_1_IDX, + EVAL_OP_IDX, ID_1_IDX, ID_2_IDX, PTR_IDX, V_0_0_IDX, V_0_1_IDX, V_1_0_IDX, + V_1_1_IDX, }, memory::{MEMORY_READ_ELEMENT_LABEL, MEMORY_READ_WORD_LABEL}, }, - decoder::USER_OP_HELPERS_OFFSET, log_precompile::{HELPER_CAP_PREV_RANGE, STACK_CAP_NEXT_RANGE}, }, }; @@ -45,18 +39,9 @@ use crate::{ // ================================================================================================ // Column offsets relative to chiplets array. -const S_START: usize = HASHER_SELECTOR_COL_RANGE.start - CHIPLETS_OFFSET; const H_START: usize = HASHER_STATE_COL_RANGE.start - CHIPLETS_OFFSET; const IDX_COL: usize = HASHER_NODE_INDEX_COL_IDX - CHIPLETS_OFFSET; - -/// Tag ID and namespace for the hash-kernel (virtual table) bus transition constraint. -const HASH_KERNEL_BUS_ID: usize = TAG_HASH_KERNEL_BUS_BASE; -const HASH_KERNEL_BUS_NAMESPACE: &str = "chiplets.bus.hash_kernel.transition"; -const HASH_KERNEL_BUS_NAMES: [&str; 1] = [HASH_KERNEL_BUS_NAMESPACE; 1]; -const HASH_KERNEL_BUS_TAGS: TagGroup = TagGroup { - base: HASH_KERNEL_BUS_ID, - names: &HASH_KERNEL_BUS_NAMES, -}; +const MRUPDATE_ID_COL: usize = HASHER_MRUPDATE_ID_COL_IDX - CHIPLETS_OFFSET; // ENTRY POINTS // ================================================================================================ @@ -69,12 +54,13 @@ const HASH_KERNEL_BUS_TAGS: TagGroup = TagGroup { /// 3. Log precompile transcript tracking pub fn enforce_hash_kernel_constraint( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, challenges: &Challenges, + selectors: &ChipletSelectors, ) where - AB: TaggingAirBuilderExt, + AB: MidenAirBuilder, { // ========================================================================= // AUXILIARY TRACE ACCESS @@ -90,126 +76,90 @@ pub fn enforce_hash_kernel_constraint( let one = AB::Expr::ONE; let one_ef = AB::ExprEF::ONE; - // ========================================================================= - // PERIODIC VALUES - // ========================================================================= - - let (cycle_row_0, cycle_row_31) = { - // Clone only the periodic values we need (avoids per-eval `to_vec()` allocation). - let p = builder.periodic_values(); - let cycle_row_0: AB::Expr = p[periodic::P_CYCLE_ROW_0].into(); - let cycle_row_31: AB::Expr = p[periodic::P_CYCLE_ROW_31].into(); - (cycle_row_0, cycle_row_31) - }; - // ========================================================================= // COMMON VALUES // ========================================================================= - // Hasher chiplet rows have s0 = 0 (chiplet selector). - let chiplet_selector: AB::Expr = local.chiplets[0].clone().into(); - let is_hasher: AB::Expr = one.clone() - chiplet_selector.clone(); + // Controller flag from the precomputed chiplet selectors. + let controller_flag: AB::Expr = selectors.controller.is_active.clone(); - // Hasher operation selectors (only meaningful within hasher chiplet) - let s0: AB::Expr = local.chiplets[S_START].clone().into(); - let s1: AB::Expr = local.chiplets[S_START + 1].clone().into(); - let s2: AB::Expr = local.chiplets[S_START + 2].clone().into(); + // Hasher operation selectors (only meaningful on hasher controller rows). + // On controller rows: `s0=1` = input row, `(s0,s1,s2)` encodes the operation. + // On permutation rows these columns hold S-box witnesses — gated out by controller_flag. + let ctrl = local.controller(); - // Node index for sibling table - let node_index: AB::Expr = local.chiplets[IDX_COL].clone().into(); - let node_index_next: AB::Expr = next.chiplets[IDX_COL].clone().into(); + // Node index and mrupdate_id for sibling table + let node_index: AB::Expr = local.chiplets[IDX_COL].into(); + let node_index_next: AB::Expr = next.chiplets[IDX_COL].into(); + let mrupdate_id: AB::Expr = local.chiplets[MRUPDATE_ID_COL].into(); // Hasher state for sibling values - let h: [AB::Expr; 12] = core::array::from_fn(|i| local.chiplets[H_START + i].clone().into()); - let h_next: [AB::Expr; 12] = - core::array::from_fn(|i| next.chiplets[H_START + i].clone().into()); + let h: [AB::Expr; 12] = core::array::from_fn(|i| local.chiplets[H_START + i].into()); // ========================================================================= // SIBLING TABLE FLAGS AND VALUES // ========================================================================= - // MU/MUA flags (requests - remove siblings during new path). - let f_mu: AB::Expr = - is_hasher.clone() * flags::f_mu(cycle_row_0.clone(), s0.clone(), s1.clone(), s2.clone()); - let f_mua: AB::Expr = - is_hasher.clone() * flags::f_mua(cycle_row_31.clone(), s0.clone(), s1.clone(), s2.clone()); - - // MV/MVA flags (responses - add siblings during old path). - let f_mv: AB::Expr = - is_hasher.clone() * flags::f_mv(cycle_row_0.clone(), s0.clone(), s1.clone(), s2.clone()); - let f_mva: AB::Expr = is_hasher.clone() * flags::f_mva(cycle_row_31.clone(), s0, s1, s2); + // In the controller/perm split, sibling table operations happen on controller input rows + // for MU (new path - requests/removes) and MV (old path - responses/adds). + // All MU/MV input rows participate (not just is_start=1). + // f_mu = s0 * s1 * s2 + let f_mu: AB::Expr = controller_flag.clone() * ctrl.f_mu(); + // f_mv = s0 * s1 * !s2 + let f_mv: AB::Expr = controller_flag.clone() * ctrl.f_mv(); - // Compute sibling values based on bit b (LSB of node index). - // The hasher constraints enforce that b is binary on shift rows. + // Direction bit b = input_node_index - 2 * output_node_index (next row is the paired output). let b: AB::Expr = node_index.clone() - node_index_next.clone().double(); let is_b_zero = one.clone() - b.clone(); let is_b_one = b; - // Sibling value for current row (uses current hasher state). - // b selects which half of the rate holds the sibling. - let v_sibling_curr = compute_sibling_b0::(challenges, &node_index, &h) * is_b_zero.clone() - + compute_sibling_b1::(challenges, &node_index, &h) * is_b_one.clone(); - - // Sibling value for next row (used by MVA/MUA on the transition row). - let v_sibling_next = compute_sibling_b0::(challenges, &node_index, &h_next) * is_b_zero - + compute_sibling_b1::(challenges, &node_index, &h_next) * is_b_one; + // Sibling value from the current input row's state, including mrupdate_id for domain + // separation. b selects which half of the rate holds the sibling. + let v_sibling = compute_sibling_b0::(challenges, &mrupdate_id, &node_index, &h) * is_b_zero + + compute_sibling_b1::(challenges, &mrupdate_id, &node_index, &h) * is_b_one; // ========================================================================= // ACE MEMORY FLAGS AND VALUES // ========================================================================= - // ACE chiplet selector: s0=1, s1=1, s2=1, s3=0 - let s3: AB::Expr = local.chiplets[3].clone().into(); - let chiplet_s1: AB::Expr = local.chiplets[1].clone().into(); - let chiplet_s2: AB::Expr = local.chiplets[2].clone().into(); - - let is_ace_row: AB::Expr = - chiplet_selector.clone() * chiplet_s1.clone() * chiplet_s2.clone() * (one.clone() - s3); + // ACE row flag from the precomputed chiplet selectors. + let is_ace_row: AB::Expr = selectors.ace.is_active.clone(); + let ace = local.ace(); - // Block selector determines read (0) vs eval (1) - let block_selector: AB::Expr = - local.chiplets[NUM_ACE_SELECTORS + SELECTOR_BLOCK_IDX].clone().into(); - - let f_ace_read: AB::Expr = is_ace_row.clone() * (one.clone() - block_selector.clone()); - let f_ace_eval: AB::Expr = is_ace_row * block_selector; + let f_ace_read: AB::Expr = is_ace_row.clone() * ace.f_read(); + let f_ace_eval: AB::Expr = is_ace_row * ace.f_eval(); // ACE columns for memory messages - let ace_clk: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + CLK_IDX].clone().into(); - let ace_ctx: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + CTX_IDX].clone().into(); - let ace_ptr: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + PTR_IDX].clone().into(); + let ace_clk: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + CLK_IDX].into(); + let ace_ctx: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + CTX_IDX].into(); + let ace_ptr: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + PTR_IDX].into(); // Word read value: label + ctx + ptr + clk + 4-lane value. let v_ace_word = { - let v0_0: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + V_0_0_IDX].clone().into(); - let v0_1: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + V_0_1_IDX].clone().into(); - let v1_0: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + V_1_0_IDX].clone().into(); - let v1_1: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + V_1_1_IDX].clone().into(); + let v0_0: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + V_0_0_IDX].into(); + let v0_1: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + V_0_1_IDX].into(); + let v1_0: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + V_1_0_IDX].into(); + let v1_1: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + V_1_1_IDX].into(); let label: AB::Expr = AB::Expr::from(Felt::from_u8(MEMORY_READ_WORD_LABEL)); - challenges.encode([ - label, - ace_ctx.clone(), - ace_ptr.clone(), - ace_clk.clone(), - v0_0, - v0_1, - v1_0, - v1_1, - ]) + challenges.encode( + bus_types::CHIPLETS_BUS, + [label, ace_ctx.clone(), ace_ptr.clone(), ace_clk.clone(), v0_0, v0_1, v1_0, v1_1], + ) }; // Element read value: label + ctx + ptr + clk + element. let v_ace_element = { - let id_1: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + ID_1_IDX].clone().into(); - let id_2: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + ID_2_IDX].clone().into(); - let eval_op: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + EVAL_OP_IDX].clone().into(); + let id_1: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + ID_1_IDX].into(); + let id_2: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + ID_2_IDX].into(); + let eval_op: AB::Expr = local.chiplets[NUM_ACE_SELECTORS + EVAL_OP_IDX].into(); let offset1: AB::Expr = AB::Expr::from(ACE_INSTRUCTION_ID1_OFFSET); let offset2: AB::Expr = AB::Expr::from(ACE_INSTRUCTION_ID2_OFFSET); let element = id_1 + id_2 * offset1 + (eval_op + one.clone()) * offset2; let label: AB::Expr = AB::Expr::from(Felt::from_u8(MEMORY_READ_ELEMENT_LABEL)); - challenges.encode([label, ace_ctx, ace_ptr, ace_clk, element]) + challenges.encode(bus_types::CHIPLETS_BUS, [label, ace_ctx, ace_ptr, ace_clk, element]) }; // ========================================================================= @@ -220,34 +170,38 @@ pub fn enforce_hash_kernel_constraint( // CAP_PREV from helper registers (provided and constrained by the decoder logic). let cap_prev: [AB::Expr; 4] = core::array::from_fn(|i| { - local.decoder[USER_OP_HELPERS_OFFSET + HELPER_CAP_PREV_RANGE.start + i] - .clone() - .into() + local.decoder.hasher_state[2 + HELPER_CAP_PREV_RANGE.start + i].into() }); // CAP_NEXT from next-row stack. let cap_next: [AB::Expr; 4] = - core::array::from_fn(|i| next.stack[STACK_CAP_NEXT_RANGE.start + i].clone().into()); + core::array::from_fn(|i| next.stack.get(STACK_CAP_NEXT_RANGE.start + i).into()); let log_label: AB::Expr = AB::Expr::from(Felt::from_u8(LOG_PRECOMPILE_LABEL)); // CAP_PREV value (request - removed). - let v_cap_prev = challenges.encode([ - log_label.clone(), - cap_prev[0].clone(), - cap_prev[1].clone(), - cap_prev[2].clone(), - cap_prev[3].clone(), - ]); + let v_cap_prev = challenges.encode( + bus_types::LOG_PRECOMPILE_TRANSCRIPT, + [ + log_label.clone(), + cap_prev[0].clone(), + cap_prev[1].clone(), + cap_prev[2].clone(), + cap_prev[3].clone(), + ], + ); // CAP_NEXT value (response - inserted). - let v_cap_next = challenges.encode([ - log_label, - cap_next[0].clone(), - cap_next[1].clone(), - cap_next[2].clone(), - cap_next[3].clone(), - ]); + let v_cap_next = challenges.encode( + bus_types::LOG_PRECOMPILE_TRANSCRIPT, + [ + log_label, + cap_next[0].clone(), + cap_next[1].clone(), + cap_next[2].clone(), + cap_next[3].clone(), + ], + ); // ========================================================================= // RUNNING PRODUCT CONSTRAINT @@ -255,47 +209,45 @@ pub fn enforce_hash_kernel_constraint( // Include the identity term when no request/response flag is set on a row. // Flags are mutually exclusive by construction (chiplet selectors + op flags). - let request_flag_sum = f_mu.clone() - + f_mua.clone() - + f_ace_read.clone() - + f_ace_eval.clone() - + f_logprecompile.clone(); - let requests: AB::ExprEF = v_sibling_curr.clone() * f_mu.clone() - + v_sibling_next.clone() * f_mua.clone() + let request_flag_sum = + f_mu.clone() + f_ace_read.clone() + f_ace_eval.clone() + f_logprecompile.clone(); + let requests: AB::ExprEF = v_sibling.clone() * f_mu + v_ace_word * f_ace_read + v_ace_element * f_ace_eval + v_cap_prev * f_logprecompile.clone() + (one_ef.clone() - request_flag_sum); - let response_flag_sum = f_mv.clone() + f_mva.clone() + f_logprecompile.clone(); - let responses: AB::ExprEF = v_sibling_curr * f_mv - + v_sibling_next * f_mva - + v_cap_next * f_logprecompile - + (one_ef - response_flag_sum); + let response_flag_sum = f_mv.clone() + f_logprecompile.clone(); + let responses: AB::ExprEF = + v_sibling * f_mv + v_cap_next * f_logprecompile + (one_ef - response_flag_sum); // Running product constraint: p' * requests = p * responses let p_local_ef: AB::ExprEF = p_local.into(); let p_next_ef: AB::ExprEF = p_next.into(); - let mut idx = 0; - tagged_assert_zero_ext( - builder, - &HASH_KERNEL_BUS_TAGS, - &mut idx, - p_next_ef * requests - p_local_ef * responses, - ); + builder + .when_transition() + .assert_zero_ext(p_next_ef * requests - p_local_ef * responses); } // INTERNAL HELPERS // ================================================================================================ -/// Sibling at h[4..7]: positions [2, 7, 8, 9, 10]. -const SIBLING_B0_LAYOUT: [usize; 5] = [2, 7, 8, 9, 10]; -/// Sibling at h[0..3]: positions [2, 3, 4, 5, 6]. -const SIBLING_B1_LAYOUT: [usize; 5] = [2, 3, 4, 5, 6]; +/// Sibling at h[4..8] (b=0): positions [1, 2, 7, 8, 9, 10]. +/// Position 1 = mrupdate_id, position 2 = node_index, positions 7-10 = sibling (rate1). +const SIBLING_B0_LAYOUT: [usize; 6] = [1, 2, 7, 8, 9, 10]; +/// Sibling at h[0..4] (b=1): positions [1, 2, 3, 4, 5, 6]. +/// Position 1 = mrupdate_id, position 2 = node_index, positions 3-6 = sibling (rate0). +const SIBLING_B1_LAYOUT: [usize; 6] = [1, 2, 3, 4, 5, 6]; + +/// Compute sibling value when b=0 (sibling at h[4..8], i.e., rate1). +/// +/// Message: `bus_prefix[SIBLING_TABLE] + beta[1]*mrupdate_id + beta[2]*node_index + +/// beta[7..11]*h[4..8]` fn compute_sibling_b0( challenges: &Challenges, + mrupdate_id: &AB::Expr, node_index: &AB::Expr, h: &[AB::Expr; 12], ) -> AB::ExprEF @@ -303,16 +255,26 @@ where AB: LiftedAirBuilder, { challenges.encode_sparse( + bus_types::SIBLING_TABLE, SIBLING_B0_LAYOUT, - [node_index.clone(), h[4].clone(), h[5].clone(), h[6].clone(), h[7].clone()], + [ + mrupdate_id.clone(), + node_index.clone(), + h[4].clone(), + h[5].clone(), + h[6].clone(), + h[7].clone(), + ], ) } -/// Compute sibling value when b=1 (sibling at h[0..3]). +/// Compute sibling value when b=1 (sibling at h[0..4], i.e., rate0). /// -/// Message layout: alpha[0] (constant) + alpha[3] * node_index + alpha[4..7] * h[0..3]. +/// Message: `bus_prefix[SIBLING_TABLE] + beta[1]*mrupdate_id + beta[2]*node_index + +/// beta[3..7]*h[0..4]` fn compute_sibling_b1( challenges: &Challenges, + mrupdate_id: &AB::Expr, node_index: &AB::Expr, h: &[AB::Expr; 12], ) -> AB::ExprEF @@ -320,7 +282,15 @@ where AB: LiftedAirBuilder, { challenges.encode_sparse( + bus_types::SIBLING_TABLE, SIBLING_B1_LAYOUT, - [node_index.clone(), h[0].clone(), h[1].clone(), h[2].clone(), h[3].clone()], + [ + mrupdate_id.clone(), + node_index.clone(), + h[0].clone(), + h[1].clone(), + h[2].clone(), + h[3].clone(), + ], ) } diff --git a/air/src/constraints/chiplets/bus/mod.rs b/air/src/constraints/chiplets/bus/mod.rs index 383362cee1..fd57e4d396 100644 --- a/air/src/constraints/chiplets/bus/mod.rs +++ b/air/src/constraints/chiplets/bus/mod.rs @@ -4,27 +4,31 @@ //! Currently implemented: //! - b_hash_kernel: hash-kernel virtual table bus //! - b_chiplets: main chiplets communication bus -//! - b_wiring: ACE wiring bus +//! - b_wiring: ACE wiring bus + memory range checks + hasher perm-link pub mod chiplets; pub mod hash_kernel; pub mod wiring; -use miden_crypto::stark::air::LiftedAirBuilder; - -use crate::{Felt, MainTraceRow, constraints::op_flags::OpFlags, trace::Challenges}; +use super::selectors::ChipletSelectors; +use crate::{MainCols, MidenAirBuilder, constraints::op_flags::OpFlags, trace::Challenges}; /// Enforces chiplets bus constraints. pub fn enforce_bus( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, challenges: &Challenges, + selectors: &ChipletSelectors, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { - hash_kernel::enforce_hash_kernel_constraint(builder, local, next, op_flags, challenges); - chiplets::enforce_chiplets_bus_constraint(builder, local, next, op_flags, challenges); - wiring::enforce_wiring_bus_constraint(builder, local, next, challenges); + hash_kernel::enforce_hash_kernel_constraint( + builder, local, next, op_flags, challenges, selectors, + ); + chiplets::enforce_chiplets_bus_constraint( + builder, local, next, op_flags, challenges, selectors, + ); + wiring::enforce_wiring_bus_constraint(builder, local, next, challenges, selectors); } diff --git a/air/src/constraints/chiplets/bus/wiring.rs b/air/src/constraints/chiplets/bus/wiring.rs index 3ea3ab5564..c3cb6408c0 100644 --- a/air/src/constraints/chiplets/bus/wiring.rs +++ b/air/src/constraints/chiplets/bus/wiring.rs @@ -1,51 +1,48 @@ -//! ACE wiring bus constraint. +//! Wiring bus constraints (v_wiring). //! -//! This module enforces the running-sum constraint for the ACE wiring bus (v_wiring). -//! The wiring bus verifies the wiring of the arithmetic circuit (which node feeds which gate). -//! It does this by enforcing that every node (id, value) inserted into the ACE DAG is later -//! consumed the claimed number of times, via a LogUp running‑sum relation. +//! This module enforces the running-sum constraints for the shared v_wiring LogUp column. +//! The column carries contributions from three stacked chiplet regions: //! -//! ## Wire message format +//! 1. **ACE wiring**: tracks node definitions and consumptions in the ACE circuit. +//! 2. **Memory range checks**: verifies w0, w1, 4*w1 are 16-bit via LogUp lookups. +//! 3. **Hasher perm-link**: links hasher controller rows to hasher permutation segment. //! -//! Each wire is encoded as: -//! `alpha + beta^0 * clk + beta^1 * ctx + beta^2 * id + beta^3 * v0 + beta^4 * v1` +//! ## Design //! -//! Where: -//! - clk: memory access clock cycle -//! - ctx: memory access context -//! - id: node identifier -//! - v0, v1: extension field element coefficients +//! Since the chiplet regions are stacked (mutually exclusive selectors), three separate +//! additive constraints gate each region's accumulation formula: //! -//! ## LogUp protocol +//! ```text +//! ace_flag * (delta * D_ace - N_ace) = 0 +//! memory_flag * (delta * D_mem + N_mem) = 0 +//! hasher_flag * (delta * D_perm - N_perm) + idle_flag * delta = 0 +//! ``` //! -//! **READ blocks (sblock = 0):** -//! - Insert wire_0 with multiplicity m0. -//! - Insert wire_1 with multiplicity m1. -//! -//! **EVAL blocks (sblock = 1):** -//! - Insert wire_0 with multiplicity m0. -//! - Remove wire_1 with multiplicity 1. -//! - Remove wire_2 with multiplicity 1. -//! -//! Boundary constraints for v_wiring are handled by the wrapper AIR (aux_finals). +//! The `idle_flag * delta` term is important as on bitwise, kernel-ROM, and padding rows, none of +//! the stacked `v_wiring` contributors are active, but the accumulator must still propagate +//! unchanged so its last-row boundary value remains bound to the earlier accumulation. + +use core::borrow::Borrow; use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::{LiftedAirBuilder, WindowAccess}; +use miden_crypto::stark::air::{ExtensionBuilder, LiftedAirBuilder, WindowAccess}; use crate::{ - Felt, MainTraceRow, + Felt, MainCols, MidenAirBuilder, constraints::{ bus::indices::V_WIRING, - chiplets::selectors::ace_chiplet_flag, - tagging::{ - TagGroup, TaggingAirBuilderExt, ids::TAG_WIRING_BUS_BASE, tagged_assert_zero_ext, - }, + chiplets::{columns::PeriodicCols, selectors::ChipletSelectors}, }, trace::{ - Challenges, - chiplets::ace::{ - CLK_IDX, CTX_IDX, ID_0_IDX, ID_1_IDX, ID_2_IDX, M_0_IDX, M_1_IDX, SELECTOR_BLOCK_IDX, - V_0_0_IDX, V_0_1_IDX, V_1_0_IDX, V_1_1_IDX, V_2_0_IDX, V_2_1_IDX, + CHIPLETS_OFFSET, Challenges, bus_types, + chiplets::{ + HASHER_NODE_INDEX_COL_IDX, HASHER_STATE_COL_RANGE, MEMORY_WORD_ADDR_HI_COL_IDX, + MEMORY_WORD_ADDR_LO_COL_IDX, + ace::{ + CLK_IDX, CTX_IDX, ID_0_IDX, ID_1_IDX, ID_2_IDX, M_0_IDX, M_1_IDX, + SELECTOR_BLOCK_IDX, V_0_0_IDX, V_0_1_IDX, V_1_0_IDX, V_1_1_IDX, V_2_0_IDX, + V_2_1_IDX, + }, }, }, }; @@ -53,34 +50,33 @@ use crate::{ // CONSTANTS // ================================================================================================ -// ACE chiplet offset from CHIPLETS_OFFSET (after s0, s1, s2, s3). const ACE_OFFSET: usize = 4; -/// Tag IDs and namespaces for wiring bus constraints. -const WIRING_BUS_BASE_ID: usize = TAG_WIRING_BUS_BASE; -const WIRING_BUS_NAME: &str = "chiplets.bus.wiring.transition"; -const WIRING_BUS_NAMES: [&str; 1] = [WIRING_BUS_NAME; 1]; -const WIRING_BUS_TAGS: TagGroup = TagGroup { - base: WIRING_BUS_BASE_ID, - names: &WIRING_BUS_NAMES, -}; - -// ENTRY POINTS +// ENTRY POINT // ================================================================================================ -/// Enforces the ACE wiring bus constraint. +/// Enforces the wiring bus constraints for all chiplet regions sharing V_WIRING. +/// +/// Three separate additive constraints, one per stacked region: +/// ```text +/// ace_flag * (delta * D_ace - N_ace) = 0 +/// memory_flag * (delta * D_mem + N_mem) = 0 +/// hasher_flag * (delta * D_perm - N_perm) + idle_flag * delta = 0 +/// ``` +/// +/// Each flag selects the correct accumulation formula for its row type. On idle rows +/// (bitwise, kernel-ROM, and padding), all stacked contributors are inactive, so the +/// `idle_flag * delta` term forces the shared accumulator to propagate unchanged. pub fn enforce_wiring_bus_constraint( builder: &mut AB, - local: &MainTraceRow, - _next: &MainTraceRow, + local: &MainCols, + _next: &MainCols, challenges: &Challenges, + selectors: &ChipletSelectors, ) where - AB: TaggingAirBuilderExt, + AB: MidenAirBuilder, { - // --------------------------------------------------------------------- - // Auxiliary trace access. - // --------------------------------------------------------------------- - + // --- Auxiliary trace access --- let (v_local, v_next) = { let aux = builder.permutation(); let aux_local = aux.current_slice(); @@ -88,98 +84,279 @@ pub fn enforce_wiring_bus_constraint( (aux_local[V_WIRING], aux_next[V_WIRING]) }; - // --------------------------------------------------------------------- - // Chiplet selectors. - // --------------------------------------------------------------------- + let v_local_ef: AB::ExprEF = v_local.into(); + let v_next_ef: AB::ExprEF = v_next.into(); + let delta = v_next_ef - v_local_ef; + + // --- Periodic columns for hasher cycle detection --- + // Row 0 = is_init_ext. Row 15 (boundary) = 1 - selector_sum. + let (p_cycle_row_0, p_cycle_row_boundary) = { + let periodic: &PeriodicCols = builder.periodic_values().borrow(); + let row_0: AB::Expr = periodic.hasher.is_init_ext.into(); + let selector_sum: AB::Expr = Into::::into(periodic.hasher.is_init_ext) + + Into::::into(periodic.hasher.is_ext) + + Into::::into(periodic.hasher.is_packed_int) + + Into::::into(periodic.hasher.is_int_ext); + let row_boundary = AB::Expr::ONE - selector_sum; + (row_0, row_boundary) + }; + + // --- Chiplet region flags (from precomputed ChipletSelectors) --- + // hasher_flag covers both controller and permutation rows (their selector products + // are mutually exclusive, so addition gives the union). ace_flag and memory_flag + // come directly from the precomputed `is_active` selector products. + let ace_flag = selectors.ace.is_active.clone(); + let memory_flag = selectors.memory.is_active.clone(); + let hasher_flag = + selectors.controller.is_active.clone() + selectors.permutation.is_active.clone(); + let idle_flag = AB::Expr::ONE - ace_flag.clone() - memory_flag.clone() - hasher_flag.clone(); - let s0: AB::Expr = local.chiplets[0].clone().into(); - let s1: AB::Expr = local.chiplets[1].clone().into(); - let s2: AB::Expr = local.chiplets[2].clone().into(); - let s3: AB::Expr = local.chiplets[3].clone().into(); - let ace_flag = ace_chiplet_flag(s0, s1, s2, s3); + // --- ACE term --- + let ace_term = compute_ace_term::(&delta, ace_flag, local, challenges); - // Block selector: sblock = 0 for READ, sblock = 1 for EVAL. - let sblock: AB::Expr = load_ace_col::(local, SELECTOR_BLOCK_IDX); - let is_eval = sblock.clone(); - let is_read = AB::Expr::ONE - sblock; + // --- Memory term --- + let mem_term = compute_memory_term::(&delta, memory_flag, local, challenges); + + // --- Hasher perm-link + idle propagation term --- + let perm_link_term = compute_hasher_perm_link_term::( + &delta, + hasher_flag, + idle_flag, + selectors.controller.is_active.clone(), + selectors.permutation.is_active.clone(), + local, + challenges, + p_cycle_row_0, + p_cycle_row_boundary, + ); + + // --- Three separate constraints --- + builder.when_transition().assert_zero_ext(ace_term); + builder.when_transition().assert_zero_ext(mem_term); + builder.when_transition().assert_zero_ext(perm_link_term); +} - // --------------------------------------------------------------------- - // Load ACE columns. - // --------------------------------------------------------------------- +// ACE TERM +// ================================================================================================ + +/// Computes the ACE wiring contribution: +/// `ace_flag * (delta * D_ace - N_ace)` +fn compute_ace_term( + delta: &AB::ExprEF, + ace_flag: AB::Expr, + local: &MainCols, + challenges: &Challenges, +) -> AB::ExprEF +where + AB: MidenAirBuilder, +{ + // Block selector: sblock = 0 for READ, sblock = 1 for EVAL + let sblock: AB::Expr = load_ace_col::(local, SELECTOR_BLOCK_IDX); + let is_read = AB::Expr::ONE - sblock.clone(); + let is_eval = sblock; + // Load ACE columns let clk: AB::Expr = load_ace_col::(local, CLK_IDX); let ctx: AB::Expr = load_ace_col::(local, CTX_IDX); - - let wire_0 = load_ace_wire::(local, ID_0_IDX, V_0_0_IDX, V_0_1_IDX); - let wire_1 = load_ace_wire::(local, ID_1_IDX, V_1_0_IDX, V_1_1_IDX); - let wire_2 = load_ace_wire::(local, ID_2_IDX, V_2_0_IDX, V_2_1_IDX); + let wire_0 = encode_wire::( + challenges, + &clk, + &ctx, + &load_ace_wire::(local, ID_0_IDX, V_0_0_IDX, V_0_1_IDX), + ); + let wire_1 = encode_wire::( + challenges, + &clk, + &ctx, + &load_ace_wire::(local, ID_1_IDX, V_1_0_IDX, V_1_1_IDX), + ); + let wire_2 = encode_wire::( + challenges, + &clk, + &ctx, + &load_ace_wire::(local, ID_2_IDX, V_2_0_IDX, V_2_1_IDX), + ); let m0: AB::Expr = load_ace_col::(local, M_0_IDX); - // On READ rows this column stores m1 (fan-out for wire_1). On EVAL rows it is v2_1, - // but we only use it under the READ gate below. let m1: AB::Expr = load_ace_col::(local, M_1_IDX); - // --------------------------------------------------------------------- - // Wire value computation. - // --------------------------------------------------------------------- - - let wire_0: AB::ExprEF = encode_wire::(challenges, &clk, &ctx, &wire_0); - let wire_1: AB::ExprEF = encode_wire::(challenges, &clk, &ctx, &wire_1); - let wire_2: AB::ExprEF = encode_wire::(challenges, &clk, &ctx, &wire_2); - - // --------------------------------------------------------------------- - // Transition constraint. - // --------------------------------------------------------------------- - // - // LogUp definition: - // v' - v = Σ (num_i / den_i) - // - // READ rows: - // v' - v = m0 / wire_0 + m1 / wire_1 - // - // EVAL rows: - // v' - v = m0 / wire_0 - 1 / wire_1 - 1 / wire_2 - // - // Multiply by the common denominator wire_0 * wire_1 * wire_2 to stay in a - // single polynomial form; the READ/EVAL gates select the appropriate RHS. + // Common denominator + let d_ace = wire_0.clone() * wire_1.clone() * wire_2.clone(); - let v_local_ef: AB::ExprEF = v_local.into(); - let v_next_ef: AB::ExprEF = v_next.into(); - let delta = v_next_ef.clone() - v_local_ef.clone(); - - // RHS under the common denominator: - // - READ: m0 * w1 * w2 + m1 * w0 * w2 - // - EVAL: m0 * w1 * w2 - w0 * w2 - w0 * w1 + // Numerator (not gated by ace_flag -- the outer gate handles it) + // READ: m0 * w1 * w2 + m1 * w0 * w2 + // EVAL: m0 * w1 * w2 - w0 * w2 - w0 * w1 let read_terms = wire_1.clone() * wire_2.clone() * m0.clone() + wire_0.clone() * wire_2.clone() * m1; let eval_terms = wire_1.clone() * wire_2.clone() * m0 - wire_0.clone() * wire_2.clone() - wire_0.clone() * wire_1.clone(); - // Gates: non-ACE rows must contribute zero; READ/EVAL are mutually exclusive. - let read_gate = ace_flag.clone() * is_read; - let eval_gate = ace_flag * is_eval; + let n_ace = read_terms * is_read + eval_terms * is_eval; + + // ace_flag * (delta * D_ace - N_ace) + (delta.clone() * d_ace - n_ace) * ace_flag +} - let common_den = wire_0.clone() * wire_1.clone() * wire_2.clone(); - let rhs = read_terms * read_gate + eval_terms * eval_gate; - let wiring_constraint = delta * common_den - rhs; +// MEMORY TERM +// ================================================================================================ - let mut idx = 0; - tagged_assert_zero_ext(builder, &WIRING_BUS_TAGS, &mut idx, wiring_constraint); +/// Computes the memory range check contribution. +/// +/// This is a SEPARATE constraint from the ACE wiring, using its own delta from the +/// V_WIRING aux column. It subtracts 3 LogUp fractions per memory row: +/// 1/(prefix+w0) + 1/(prefix+w1) + 1/(prefix+4w1). +/// +/// Uses `bus_prefix[RANGE_CHECK_BUS]` to match the range checker's encoding. +fn compute_memory_term( + delta: &AB::ExprEF, + memory_flag: AB::Expr, + local: &MainCols, + challenges: &Challenges, +) -> AB::ExprEF +where + AB: MidenAirBuilder, +{ + let prefix = &challenges.bus_prefix[bus_types::RANGE_CHECK_BUS]; + + // Load word-index limbs + let w0: AB::Expr = local.chiplets[MEMORY_WORD_ADDR_LO_COL_IDX - CHIPLETS_OFFSET].into(); + let w1: AB::Expr = local.chiplets[MEMORY_WORD_ADDR_HI_COL_IDX - CHIPLETS_OFFSET].into(); + let w1_mul4: AB::Expr = w1.clone() * AB::Expr::from_u16(4); + + let den0: AB::ExprEF = prefix.clone() + Into::::into(w0); + let den1: AB::ExprEF = prefix.clone() + Into::::into(w1); + let den2: AB::ExprEF = prefix.clone() + Into::::into(w1_mul4); + + // Common denominator and numerator + let common_den = den0.clone() * den1.clone() * den2.clone(); + let rhs = den1.clone() * den2.clone() + den0.clone() * den2 + den0 * den1; + + // memory_flag * (delta * common_den + rhs) = 0 + let memory_flag_ef: AB::ExprEF = memory_flag.into(); + (delta.clone() * common_den + rhs) * memory_flag_ef +} + +// HASHER PERM-LINK TERM +// ================================================================================================ + +/// Computes the hasher perm-link contribution to the wiring bus and enforces idle propagation. +/// +/// This links hasher controller rows (dispatch) to hasher permutation segment (compute): +/// - Hasher controller input (s_perm=0, s0=1): +1/msg_in +/// - Hasher controller output (s_perm=0, s0=0, s1=0): +1/msg_out +/// - Hasher permutation cycle row 0 (`is_init_ext = 1`): -m/msg_in +/// - Hasher permutation boundary row (cycle row 15, i.e. `s_perm=1` and all row-type selectors are +/// 0): -m/msg_out +/// - Idle bitwise / kernel-ROM / padding rows: `delta = 0` +/// +/// Common-denominator form: +/// ```text +/// hasher_flag * (delta * msg_in * msg_out +/// - msg_out * (f_in - f_p_in * m) +/// - msg_in * (f_out - f_p_out * m)) +/// + idle_flag * delta = 0 +/// ``` +fn compute_hasher_perm_link_term( + delta: &AB::ExprEF, + hasher_flag: AB::Expr, + idle_flag: AB::Expr, + ctrl_is_active: AB::Expr, + perm_is_active: AB::Expr, + local: &MainCols, + challenges: &Challenges, + p_cycle_row_0: AB::Expr, + p_cycle_row_boundary: AB::Expr, +) -> AB::ExprEF +where + AB: MidenAirBuilder, +{ + // --- Load hasher-internal sub-selectors (only meaningful on controller rows) --- + // On controller rows: chiplets[1] = s0 (input flag), chiplets[2] = s1. + let s0: AB::Expr = local.chiplets[1].into(); + let s1: AB::Expr = local.chiplets[2].into(); + + // node_index (= multiplicity on perm segment rows) + let m: AB::Expr = local.chiplets[HASHER_NODE_INDEX_COL_IDX - CHIPLETS_OFFSET].into(); + + // --- Flags --- + let one = AB::Expr::ONE; + + // f_in: controller input row (s_ctrl=1, s0=1) + let f_in = ctrl_is_active.clone() * s0.clone(); + + // f_out: controller output row (s_ctrl=1, s0=0, s1=0) + let f_out = ctrl_is_active * (one.clone() - s0) * (one - s1); + + // f_p_in: packed permutation row 0 (s_perm=1 * is_init_ext=1) + let f_p_in = perm_is_active.clone() * p_cycle_row_0; + + // f_p_out: perm boundary row (s_perm=1 * cycle boundary) + let f_p_out = perm_is_active * p_cycle_row_boundary; + + // --- Messages --- + // msg = challenges.encode(HASHER_PERM_LINK, [label, h0, h1, ..., h11]) -- 13 elements + let msg_in = encode_perm_link_message::(local, challenges, AB::Expr::ZERO); + let msg_out = encode_perm_link_message::(local, challenges, AB::Expr::ONE); + + // --- Common-denominator constraint --- + // hasher_flag * (delta * msg_in * msg_out + // - msg_out * (f_in - f_p_in * m) + // - msg_in * (f_out - f_p_out * m)) = 0 + let f_in_ef: AB::ExprEF = f_in.into(); + let f_out_ef: AB::ExprEF = f_out.into(); + let f_p_in_m: AB::ExprEF = (f_p_in * m.clone()).into(); + let f_p_out_m: AB::ExprEF = (f_p_out * m).into(); + + let perm_link_term = delta.clone() * msg_in.clone() * msg_out.clone() + - msg_out * (f_in_ef - f_p_in_m) + - msg_in * (f_out_ef - f_p_out_m); + + let idle_term: AB::ExprEF = delta.clone() * Into::::into(idle_flag); + + perm_link_term * hasher_flag + idle_term +} + +/// Encodes a perm-link message on the dedicated `HASHER_PERM_LINK` bus: `[label, h0, ..., h11]`. +fn encode_perm_link_message( + local: &MainCols, + challenges: &Challenges, + label: AB::Expr, +) -> AB::ExprEF +where + AB: MidenAirBuilder, +{ + let h_start = HASHER_STATE_COL_RANGE.start - CHIPLETS_OFFSET; + challenges.encode( + bus_types::HASHER_PERM_LINK, + [ + label, + local.chiplets[h_start].into(), + local.chiplets[h_start + 1].into(), + local.chiplets[h_start + 2].into(), + local.chiplets[h_start + 3].into(), + local.chiplets[h_start + 4].into(), + local.chiplets[h_start + 5].into(), + local.chiplets[h_start + 6].into(), + local.chiplets[h_start + 7].into(), + local.chiplets[h_start + 8].into(), + local.chiplets[h_start + 9].into(), + local.chiplets[h_start + 10].into(), + local.chiplets[h_start + 11].into(), + ], + ) } // INTERNAL HELPERS // ================================================================================================ -/// ACE wire triplet (id, v0, v1). struct AceWire { id: Expr, v0: Expr, v1: Expr, } -/// Load an ACE wire (id, v0, v1) from the chiplet slice. fn load_ace_wire( - row: &MainTraceRow, + row: &MainCols, id_idx: usize, v0_idx: usize, v1_idx: usize, @@ -194,7 +371,6 @@ where } } -/// Encode an ACE wire using the wiring-bus challenge vector. fn encode_wire( challenges: &Challenges, clk: &AB::Expr, @@ -204,14 +380,16 @@ fn encode_wire( where AB: LiftedAirBuilder, { - challenges.encode([clk.clone(), ctx.clone(), wire.id.clone(), wire.v0.clone(), wire.v1.clone()]) + challenges.encode( + bus_types::ACE_WIRING_BUS, + [clk.clone(), ctx.clone(), wire.id.clone(), wire.v0.clone(), wire.v1.clone()], + ) } -/// Load a column from the ACE section of chiplets. -fn load_ace_col(row: &MainTraceRow, ace_col_idx: usize) -> AB::Expr +fn load_ace_col(row: &MainCols, ace_col_idx: usize) -> AB::Expr where AB: LiftedAirBuilder, { let local_idx = ACE_OFFSET + ace_col_idx; - row.chiplets[local_idx].clone().into() + row.chiplets[local_idx].into() } diff --git a/air/src/constraints/chiplets/columns.rs b/air/src/constraints/chiplets/columns.rs new file mode 100644 index 0000000000..35b11c7b6b --- /dev/null +++ b/air/src/constraints/chiplets/columns.rs @@ -0,0 +1,774 @@ +//! Column structs for all chiplet sub-components and periodic columns. + +use alloc::{vec, vec::Vec}; +use core::{borrow::Borrow, mem::size_of}; + +use miden_core::{Felt, WORD_SIZE, chiplets::hasher::Hasher, field::PrimeCharacteristicRing}; + +use super::super::{columns::indices_arr, ext_field::QuadFeltExpr}; +use crate::trace::chiplets::{ + bitwise::NUM_DECOMP_BITS, + hasher::{CAPACITY_LEN, DIGEST_LEN, HASH_CYCLE_LEN, NUM_SELECTORS, RATE_LEN, STATE_WIDTH}, +}; + +// HELPERS +// ================================================================================================ + +/// Zero-copy cast from a slice to a `#[repr(C)]` chiplet column struct. +pub fn borrow_chiplet(slice: &[T]) -> &S { + let (prefix, cols, suffix) = unsafe { slice.align_to::() }; + debug_assert!(prefix.is_empty() && suffix.is_empty() && cols.len() == 1); + &cols[0] +} + +// PERMUTATION COLUMNS +// ================================================================================================ + +/// Permutation chiplet columns (19 columns), viewed from `chiplets[1..20]`. +/// +/// Logical overlay for permutation segment rows (`s_perm = 1`). The 3 witness columns +/// `w0..w2` share the same physical columns as the controller's `s0/s1/s2` selectors, +/// and `multiplicity` shares the same physical column as the controller's `node_index`. +/// +/// `s_ctrl` (= `chiplets[0]`) and `s_perm` (= `MainCols::s_perm`) are consumed by the chiplet +/// selector system and are NOT part of this overlay. +/// +/// The state holds a Poseidon2 sponge in `[RATE0, RATE1, CAPACITY]` layout. +/// Helper methods `rate0()`, `rate1()`, `capacity()`, and `digest()` provide +/// sub-views into the state array. +/// +/// ## Layout +/// +/// ```text +/// | witnesses[3] | state[12] | extra cols | +/// | | rate0[4] (= digest) | rate1[4] | capacity[4] | | +/// | w0, w1, w2 | h0..h3 | h4..h7 | h8..h11 | m -- -- -- | +/// ``` +#[repr(C)] +pub struct PermutationCols { + /// S-box witness columns (same physical columns as hasher selectors). + pub witnesses: [T; NUM_SELECTORS], + /// Poseidon2 state (12 field elements: 8 rate + 4 capacity). + pub state: [T; STATE_WIDTH], + /// Request multiplicity (same physical column as node_index). + pub multiplicity: T, + /// Physical slots for controller columns mrupdate_id, is_boundary, and direction_bit. + /// These must be zero on permutation rows; access via [`Self::unused_padding()`] only. + _unused: [T; 3], +} + +impl PermutationCols { + /// Returns the rate portion of the state (state[0..8]). + pub fn rate(&self) -> [T; RATE_LEN] { + [ + self.state[0], + self.state[1], + self.state[2], + self.state[3], + self.state[4], + self.state[5], + self.state[6], + self.state[7], + ] + } + + /// Returns the capacity portion of the state (state[8..12]). + pub fn capacity(&self) -> [T; CAPACITY_LEN] { + [self.state[8], self.state[9], self.state[10], self.state[11]] + } + + /// Returns the digest portion of the state (state[0..4]). + pub fn digest(&self) -> [T; DIGEST_LEN] { + [self.state[0], self.state[1], self.state[2], self.state[3]] + } + + /// Returns rate0 (state[0..4]). + pub fn rate0(&self) -> [T; DIGEST_LEN] { + [self.state[0], self.state[1], self.state[2], self.state[3]] + } + + /// Returns rate1 (state[4..8]). + pub fn rate1(&self) -> [T; DIGEST_LEN] { + [self.state[4], self.state[5], self.state[6], self.state[7]] + } + + /// Returns the 3 padding columns (mrupdate_id, is_boundary, direction_bit) that must + /// be zero on permutation rows. + pub fn unused_padding(&self) -> [T; 3] { + self._unused + } +} + +// CONTROLLER COLUMNS +// ================================================================================================ + +/// Controller chiplet columns (19 columns), viewed from `chiplets[1..20]`. +/// +/// Logical overlay for controller rows (`s_ctrl = 1`). `s0` distinguishes input rows +/// (`s0 = 1`) from output/padding rows (`s0 = 0`). The physical layout mirrors +/// [`PermutationCols`], but column names reflect the controller/permutation split. +/// +/// `s_ctrl` (= `chiplets[0]`) and `s_perm` (= `MainCols::s_perm`) are consumed by the chiplet +/// selector system and are NOT part of this overlay. Because the chiplet-level +/// non-hasher selector is only ever a virtual expression (`1 - s_ctrl - s_perm`) and is +/// never a named column or struct field, there is no name collision with the +/// controller-internal `s0` defined here. +/// +/// The state holds a Poseidon2 sponge in `[RATE0, RATE1, CAPACITY]` layout. +/// Helper methods `rate0()`, `rate1()`, `capacity()`, and `digest()` provide +/// sub-views into the state array. +/// +/// ## Layout +/// +/// ```text +/// | s0 s1 s2 | state[12] | extra cols | +/// | | rate0[4] (= digest) | rate1[4] | capacity[4] | | +/// | | h0..h3 | h4..h7 | h8..h11 | i mr bnd dir | +/// ``` +#[repr(C)] +pub struct ControllerCols { + /// Hasher-internal sub-selector: `s0 = 1` on controller input rows, 0 on output/padding. + pub s0: T, + /// Operation sub-selector s1. + pub s1: T, + /// Operation sub-selector s2. + pub s2: T, + /// Poseidon2 state (12 field elements: 8 rate + 4 capacity). + pub state: [T; STATE_WIDTH], + /// Merkle tree node index. + pub node_index: T, + /// Domain separator for sibling table across MRUPDATE ops. + pub mrupdate_id: T, + /// 1 on boundary rows (first input or last output of each permutation). + pub is_boundary: T, + /// Direction bit for Merkle path verification. + pub direction_bit: T, +} + +impl ControllerCols { + /// Returns the rate portion of the state (state[0..8]). + pub fn rate(&self) -> [T; RATE_LEN] { + [ + self.state[0], + self.state[1], + self.state[2], + self.state[3], + self.state[4], + self.state[5], + self.state[6], + self.state[7], + ] + } + + /// Returns the capacity portion of the state (state[8..12]). + pub fn capacity(&self) -> [T; CAPACITY_LEN] { + [self.state[8], self.state[9], self.state[10], self.state[11]] + } + + /// Returns the digest portion of the state (state[0..4]). + pub fn digest(&self) -> [T; DIGEST_LEN] { + [self.state[0], self.state[1], self.state[2], self.state[3]] + } + + /// Returns rate0 (state[0..4]). + pub fn rate0(&self) -> [T; DIGEST_LEN] { + [self.state[0], self.state[1], self.state[2], self.state[3]] + } + + /// Returns rate1 (state[4..8]). + pub fn rate1(&self) -> [T; DIGEST_LEN] { + [self.state[4], self.state[5], self.state[6], self.state[7]] + } + + /// Merkle-update new-path flag: `s0 * s1 * s2`. + /// + /// Active on controller input rows that insert the new Merkle path into the sibling + /// table (request/remove side of the running product). + pub fn f_mu(&self) -> E + where + T: Into, + { + self.s0.into() * self.s1.into() * self.s2.into() + } + + /// Merkle-verify / old-path flag: `s0 * s1 * (1 - s2)`. + /// + /// Active on controller input rows that extract the old Merkle path from the sibling + /// table (response/add side of the running product). + pub fn f_mv(&self) -> E + where + T: Into, + { + self.s0.into() * self.s1.into() * (E::ONE - self.s2.into()) + } +} + +// BITWISE COLUMNS +// ================================================================================================ + +/// Bitwise chiplet columns (13 columns), viewed from `chiplets[2..15]`. +/// +/// Bit decomposition columns (`a_bits`, `b_bits`) are in **little-endian** order: +/// `value = bits[0] + 2*bits[1] + 4*bits[2] + 8*bits[3]`. +#[repr(C)] +pub struct BitwiseCols { + /// Operation flag: 0 = AND, 1 = XOR. + pub op_flag: T, + /// Aggregated input a. + pub a: T, + /// Aggregated input b. + pub b: T, + /// 4-bit decomposition of a. + pub a_bits: [T; NUM_DECOMP_BITS], + /// 4-bit decomposition of b. + pub b_bits: [T; NUM_DECOMP_BITS], + /// Previous aggregated output. + pub prev_output: T, + /// Current aggregated output. + pub output: T, +} + +// MEMORY COLUMNS +// ================================================================================================ + +/// Memory chiplet columns (15 columns), viewed from `chiplets[3..18]`. +/// +/// When reading from a new word address (first access to a context/addr pair), the +/// `values` are initialized to zero. +#[repr(C)] +pub struct MemoryCols { + /// Read/write flag (0 = write, 1 = read). + pub is_read: T, + /// Element/word flag (0 = element, 1 = word). + pub is_word: T, + /// Memory context ID. + pub ctx: T, + /// Word address. + pub word_addr: T, + /// First bit of the address index within the word. + pub idx0: T, + /// Second bit of the address index within the word. + pub idx1: T, + /// Clock cycle of the memory access. + pub clk: T, + /// Values stored at this context/word/clock after the operation. + pub values: [T; WORD_SIZE], + /// Lower 16 bits of delta. + pub d0: T, + /// Upper 16 bits of delta. + pub d1: T, + /// Inverse of delta. + pub d_inv: T, + /// Flag: same context and same word address as previous operation (docs: `f_sca`). + pub is_same_ctx_and_addr: T, +} + +// ACE COLUMNS +// ================================================================================================ + +/// ACE chiplet columns (16 columns), viewed from `chiplets[4..20]`. +/// +/// The ACE (Arithmetic Circuit Evaluator) chiplet evaluates arithmetic circuits over +/// quadratic extension field elements. Each circuit evaluation consists of two phases: +/// +/// 1. **READ** (`s_block=0`): loads wire values from memory into the chiplet. +/// 2. **EVAL** (`s_block=1`): evaluates arithmetic gates on loaded wire values. +/// +/// The first 12 columns are common to both modes. The last 4 (`mode`) are overlaid +/// and reinterpreted depending on `s_block`: +/// +/// ```text +/// mode idx | READ (s_block=0) | EVAL (s_block=1) +/// ---------+------------------------+------------------- +/// 0 | num_eval | id_2 +/// 1 | (unused) | v_2.0 +/// 2 | m_1 (wire-1 mult) | v_2.1 +/// 3 | m_0 (wire-0 mult) | m_0 (wire-0 mult) +/// ``` +/// +/// Use `ace.read()` / `ace.eval()` for typed overlays of the mode columns. +#[repr(C)] +pub struct AceCols { + /// Start-of-circuit flag (1 on the first row of a new circuit evaluation). + pub s_start: T, + /// Block selector: 0 = READ (memory loads), 1 = EVAL (gate evaluation). + pub s_block: T, + /// Memory context for the current circuit evaluation. + pub ctx: T, + /// Memory pointer from which to read the next two wire values or instruction. + pub ptr: T, + /// Clock cycle at which the memory read is performed. + pub clk: T, + /// Arithmetic operation selector (determines which gate to evaluate in EVAL mode). + pub eval_op: T, + /// ID of the first wire (output wire / left operand). + pub id_0: T, + /// Value of the first wire (quadratic extension field element). + pub v_0: QuadFeltExpr, + /// ID of the second wire (first input / left operand). + pub id_1: T, + /// Value of the second wire (quadratic extension field element). + pub v_1: QuadFeltExpr, + /// Mode-dependent columns (interpretation depends on `s_block`; see table above). + mode: [T; 4], +} + +impl AceCols { + /// Returns a READ-mode overlay of the mode-dependent columns. + pub fn read(&self) -> &AceReadCols { + borrow_chiplet(&self.mode) + } + + /// Returns an EVAL-mode overlay of the mode-dependent columns. + pub fn eval(&self) -> &AceEvalCols { + borrow_chiplet(&self.mode) + } +} + +impl AceCols { + /// ACE read flag: `1 - s_block`. + /// + /// Active on ACE rows in READ mode (memory word reads for circuit inputs). + pub fn f_read(&self) -> E + where + T: Into, + { + E::ONE - self.s_block.into() + } + + /// ACE eval flag: `s_block`. + /// + /// Active on ACE rows in EVAL mode (circuit gate evaluation). + pub fn f_eval(&self) -> E + where + T: Into, + { + self.s_block.into() + } +} + +/// READ mode overlay for ACE mode-dependent columns (4 columns). +/// +/// In READ mode, the chiplet loads wire values from memory. The multiplicity columns +/// (`m_0`, `m_1`) track how many times each wire participates in circuit gates, used +/// by the wiring bus to verify correct wire connections. +#[repr(C)] +pub struct AceReadCols { + /// Number of EVAL rows that follow this READ block. + pub num_eval: T, + /// Unused column (padding for layout alignment with EVAL overlay). + pub unused: T, + /// Multiplicity of the second wire (wire 1). + pub m_1: T, + /// Multiplicity of the first wire (wire 0). + pub m_0: T, +} + +/// EVAL mode overlay for ACE mode-dependent columns (4 columns). +/// +/// In EVAL mode, the chiplet evaluates an arithmetic gate on three wires: two inputs +/// (`id_1`, `id_2`) and one output (`id_0`). The third wire's ID and value occupy the +/// same physical columns as `num_eval`/`unused`/`m_1` in READ mode. +#[repr(C)] +pub struct AceEvalCols { + /// ID of the third wire (second input / right operand). + pub id_2: T, + /// Value of the third wire. + pub v_2: QuadFeltExpr, + /// Multiplicity of the first wire (wire 0). + pub m_0: T, +} + +// ACE COLUMN INDEX MAPS +// ================================================================================================ + +/// Compile-time index map for the top-level ACE chiplet columns (16 columns). +#[allow(dead_code)] +pub const ACE_COL_MAP: AceCols = { + assert!(size_of::>() == 16); + unsafe { core::mem::transmute(indices_arr::<{ size_of::>() }>()) } +}; + +/// Compile-time index map for the READ overlay (relative to `mode`). +pub const ACE_READ_COL_MAP: AceReadCols = { + assert!(size_of::>() == 4); + unsafe { core::mem::transmute(indices_arr::<{ size_of::>() }>()) } +}; + +/// Compile-time index map for the EVAL overlay (relative to `mode`). +pub const ACE_EVAL_COL_MAP: AceEvalCols = { + assert!(size_of::>() == 4); + unsafe { core::mem::transmute(indices_arr::<{ size_of::>() }>()) } +}; + +/// Offset of the `mode` array within the ACE chiplet columns. +#[allow(dead_code)] +pub const MODE_OFFSET: usize = ACE_COL_MAP.mode[0]; + +const _: () = { + assert!(size_of::>() == 16); + assert!(size_of::>() == 4); + assert!(size_of::>() == 4); + + // m_0 is at the same position in both overlays. + assert!(ACE_READ_COL_MAP.m_0 == ACE_EVAL_COL_MAP.m_0); + + // READ-only and EVAL-only columns overlap at the expected positions. + assert!(ACE_READ_COL_MAP.num_eval == ACE_EVAL_COL_MAP.id_2); + assert!(ACE_READ_COL_MAP.m_1 == ACE_EVAL_COL_MAP.v_2.1); +}; + +// KERNEL ROM COLUMNS +// ================================================================================================ + +/// Kernel ROM chiplet columns (5 columns), viewed from `chiplets[5..10]`. +#[repr(C)] +pub struct KernelRomCols { + /// First-row-of-hash flag. + pub s_first: T, + /// Kernel procedure root digest. + pub root: [T; WORD_SIZE], +} + +// PERIODIC COLUMNS +// ================================================================================================ + +/// All chiplet periodic columns (20 columns). +/// +/// Aggregates hasher (18 columns) and bitwise (2 columns) periodic values into a single +/// typed view. Use `builder.periodic_values().borrow()` to obtain a `&PeriodicCols<_>`. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct PeriodicCols { + /// Hasher periodic columns (cycle markers, step selectors, round constants). + pub hasher: HasherPeriodicCols, + /// Bitwise periodic columns. + pub bitwise: BitwisePeriodicCols, +} + +/// Hasher chiplet periodic columns (16 columns, period = 16 rows). +/// +/// Provides step-type selectors and Poseidon2 round constants for the hasher chiplet. +/// The hasher operates on a 16-row cycle (15 transitions + 1 boundary row). +/// +/// ## Layout +/// +/// | Index | Name | Description | +/// |-------|----------------|-------------| +/// | 0 | is_init_ext | 1 on row 0 (init linear + first external round) | +/// | 1 | is_ext | 1 on rows 1-3, 12-14 (single external round) | +/// | 2 | is_packed_int | 1 on rows 4-10 (3 packed internal rounds) | +/// | 3 | is_int_ext | 1 on row 11 (int22 + ext5 merged) | +/// | 4-15 | ark[0..12] | Shared round constants | +#[derive(Clone, Copy)] +#[repr(C)] +pub struct HasherPeriodicCols { + /// 1 on row 0 (init linear + first external round). + pub is_init_ext: T, + /// 1 on rows 1-3, 12-14 (single external round). + pub is_ext: T, + /// 1 on rows 4-10 (3 packed internal rounds). + pub is_packed_int: T, + /// 1 on row 11 (int22 + ext5 merged). + pub is_int_ext: T, + /// Shared round constants (12 lanes). Carry external round constants on external + /// rows, and internal round constants in ark[0..2] on packed-internal rows. + pub ark: [T; STATE_WIDTH], +} + +/// Bitwise chiplet periodic columns (2 columns, period = 8 rows). +#[derive(Clone, Copy)] +#[repr(C)] +pub struct BitwisePeriodicCols { + /// Marks first row of 8-row cycle: `[1, 0, 0, 0, 0, 0, 0, 0]`. + pub k_first: T, + /// Marks non-last rows of 8-row cycle: `[1, 1, 1, 1, 1, 1, 1, 0]`. + pub k_transition: T, +} + +// PERIODIC COLUMN GENERATION +// ================================================================================================ + +#[allow(clippy::new_without_default)] +impl HasherPeriodicCols> { + /// Generate periodic columns for the Poseidon2 hasher chiplet. + /// + /// All columns repeat every 16 rows, matching one permutation cycle. + /// + /// The 4 selector columns identify the row type. The 12 ark columns carry either + /// external round constants (on external rows) or internal round constants in + /// `ark[0..2]` (on packed-internal rows). + /// + /// ## 16-Row Schedule + /// + /// ```text + /// Row Transition Selector + /// 0 init + ext1 is_init_ext + /// 1-3 ext2-ext4 is_ext + /// 4-10 3x packed internal is_packed_int + /// 11 int22 + ext5 is_int_ext + /// 12-14 ext6-ext8 is_ext + /// 15 boundary (none) + /// ``` + #[allow(clippy::needless_range_loop)] + pub fn new() -> Self { + // ------------------------------------------------------------------------- + // Selectors + // ------------------------------------------------------------------------- + let mut is_init_ext = vec![Felt::ZERO; HASH_CYCLE_LEN]; + let mut is_ext = vec![Felt::ZERO; HASH_CYCLE_LEN]; + let mut is_packed_int = vec![Felt::ZERO; HASH_CYCLE_LEN]; + let mut is_int_ext = vec![Felt::ZERO; HASH_CYCLE_LEN]; + + is_init_ext[0] = Felt::ONE; + + for r in [1, 2, 3, 12, 13, 14] { + is_ext[r] = Felt::ONE; + } + + for r in 4..=10 { + is_packed_int[r] = Felt::ONE; + } + + is_int_ext[11] = Felt::ONE; + + // ------------------------------------------------------------------------- + // Shared round constants (12 columns) + // ------------------------------------------------------------------------- + // On external rows (0-3, 11-14): hold per-lane external round constants. + // On packed-internal rows (4-10): ark[0..2] hold 3 internal round constants, + // ark[3..12] are zero. + // On boundary (row 15): all zero. + let ark = core::array::from_fn(|lane| { + let mut col = vec![Felt::ZERO; HASH_CYCLE_LEN]; + + // Row 0 (init+ext1): first initial external round constants + col[0] = Hasher::ARK_EXT_INITIAL[0][lane]; + + // Rows 1-3 (ext2, ext3, ext4): remaining initial external round constants + for r in 1..=3 { + col[r] = Hasher::ARK_EXT_INITIAL[r][lane]; + } + + // Rows 4-10 (packed internal): internal constants in lanes 0-2 only + if lane < 3 { + for triple in 0..7_usize { + let row = 4 + triple; + let ark_idx = triple * 3 + lane; + col[row] = Hasher::ARK_INT[ark_idx]; + } + } + + // Row 11 (int22+ext5): terminal external round 0 constants + // (internal constant ARK_INT[21] is hardcoded in the constraint) + col[11] = Hasher::ARK_EXT_TERMINAL[0][lane]; + + // Rows 12-14 (ext6, ext7, ext8): remaining terminal external round constants + for r in 12..=14 { + col[r] = Hasher::ARK_EXT_TERMINAL[r - 11][lane]; + } + + col + }); + + Self { + is_init_ext, + is_ext, + is_packed_int, + is_int_ext, + ark, + } + } +} + +#[allow(clippy::new_without_default)] +impl BitwisePeriodicCols> { + /// Generate periodic columns for the bitwise chiplet. + pub fn new() -> Self { + let k_first = vec![ + Felt::ONE, + Felt::ZERO, + Felt::ZERO, + Felt::ZERO, + Felt::ZERO, + Felt::ZERO, + Felt::ZERO, + Felt::ZERO, + ]; + + let k_transition = vec![ + Felt::ONE, + Felt::ONE, + Felt::ONE, + Felt::ONE, + Felt::ONE, + Felt::ONE, + Felt::ONE, + Felt::ZERO, + ]; + + Self { k_first, k_transition } + } +} + +impl PeriodicCols> { + /// Generate all chiplet periodic columns as a flat `Vec>`. + pub fn periodic_columns() -> Vec> { + let HasherPeriodicCols { + is_init_ext, + is_ext, + is_packed_int, + is_int_ext, + ark: [a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11], + } = HasherPeriodicCols::new(); + + let BitwisePeriodicCols { k_first, k_transition } = BitwisePeriodicCols::new(); + + vec![ + is_init_ext, + is_ext, + is_packed_int, + is_int_ext, + a0, + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9, + a10, + a11, + k_first, + k_transition, + ] + } +} + +/// Total number of periodic columns across all chiplets. +pub const NUM_PERIODIC_COLUMNS: usize = size_of::>(); + +impl Borrow> for [T] { + fn borrow(&self) -> &PeriodicCols { + debug_assert_eq!(self.len(), NUM_PERIODIC_COLUMNS); + let (prefix, cols, suffix) = unsafe { self.align_to::>() }; + debug_assert!(prefix.is_empty() && suffix.is_empty() && cols.len() == 1); + &cols[0] + } +} + +const _: () = { + assert!(size_of::>() == 18); + assert!(size_of::>() == 16); + assert!(size_of::>() == 2); + + // PermutationCols and ControllerCols overlay chiplets[1..20] (19 columns, + // excluding s_perm which is consumed by the chiplet selector system). + assert!(size_of::>() == 19); + assert!(size_of::>() == 19); +}; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn periodic_columns_dimensions() { + let cols = PeriodicCols::periodic_columns(); + assert_eq!(cols.len(), NUM_PERIODIC_COLUMNS); + + let (hasher_cols, bitwise_cols) = cols.split_at(size_of::>()); + for col in hasher_cols { + assert_eq!(col.len(), HASH_CYCLE_LEN); + } + for col in bitwise_cols { + assert_eq!(col.len(), 8); + } + } + + #[test] + fn hasher_step_selectors_are_exclusive() { + let h = HasherPeriodicCols::new(); + for row in 0..HASH_CYCLE_LEN { + let init_ext = h.is_init_ext[row]; + let ext = h.is_ext[row]; + let packed_int = h.is_packed_int[row]; + let int_ext = h.is_int_ext[row]; + + // Each selector is binary. + assert_eq!(init_ext * (init_ext - Felt::ONE), Felt::ZERO); + assert_eq!(ext * (ext - Felt::ONE), Felt::ZERO); + assert_eq!(packed_int * (packed_int - Felt::ONE), Felt::ZERO); + assert_eq!(int_ext * (int_ext - Felt::ONE), Felt::ZERO); + + // At most one selector is active per row. + let sum = init_ext + ext + packed_int + int_ext; + assert!(sum == Felt::ZERO || sum == Felt::ONE, "row {row}: sum = {sum}"); + } + } + + #[test] + fn external_round_constants_correct() { + let h = HasherPeriodicCols::new(); + + // Row 0: ARK_EXT_INITIAL[0] + for lane in 0..STATE_WIDTH { + assert_eq!(h.ark[lane][0], Hasher::ARK_EXT_INITIAL[0][lane]); + } + + // Rows 1-3: ARK_EXT_INITIAL[1..3] + for r in 1..=3 { + for lane in 0..STATE_WIDTH { + assert_eq!(h.ark[lane][r], Hasher::ARK_EXT_INITIAL[r][lane]); + } + } + + // Row 11: ARK_EXT_TERMINAL[0] + for lane in 0..STATE_WIDTH { + assert_eq!(h.ark[lane][11], Hasher::ARK_EXT_TERMINAL[0][lane]); + } + + // Rows 12-14: ARK_EXT_TERMINAL[1..3] + for r in 12..=14 { + for lane in 0..STATE_WIDTH { + assert_eq!(h.ark[lane][r], Hasher::ARK_EXT_TERMINAL[r - 11][lane]); + } + } + } + + #[test] + fn internal_round_constants_correct() { + let h = HasherPeriodicCols::new(); + + // Rows 4-10: packed internal round constants in ark[0..2] + for triple in 0..7_usize { + let row = 4 + triple; + for k in 0..3 { + let ark_idx = triple * 3 + k; + assert_eq!( + h.ark[k][row], + Hasher::ARK_INT[ark_idx], + "mismatch at row {row}, int constant {k} (ARK_INT[{ark_idx}])" + ); + } + // ark[3..12] must be zero on packed-internal rows + for lane in 3..STATE_WIDTH { + assert_eq!( + h.ark[lane][row], + Felt::ZERO, + "ark[{lane}] nonzero at packed-int row {row}" + ); + } + } + } + + #[test] + fn boundary_row_all_zero() { + let h = HasherPeriodicCols::new(); + for (lane, col) in h.ark.iter().enumerate() { + assert_eq!(col[15], Felt::ZERO, "ark column {lane} nonzero at row 15"); + } + } +} diff --git a/air/src/constraints/chiplets/hasher/flags.rs b/air/src/constraints/chiplets/hasher/flags.rs deleted file mode 100644 index 9378912b91..0000000000 --- a/air/src/constraints/chiplets/hasher/flags.rs +++ /dev/null @@ -1,289 +0,0 @@ -//! Hasher chiplet flag computation functions. -//! -//! This module provides functions to compute operation flags for the hasher chiplet. -//! Each flag identifies when a specific operation is active based on selector values -//! and cycle position. -//! -//! ## Unused Flags -//! -//! Some flags are defined but unused (`#[allow(dead_code)]`): -//! -//! - **`f_bp`**: BP (Begin Permutation) needs no special constraints - the round function -//! constraints apply identically regardless of which operation started it. -//! - **`f_hout`, `f_sout`**: The combined `f_out` flag suffices for hasher constraints. -//! -//! ## Selector Encoding -//! -//! The hasher uses 3 selector columns `s[0..2]` to encode operations: -//! -//! | Operation | s0 | s1 | s2 | Cycle Position | Description | -//! |-----------|----|----|----|--------------------|-------------| -//! | BP | 1 | 0 | 0 | row 0 | Begin permutation | -//! | MP | 1 | 0 | 1 | row 0 | Merkle path verify | -//! | MV | 1 | 1 | 0 | row 0 | Merkle verify (old root) | -//! | MU | 1 | 1 | 1 | row 0 | Merkle update (new root) | -//! | ABP | 1 | 0 | 0 | row 31 | Absorb for linear hash | -//! | MPA | 1 | 0 | 1 | row 31 | Merkle path absorb | -//! | MVA | 1 | 1 | 0 | row 31 | Merkle verify absorb | -//! | MUA | 1 | 1 | 1 | row 31 | Merkle update absorb | -//! | HOUT | 0 | 0 | 0 | row 31 | Hash output (digest) | -//! | SOUT | 0 | 0 | 1 | row 31 | State output (full) | -use miden_core::field::PrimeCharacteristicRing; - -// INTERNAL HELPERS -// ================================================================================================ - -// INITIALIZATION FLAGS (row 0 of 32-row cycle) -// ================================================================================================ - -/// BP: Begin Permutation flag `(1,0,0)` on cycle row 0. -/// -/// Initiates single permutation, 2-to-1 hash, or linear hash computation. -/// -/// # Degree -/// - Periodic: 1 (cycle_row_0) -/// - Selectors: 3 (s0 * !s1 * !s2) -/// - Total: 4 -#[inline] -#[allow(dead_code)] -pub fn f_bp(cycle_row_0: E, s0: E, s1: E, s2: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_0 * s0 * (E::ONE - s1) * (E::ONE - s2) -} - -/// MP: Merkle Path verification flag `(1,0,1)` on cycle row 0. -/// -/// Initiates standard Merkle path verification computation. -/// -/// # Degree -/// - Periodic: 1 (cycle_row_0) -/// - Selectors: 3 (s0 * !s1 * s2) -/// - Total: 4 -#[inline] -pub fn f_mp(cycle_row_0: E, s0: E, s1: E, s2: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_0 * s0 * (E::ONE - s1) * s2 -} - -/// MV: Merkle Verify (old root) flag `(1,1,0)` on cycle row 0. -/// -/// Begins verification for old leaf value during Merkle root update. -/// -/// # Degree -/// - Periodic: 1 (cycle_row_0) -/// - Selectors: 3 (s0 * s1 * !s2) -/// - Total: 4 -#[inline] -pub fn f_mv(cycle_row_0: E, s0: E, s1: E, s2: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_0 * s0 * s1 * (E::ONE - s2) -} - -/// MU: Merkle Update (new root) flag `(1,1,1)` on cycle row 0. -/// -/// Starts verification for new leaf value during Merkle root update. -/// -/// # Degree -/// - Periodic: 1 (cycle_row_0) -/// - Selectors: 3 (s0 * s1 * s2) -/// - Total: 4 -#[inline] -pub fn f_mu(cycle_row_0: E, s0: E, s1: E, s2: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_0 * s0 * s1 * s2 -} - -// ================================================================================================ -// ABSORPTION FLAGS (row 31 of 32-row cycle) -// ================================================================================================ - -/// ABP: Absorb for linear hash flag `(1,0,0)` on cycle row 31. -/// -/// Absorbs next set of elements into hasher state during linear hash computation. -/// -/// # Degree -/// - Periodic: 1 (cycle_row_31) -/// - Selectors: 3 (s0 * !s1 * !s2) -/// - Total: 4 -#[inline] -pub fn f_abp(cycle_row_31: E, s0: E, s1: E, s2: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_31 * s0 * (E::ONE - s1) * (E::ONE - s2) -} - -/// MPA: Merkle Path Absorb flag `(1,0,1)` on cycle row 31. -/// -/// Absorbs next Merkle path node during standard verification. -/// -/// # Degree -/// - Periodic: 1 (cycle_row_31) -/// - Selectors: 3 (s0 * !s1 * s2) -/// - Total: 4 -#[inline] -pub fn f_mpa(cycle_row_31: E, s0: E, s1: E, s2: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_31 * s0 * (E::ONE - s1) * s2 -} - -/// MVA: Merkle Verify Absorb flag `(1,1,0)` on cycle row 31. -/// -/// Absorbs next node during "old" leaf verification (Merkle root update). -/// -/// # Degree -/// - Periodic: 1 (cycle_row_31) -/// - Selectors: 3 (s0 * s1 * !s2) -/// - Total: 4 -#[inline] -pub fn f_mva(cycle_row_31: E, s0: E, s1: E, s2: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_31 * s0 * s1 * (E::ONE - s2) -} - -/// MUA: Merkle Update Absorb flag `(1,1,1)` on cycle row 31. -/// -/// Absorbs next node during "new" leaf verification (Merkle root update). -/// -/// # Degree -/// - Periodic: 1 (cycle_row_31) -/// - Selectors: 3 (s0 * s1 * s2) -/// - Total: 4 -#[inline] -pub fn f_mua(cycle_row_31: E, s0: E, s1: E, s2: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_31 * s0 * s1 * s2 -} - -// ================================================================================================ -// OUTPUT FLAGS (row 31 of 32-row cycle) -// ================================================================================================ - -/// HOUT: Hash Output flag `(0,0,0)` on cycle row 31. -/// -/// Returns the 4-element hash result (digest). -/// -/// # Degree -/// - Periodic: 1 (cycle_row_31) -/// - Selectors: 3 (!s0 * !s1 * !s2) -/// - Total: 4 -#[inline] -#[allow(dead_code)] -pub fn f_hout(cycle_row_31: E, s0: E, s1: E, s2: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_31 * (E::ONE - s0) * (E::ONE - s1) * (E::ONE - s2) -} - -/// SOUT: State Output flag `(0,0,1)` on cycle row 31. -/// -/// Returns the entire 12-element hasher state. -/// -/// # Degree -/// - Periodic: 1 (cycle_row_31) -/// - Selectors: 3 (!s0 * !s1 * s2) -/// - Total: 4 -#[inline] -#[allow(dead_code)] -pub fn f_sout(cycle_row_31: E, s0: E, s1: E, s2: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_31 * (E::ONE - s0) * (E::ONE - s1) * s2 -} - -/// Combined output flag: `f_hout | f_sout` = `(0,0,*)` on cycle row 31. -/// -/// True when any output operation is active (HOUT or SOUT). -/// -/// # Degree -/// - Periodic: 1 (cycle_row_31) -/// - Selectors: 2 (!s0 * !s1) -/// - Total: 3 -#[inline] -pub fn f_out(cycle_row_31: E, s0: E, s1: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_31 * (E::ONE - s0) * (E::ONE - s1) -} - -/// Lookahead output flag on cycle row 30. -/// -/// True when the *next* row will be an output operation. -/// Used for selector stability constraints. -/// -/// # Degree -/// - Periodic: 1 (cycle_row_30) -/// - Next selectors: 2 (!s0' * !s1') -/// - Total: 3 -#[inline] -pub fn f_out_next(cycle_row_30: E, s0_next: E, s1_next: E) -> E -where - E: PrimeCharacteristicRing, -{ - cycle_row_30 * (E::ONE - s0_next) * (E::ONE - s1_next) -} - -// ================================================================================================ -// COMPOSITE FLAGS -// ================================================================================================ - -/// Merkle operation active flag. -/// -/// True when any Merkle operation (MP, MV, MU, MPA, MVA, MUA) is active. -/// Used for gating index shift constraints. -/// -/// # Degree -/// - Depends on constituent flags, typically 4 -#[inline] -pub fn f_merkle_active(f_mp: E, f_mv: E, f_mu: E, f_mpa: E, f_mva: E, f_mua: E) -> E -where - E: PrimeCharacteristicRing, -{ - f_mp + f_mv + f_mu + f_mpa + f_mva + f_mua -} - -/// Merkle absorb flag (row 31 only). -/// -/// True when absorbing the next node during Merkle path computation. -/// -/// # Degree -/// - Depends on constituent flags, typically 4 -#[inline] -pub fn f_merkle_absorb(f_mpa: E, f_mva: E, f_mua: E) -> E -where - E: PrimeCharacteristicRing, -{ - f_mpa + f_mva + f_mua -} - -/// Continuation flag for hashing operations. -/// -/// True when operation continues to next cycle (ABP, MPA, MVA, MUA). -/// Constrains s0' = 0 to ensure proper sequencing. -/// -/// # Degree -/// - Depends on constituent flags, typically 4 -#[inline] -pub fn f_continuation(f_abp: E, f_mpa: E, f_mva: E, f_mua: E) -> E -where - E: PrimeCharacteristicRing, -{ - f_abp + f_mpa + f_mva + f_mua -} diff --git a/air/src/constraints/chiplets/hasher/merkle.rs b/air/src/constraints/chiplets/hasher/merkle.rs deleted file mode 100644 index 502746a0cd..0000000000 --- a/air/src/constraints/chiplets/hasher/merkle.rs +++ /dev/null @@ -1,219 +0,0 @@ -//! Hasher chiplet Merkle path constraints. -//! -//! This module enforces constraints specific to Merkle tree operations: -//! -//! - **Index shifting**: Node index shifts right by 1 bit at absorb points -//! - **Index stability**: Index unchanged outside of Merkle operations -//! - **Capacity reset**: Capacity lanes reset to zero on Merkle absorb -//! - **Digest placement**: Current digest placed in rate0 or rate1 based on direction bit -//! -//! ## Merkle Operations -//! -//! | Flag | Operation | Description | -//! |------|-----------|-------------| -//! | MP | Merkle Path | Standard path verification | -//! | MV | Merkle Verify | Old root verification (for updates) | -//! | MU | Merkle Update | New root computation (for updates) | -//! | MPA | Merkle Path Absorb | Absorb next sibling (standard) | -//! | MVA | Merkle Verify Absorb | Absorb next sibling (old path) | -//! | MUA | Merkle Update Absorb | Absorb next sibling (new path) | - -use miden_core::field::PrimeCharacteristicRing; - -use super::{HasherColumns, HasherFlags}; -use crate::{ - Felt, - constraints::tagging::{ - TagGroup, TaggingAirBuilderExt, tagged_assert_zero, tagged_assert_zero_integrity, - tagged_assert_zeros, - }, -}; - -// TAGGING NAMESPACES -// ================================================================================================ - -const MERKLE_INDEX_BINARY_NAMESPACE: &str = "chiplets.hasher.merkle.index.binary"; -const MERKLE_INDEX_STABILITY_NAMESPACE: &str = "chiplets.hasher.merkle.index.stability"; -const MERKLE_CAP_NAMESPACE: &str = "chiplets.hasher.merkle.capacity"; -const MERKLE_RATE0_NAMESPACE: &str = "chiplets.hasher.merkle.digest.rate0"; -const MERKLE_RATE1_NAMESPACE: &str = "chiplets.hasher.merkle.digest.rate1"; - -const OUTPUT_INDEX_NAMES: [&str; 1] = [super::OUTPUT_INDEX_NAMESPACE]; -const MERKLE_INDEX_NAMES: [&str; 2] = - [MERKLE_INDEX_BINARY_NAMESPACE, MERKLE_INDEX_STABILITY_NAMESPACE]; -const MERKLE_ABSORB_NAMES: [&str; 12] = [ - MERKLE_CAP_NAMESPACE, - MERKLE_CAP_NAMESPACE, - MERKLE_CAP_NAMESPACE, - MERKLE_CAP_NAMESPACE, - MERKLE_RATE0_NAMESPACE, - MERKLE_RATE0_NAMESPACE, - MERKLE_RATE0_NAMESPACE, - MERKLE_RATE0_NAMESPACE, - MERKLE_RATE1_NAMESPACE, - MERKLE_RATE1_NAMESPACE, - MERKLE_RATE1_NAMESPACE, - MERKLE_RATE1_NAMESPACE, -]; - -const OUTPUT_INDEX_TAGS: TagGroup = TagGroup { - base: super::HASHER_OUTPUT_IDX_ID, - names: &OUTPUT_INDEX_NAMES, -}; -const MERKLE_INDEX_TAGS: TagGroup = TagGroup { - base: super::HASHER_MERKLE_INDEX_BASE_ID, - names: &MERKLE_INDEX_NAMES, -}; -const MERKLE_ABSORB_TAGS: TagGroup = TagGroup { - base: super::HASHER_MERKLE_ABSORB_BASE_ID, - names: &MERKLE_ABSORB_NAMES, -}; - -// CONSTRAINT HELPERS -// ================================================================================================ - -/// Enforces node index constraints for Merkle operations. -/// -/// ## Index Shift Constraint -/// -/// On Merkle start (row 0) and absorb (row 31) operations, the index shifts right by 1 bit: -/// `i' = floor(i/2)`. The discarded bit `b = i - 2*i'` must be binary. -/// -/// This encodes the tree traversal from leaf to root. -/// -/// ## Index Stability Constraint -/// -/// Outside of shift rows (and output rows), the index must remain unchanged. -pub(super) fn enforce_node_index_constraints( - builder: &mut AB, - hasher_flag: AB::Expr, - cols: &HasherColumns, - cols_next: &HasherColumns, - flags: &HasherFlags, -) where - AB: TaggingAirBuilderExt, -{ - let one: AB::Expr = AB::Expr::ONE; - - // ------------------------------------------------------------------------- - // Output Index Constraint - // ------------------------------------------------------------------------- - - // Constraint 1: Index must be 0 on output rows. - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &OUTPUT_INDEX_TAGS, - &mut idx, - hasher_flag.clone() * flags.f_out.clone() * cols.node_index.clone(), - ); - - // ------------------------------------------------------------------------- - // Index Shift Constraint - // ------------------------------------------------------------------------- - - let f_shift = flags.f_merkle_active(); - let f_out = flags.f_out.clone(); - - // Direction bit: b = i - 2*i' - // This is the bit discarded when shifting index right by 1. - let b = cols.node_index.clone() - AB::Expr::TWO * cols_next.node_index.clone(); - - // Constraint 2: b must be binary when shifting (b^2 - b = 0) - let gate = hasher_flag.clone() * f_shift.clone(); - let mut idx = 0; - tagged_assert_zero(builder, &MERKLE_INDEX_TAGS, &mut idx, gate * (b.square() - b.clone())); - - // ------------------------------------------------------------------------- - // Index Stability Constraint - // ------------------------------------------------------------------------- - - // Constraint 3: Index unchanged when not shifting or outputting - // keep = 1 - f_out - f_shift - let keep = one.clone() - f_out - f_shift; - let gate = hasher_flag.clone() * keep; - tagged_assert_zero( - builder, - &MERKLE_INDEX_TAGS, - &mut idx, - gate * (cols_next.node_index.clone() - cols.node_index.clone()), - ); -} - -/// Enforces state constraints for Merkle absorb operations (MPA/MVA/MUA on row 31). -/// -/// ## Capacity Reset -/// -/// The capacity lanes `h[8..12]` are reset to zero for the next 2-to-1 compression. -/// -/// ## Digest Placement -/// -/// The current digest `h[0..4]` is copied to either rate0 or rate1 based on direction bit `b`: -/// - If `b=0`: digest goes to rate0 (`h'[0..4] = h[0..4]`), sibling to rate1 (witness) -/// - If `b=1`: digest goes to rate1 (`h'[4..8] = h[0..4]`), sibling to rate0 (witness) -pub(super) fn enforce_merkle_absorb_state( - builder: &mut AB, - hasher_flag: AB::Expr, - cols: &HasherColumns, - cols_next: &HasherColumns, - flags: &HasherFlags, -) where - AB: TaggingAirBuilderExt, -{ - let one: AB::Expr = AB::Expr::ONE; - let f_absorb = flags.f_merkle_absorb(); - - let digest = cols.digest(); - let rate0_next = cols_next.rate0(); - let rate1_next = cols_next.rate1(); - let cap_next = cols_next.capacity(); - - // Direction bit: b = i - 2*i' - let b = cols.node_index.clone() - AB::Expr::TWO * cols_next.node_index.clone(); - - // ------------------------------------------------------------------------- - // Capacity Reset Constraint - // ------------------------------------------------------------------------- - - // Constraint 1: Capacity reset to zero (batched). - // Use a combined gate to share `hasher_flag * f_absorb` across all 4 lanes. - let gate_absorb = hasher_flag.clone() * f_absorb.clone(); - let mut idx = 0; - tagged_assert_zeros( - builder, - &MERKLE_ABSORB_TAGS, - &mut idx, - MERKLE_CAP_NAMESPACE, - core::array::from_fn::<_, 4, _>(|i| gate_absorb.clone() * cap_next[i].clone()), - ); - - // ------------------------------------------------------------------------- - // Digest Placement Constraints - // ------------------------------------------------------------------------- - - // Constraint 2: If b=0, digest goes to rate0 (h'[0..4] = h[0..4]) - let f_b0 = f_absorb.clone() * (one.clone() - b.clone()); - let gate_b0 = hasher_flag.clone() * f_b0; - tagged_assert_zeros( - builder, - &MERKLE_ABSORB_TAGS, - &mut idx, - MERKLE_RATE0_NAMESPACE, - core::array::from_fn::<_, 4, _>(|i| { - gate_b0.clone() * (rate0_next[i].clone() - digest[i].clone()) - }), - ); - - // Constraint 3: If b=1, digest goes to rate1 (h'[4..8] = h[0..4]) - let f_b1 = f_absorb * b; - let gate_b1 = hasher_flag * f_b1; - tagged_assert_zeros( - builder, - &MERKLE_ABSORB_TAGS, - &mut idx, - MERKLE_RATE1_NAMESPACE, - core::array::from_fn::<_, 4, _>(|i| { - gate_b1.clone() * (rate1_next[i].clone() - digest[i].clone()) - }), - ); -} diff --git a/air/src/constraints/chiplets/hasher/mod.rs b/air/src/constraints/chiplets/hasher/mod.rs deleted file mode 100644 index e5603e2c15..0000000000 --- a/air/src/constraints/chiplets/hasher/mod.rs +++ /dev/null @@ -1,376 +0,0 @@ -//! Hasher chiplet constraints. -//! -//! This module implements constraints for the hasher chiplet, organized into sub-modules: -//! -//! - [`flags`]: Operation flag computation functions -//! - [`periodic`]: Periodic column definitions (cycle markers, round constants) -//! - [`selectors`]: Selector logic constraints -//! - [`state`]: Permutation state constraints -//! - [`merkle`]: Merkle tree operation constraints -//! -//! ## Hasher Operations -//! -//! The hasher supports: -//! 1. Single permutation of Poseidon2 -//! 2. 2-to-1 hash (merge) -//! 3. Linear hash of n field elements -//! 4. Merkle path verification -//! 5. Merkle root update -//! -//! ## Column Layout (within chiplet, offset by selectors) -//! -//! | Column | Purpose | -//! |----------|---------| -//! | s[0..2] | Selector flags | -//! | h[0..12) | Hasher state (RATE0, RATE1, CAP) | -//! | i | Node index (for Merkle operations) | -//! -//! ## References -//! -//! - [Hasher chiplet design](https://0xmiden.github.io/miden-vm/design/chiplets/hasher.html) - -pub mod flags; -pub mod merkle; -pub mod periodic; -pub mod selectors; -pub mod state; - -use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::LiftedAirBuilder; -// Re-export commonly used items -pub use periodic::{STATE_WIDTH, periodic_columns}; - -use crate::{ - Felt, MainTraceRow, - constraints::tagging::{TaggingAirBuilderExt, ids::TAG_CHIPLETS_BASE}, - trace::{ - CHIPLETS_OFFSET, - chiplets::{HASHER_NODE_INDEX_COL_IDX, HASHER_SELECTOR_COL_RANGE, HASHER_STATE_COL_RANGE}, - }, -}; - -// TAGGING IDS -// ================================================================================================ - -/// Base ID for hasher chiplet constraints (next after chiplet selectors). -pub(super) const HASHER_BASE_ID: usize = TAG_CHIPLETS_BASE + 10; -pub(super) const HASHER_PERM_INIT_BASE_ID: usize = HASHER_BASE_ID; -pub(super) const HASHER_PERM_EXT_BASE_ID: usize = HASHER_PERM_INIT_BASE_ID + STATE_WIDTH; -pub(super) const HASHER_PERM_INT_BASE_ID: usize = HASHER_PERM_EXT_BASE_ID + STATE_WIDTH; -pub(super) const HASHER_SELECTOR_BOOL_BASE_ID: usize = HASHER_PERM_INT_BASE_ID + STATE_WIDTH; -pub(super) const HASHER_SELECTOR_CONSIST_BASE_ID: usize = HASHER_SELECTOR_BOOL_BASE_ID + 3; -pub(super) const HASHER_ABP_BASE_ID: usize = HASHER_SELECTOR_CONSIST_BASE_ID + 4; -pub(super) const HASHER_OUTPUT_IDX_ID: usize = HASHER_ABP_BASE_ID + 4; -pub(super) const HASHER_MERKLE_INDEX_BASE_ID: usize = HASHER_OUTPUT_IDX_ID + 1; -pub(super) const HASHER_MERKLE_ABSORB_BASE_ID: usize = HASHER_MERKLE_INDEX_BASE_ID + 2; - -const OUTPUT_INDEX_NAMESPACE: &str = "chiplets.hasher.output.index"; - -/// Precomputed hasher flags derived from selectors and cycle markers. -struct HasherFlags { - pub cycle_row_31: E, - pub f_abp: E, - pub f_mpa: E, - pub f_mva: E, - pub f_mua: E, - pub f_out: E, - pub f_out_next: E, - pub f_mp: E, - pub f_mv: E, - pub f_mu: E, -} - -impl HasherFlags { - #[inline] - fn f_merkle_active(&self) -> E { - flags::f_merkle_active( - self.f_mp.clone(), - self.f_mv.clone(), - self.f_mu.clone(), - self.f_mpa.clone(), - self.f_mva.clone(), - self.f_mua.clone(), - ) - } - - #[inline] - fn f_merkle_absorb(&self) -> E { - flags::f_merkle_absorb(self.f_mpa.clone(), self.f_mva.clone(), self.f_mua.clone()) - } - - #[inline] - fn f_continuation(&self) -> E { - flags::f_continuation( - self.f_abp.clone(), - self.f_mpa.clone(), - self.f_mva.clone(), - self.f_mua.clone(), - ) - } -} - -/// Typed access to hasher chiplet columns. -/// -/// This struct provides named access to hasher columns, eliminating error-prone -/// index arithmetic. Created from a `MainTraceRow` reference. -/// -/// ## Layout -/// - `s0, s1, s2`: Selector columns determining operation type -/// - `state[0..12]`: Poseidon2 state (RATE0[0..4], RATE1[4..8], CAP[8..12]) -/// - `node_index`: Merkle tree node index -pub struct HasherColumns { - /// Selector 0 - pub s0: E, - /// Selector 1 - pub s1: E, - /// Selector 2 - pub s2: E, - /// Full Poseidon2 state (12 elements) - pub state: [E; STATE_WIDTH], - /// Node index for Merkle operations - pub node_index: E, -} - -impl HasherColumns { - /// Extract hasher columns from a main trace row. - pub fn from_row(row: &MainTraceRow) -> Self - where - V: Into + Clone, - { - let s_start = HASHER_SELECTOR_COL_RANGE.start - CHIPLETS_OFFSET; - let h_start = HASHER_STATE_COL_RANGE.start - CHIPLETS_OFFSET; - let idx_col = HASHER_NODE_INDEX_COL_IDX - CHIPLETS_OFFSET; - - HasherColumns { - s0: row.chiplets[s_start].clone().into(), - s1: row.chiplets[s_start + 1].clone().into(), - s2: row.chiplets[s_start + 2].clone().into(), - state: core::array::from_fn(|i| row.chiplets[h_start + i].clone().into()), - node_index: row.chiplets[idx_col].clone().into(), - } - } - - /// Get the digest (first 4 elements of state, same as rate0). - #[inline] - pub fn digest(&self) -> [E; 4] { - core::array::from_fn(|i| self.state[i].clone()) - } - - /// Get rate0 (state[0..4]). - #[inline] - pub fn rate0(&self) -> [E; 4] { - core::array::from_fn(|i| self.state[i].clone()) - } - - /// Get rate1 (state[4..8]). - #[inline] - pub fn rate1(&self) -> [E; 4] { - core::array::from_fn(|i| self.state[4 + i].clone()) - } - - /// Get capacity (state[8..12]). - #[inline] - pub fn capacity(&self) -> [E; 4] { - core::array::from_fn(|i| self.state[8 + i].clone()) - } -} - -struct HasherContext> { - pub cols: HasherColumns, - pub cols_next: HasherColumns, - pub flags: HasherFlags, - pub hasher_flag: AB::Expr, - pub periodic: [AB::PeriodicVar; periodic::NUM_PERIODIC_COLUMNS], -} - -impl HasherContext -where - AB: TaggingAirBuilderExt, -{ - pub fn new( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, - ) -> Self { - let periodic: [AB::PeriodicVar; periodic::NUM_PERIODIC_COLUMNS] = { - let periodic = builder.periodic_values(); - debug_assert!( - periodic.len() >= periodic::NUM_PERIODIC_COLUMNS, - "not enough periodic values for hasher constraints" - ); - core::array::from_fn(|i| periodic[i]) - }; - - let hasher_flag: AB::Expr = AB::Expr::ONE - local.chiplets[0].clone().into(); - let cols: HasherColumns = HasherColumns::from_row(local); - let cols_next: HasherColumns = HasherColumns::from_row(next); - let flags = compute_hasher_flags::(&periodic, &cols, &cols_next); - - HasherContext:: { - cols, - cols_next, - flags, - hasher_flag, - periodic, - } - } -} - -// ENTRY POINTS -// ================================================================================================ - -/// Enforce all hasher chiplet constraints. -/// -/// This is the main entry point for hasher constraints, enforcing: -/// 1. Permutation step constraints -/// 2. Selector constraints -/// 3. Boundary constraints -/// 4. Merkle operation constraints -/// -/// ## Chiplet Activation -/// -/// The hasher chiplet is active when `chiplets[0] = 0` (i.e., `!s0` at the chiplet level). -pub fn enforce_hasher_constraints( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, -) where - AB: TaggingAirBuilderExt, -{ - let ctx = HasherContext::::new(builder, local, next); - - enforce_permutation(builder, &ctx); - // Enforce selector booleanity using raw vars. - let cols_var: HasherColumns = HasherColumns::::from_row(local); - selectors::enforce_selector_booleanity( - builder, - ctx.hasher_flag.clone(), - cols_var.s0, - cols_var.s1, - cols_var.s2, - ); - enforce_selector_consistency(builder, &ctx); - enforce_abp_capacity(builder, &ctx); - enforce_merkle_constraints(builder, &ctx); -} - -// INTERNAL HELPERS -// ================================================================================================ - -/// Enforce Poseidon2 permutation step constraints. -/// -/// Delegates to [`state::enforce_permutation_steps`] with proper column extraction. -fn enforce_permutation(builder: &mut AB, ctx: &HasherContext) -where - AB: TaggingAirBuilderExt, -{ - // Enforce permutation steps - state::enforce_permutation_steps( - builder, - ctx.hasher_flag.clone(), - &ctx.cols.state, - &ctx.cols_next.state, - &ctx.periodic, - ); -} - -/// Enforce selector consistency constraints. -/// -/// Delegates to [`selectors::enforce_selector_consistency`] with proper column extraction. -fn enforce_selector_consistency(builder: &mut AB, ctx: &HasherContext) -where - AB: TaggingAirBuilderExt, -{ - selectors::enforce_selector_consistency( - builder, - ctx.hasher_flag.clone(), - &ctx.cols, - &ctx.cols_next, - &ctx.flags, - ); -} - -/// Enforce ABP capacity preservation on row 31 of the cycle. -fn enforce_abp_capacity(builder: &mut AB, ctx: &HasherContext) -where - AB: TaggingAirBuilderExt, -{ - state::enforce_abp_capacity_preservation( - builder, - ctx.hasher_flag.clone(), - ctx.flags.f_abp.clone(), - &ctx.cols.capacity(), - &ctx.cols_next.capacity(), - ); -} - -/// Enforce Merkle path constraints. -/// -/// Delegates to [`merkle`] module functions for index and state constraints. -fn enforce_merkle_constraints(builder: &mut AB, ctx: &HasherContext) -where - AB: TaggingAirBuilderExt, -{ - // Node index constraints - merkle::enforce_node_index_constraints( - builder, - ctx.hasher_flag.clone(), - &ctx.cols, - &ctx.cols_next, - &ctx.flags, - ); - - // Merkle absorb state constraints - merkle::enforce_merkle_absorb_state( - builder, - ctx.hasher_flag.clone(), - &ctx.cols, - &ctx.cols_next, - &ctx.flags, - ); -} - -fn compute_hasher_flags( - periodic: &[AB::PeriodicVar], - cols: &HasherColumns, - cols_next: &HasherColumns, -) -> HasherFlags -where - AB: LiftedAirBuilder, -{ - let cycle_row_31: AB::Expr = periodic[periodic::P_CYCLE_ROW_31].into(); - - let cycle_row_0: AB::Expr = periodic[periodic::P_CYCLE_ROW_0].into(); - let cycle_row_30: AB::Expr = periodic[periodic::P_CYCLE_ROW_30].into(); - - let s0 = cols.s0.clone(); - let s1 = cols.s1.clone(); - let s2 = cols.s2.clone(); - let s0_next = cols_next.s0.clone(); - let s1_next = cols_next.s1.clone(); - - let f_mp = flags::f_mp(cycle_row_0.clone(), s0.clone(), s1.clone(), s2.clone()); - let f_mv = flags::f_mv(cycle_row_0.clone(), s0.clone(), s1.clone(), s2.clone()); - let f_mu = flags::f_mu(cycle_row_0.clone(), s0.clone(), s1.clone(), s2.clone()); - - let f_abp = flags::f_abp(cycle_row_31.clone(), s0.clone(), s1.clone(), s2.clone()); - let f_mpa = flags::f_mpa(cycle_row_31.clone(), s0.clone(), s1.clone(), s2.clone()); - let f_mva = flags::f_mva(cycle_row_31.clone(), s0.clone(), s1.clone(), s2.clone()); - let f_mua = flags::f_mua(cycle_row_31.clone(), s0.clone(), s1.clone(), s2.clone()); - - let f_out = flags::f_out(cycle_row_31.clone(), s0, s1.clone()); - let f_out_next = flags::f_out_next(cycle_row_30, s0_next, s1_next); - - HasherFlags { - cycle_row_31, - f_abp, - f_mpa, - f_mva, - f_mua, - f_out, - f_out_next, - f_mp, - f_mv, - f_mu, - } -} diff --git a/air/src/constraints/chiplets/hasher/periodic.rs b/air/src/constraints/chiplets/hasher/periodic.rs deleted file mode 100644 index 207683024a..0000000000 --- a/air/src/constraints/chiplets/hasher/periodic.rs +++ /dev/null @@ -1,197 +0,0 @@ -//! Hasher chiplet periodic columns. -//! -//! This module defines the periodic columns used by the Poseidon2 hasher chiplet. -//! The hasher operates on a 32-row cycle, and periodic columns provide cycle-position -//! markers and round constants. -//! -//! ## Column Layout -//! -//! | Index | Name | Description | -//! |-------|----------------|-------------| -//! | 0 | cycle_row_0 | 1 on first row of cycle, 0 elsewhere | -//! | 1 | cycle_row_30 | 1 on penultimate row (lookahead for output) | -//! | 2 | cycle_row_31 | 1 on final row (boundary/output row) | -//! | 3 | p2_is_external | 1 on external round rows (1-4, 27-30) | -//! | 4 | p2_is_internal | 1 on internal round rows (5-26) | -//! | 5-16 | ark_ext[0..12] | External round constants per lane | -//! | 17 | ark_int | Internal round constant (lane 0 only) | - -use alloc::vec::Vec; - -use miden_core::chiplets::hasher::Hasher; - -use crate::Felt; - -// CONSTANTS -// ================================================================================================ - -/// Length of one hash cycle. -pub const HASH_CYCLE_LEN: usize = 32; - -/// Width of the hasher state. -pub const STATE_WIDTH: usize = 12; - -// Periodic column indices. -pub const P_CYCLE_ROW_0: usize = 0; -pub const P_CYCLE_ROW_30: usize = 1; -pub const P_CYCLE_ROW_31: usize = 2; -pub const P_IS_EXTERNAL: usize = 3; -pub const P_IS_INTERNAL: usize = 4; -pub const P_ARK_EXT_START: usize = 5; -pub const P_ARK_INT: usize = P_ARK_EXT_START + STATE_WIDTH; - -/// Total number of periodic columns for the hasher chiplet. -pub const NUM_PERIODIC_COLUMNS: usize = P_ARK_INT + 1; - -// INTERNAL HELPERS -// ================================================================================================ - -/// Returns periodic columns for the Poseidon2 hasher chiplet. -/// -/// ## Layout -/// -/// All columns repeat every 32 rows, matching one permutation cycle: -/// -/// - **Cycle markers** (`cycle_row_0`, `cycle_row_30`, `cycle_row_31`): Single-one markers for the -/// first row, penultimate row, and final row of a cycle. Row 31 is the boundary/output row where -/// we do **not** enforce a step transition. -/// -/// - **Step selectors** (`p2_is_external`, `p2_is_internal`): Mutually exclusive step selectors: -/// - Rows 1-4 and 27-30 are external rounds (full S-box on all lanes + M_E). -/// - Rows 5-26 are internal rounds (add RC to lane 0, S-box lane 0 only, then M_I). -/// - Row 0 is the initial "linear" step (M_E only) and row 31 is no-op; both selectors are 0. -/// -/// - **External round constants** (`ark_ext_0..11`): Lane-indexed constants, non-zero only on -/// external-round rows (1-4 = initial; 27-30 = terminal). -/// -/// - **Internal round constant** (`ark_int`): Constant for lane 0 only, non-zero on internal rows -/// 5-26. -#[allow(clippy::needless_range_loop)] -pub fn periodic_columns() -> Vec> { - let mut cols: Vec> = Vec::with_capacity(NUM_PERIODIC_COLUMNS); - - // ------------------------------------------------------------------------- - // Cycle markers - // ------------------------------------------------------------------------- - let mut row0 = vec![Felt::ZERO; HASH_CYCLE_LEN]; - let mut row30 = vec![Felt::ZERO; HASH_CYCLE_LEN]; - let mut row31 = vec![Felt::ZERO; HASH_CYCLE_LEN]; - row0[0] = Felt::ONE; - row30[30] = Felt::ONE; - row31[31] = Felt::ONE; - cols.push(row0); - cols.push(row30); - cols.push(row31); - - // ------------------------------------------------------------------------- - // Step-type selectors - // ------------------------------------------------------------------------- - let mut p2_is_external = vec![Felt::ZERO; HASH_CYCLE_LEN]; - let mut p2_is_internal = vec![Felt::ZERO; HASH_CYCLE_LEN]; - - // External rounds: rows 1-4 (initial) and 27-30 (terminal) - for r in 1..=4 { - p2_is_external[r] = Felt::ONE; - } - for r in 27..=30 { - p2_is_external[r] = Felt::ONE; - } - - // Internal rounds: rows 5-26 - for r in 5..=26 { - p2_is_internal[r] = Felt::ONE; - } - - cols.push(p2_is_external); - cols.push(p2_is_internal); - - // ------------------------------------------------------------------------- - // External round constants (12 lanes) - // ------------------------------------------------------------------------- - for lane in 0..STATE_WIDTH { - let mut col = vec![Felt::ZERO; HASH_CYCLE_LEN]; - // Initial external rounds: rows 1-4 - for r in 1..=4 { - col[r] = Hasher::ARK_EXT_INITIAL[r - 1][lane]; - } - // Terminal external rounds: rows 27-30 - for r in 27..=30 { - col[r] = Hasher::ARK_EXT_TERMINAL[r - 27][lane]; - } - cols.push(col); - } - - // ------------------------------------------------------------------------- - // Internal round constant (lane 0 only) - // ------------------------------------------------------------------------- - let mut ark_int = vec![Felt::ZERO; HASH_CYCLE_LEN]; - ark_int[5..=26].copy_from_slice(&Hasher::ARK_INT); - cols.push(ark_int); - - cols -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn periodic_columns_dimensions() { - let cols = periodic_columns(); - assert_eq!(cols.len(), NUM_PERIODIC_COLUMNS); - for col in &cols { - assert_eq!(col.len(), HASH_CYCLE_LEN); - } - } - - #[test] - fn cycle_markers_are_exclusive() { - let cols = periodic_columns(); - for (row_idx, ((row0, row30), row31)) in cols[P_CYCLE_ROW_0] - .iter() - .zip(&cols[P_CYCLE_ROW_30]) - .zip(&cols[P_CYCLE_ROW_31]) - .enumerate() - { - // Booleanity checks - assert_eq!(*row0 * (*row0 - Felt::ONE), Felt::ZERO); - assert_eq!(*row30 * (*row30 - Felt::ONE), Felt::ZERO); - assert_eq!(*row31 * (*row31 - Felt::ONE), Felt::ZERO); - - // Mutual exclusivity (XOR when boolean) - assert_eq!(*row0 * *row30, Felt::ZERO); - assert_eq!(*row0 * *row31, Felt::ZERO); - assert_eq!(*row30 * *row31, Felt::ZERO); - - // Exactness: only the designated rows are 1. - let expected = match row_idx { - 0 | 30 | 31 => Felt::ONE, - _ => Felt::ZERO, - }; - assert_eq!(*row0 + *row30 + *row31, expected); - } - } - - #[test] - fn step_selectors_are_exclusive() { - let cols = periodic_columns(); - for (row_idx, (is_ext, is_int)) in - cols[P_IS_EXTERNAL].iter().zip(&cols[P_IS_INTERNAL]).enumerate() - { - // Booleanity checks - assert_eq!(*is_ext * (*is_ext - Felt::ONE), Felt::ZERO); - assert_eq!(*is_int * (*is_int - Felt::ONE), Felt::ZERO); - - // Mutual exclusivity (XOR when boolean) - assert_eq!(*is_ext * *is_int, Felt::ZERO); - - // Exactness per row - let expected = match row_idx { - 1..=4 | 27..=30 => (Felt::ONE, Felt::ZERO), - 5..=26 => (Felt::ZERO, Felt::ONE), - _ => (Felt::ZERO, Felt::ZERO), - }; - assert_eq!((*is_ext, *is_int), expected); - } - } -} diff --git a/air/src/constraints/chiplets/hasher/selectors.rs b/air/src/constraints/chiplets/hasher/selectors.rs deleted file mode 100644 index 28007998c0..0000000000 --- a/air/src/constraints/chiplets/hasher/selectors.rs +++ /dev/null @@ -1,156 +0,0 @@ -//! Hasher chiplet selector consistency constraints. -//! -//! This module enforces constraints on the selector columns `s[0..2]` that control -//! hasher operation modes. These constraints ensure: -//! -//! 1. **Booleanity**: Selector values are binary (0 or 1) -//! 2. **Stability**: Selectors remain unchanged except at cycle boundaries -//! 3. **Sequencing**: After absorb operations, computation continues properly -//! 4. **Validity**: Invalid selector combinations are rejected -//! -//! ## Selector Encodings on Row 31 -//! -//! | Operation | s0 | s1 | s2 | Description | -//! |-----------|----|----|----|--------------------| -//! | ABP | 1 | 0 | 0 | Absorb for linear hash | -//! | HOUT | 0 | 0 | 0 | Output digest | -//! | SOUT | 0 | 0 | 1 | Output full state | -//! | MPA | 1 | 0 | 1 | Merkle path absorb | -//! | MVA | 1 | 1 | 0 | Merkle verify absorb | -//! | MUA | 1 | 1 | 1 | Merkle update absorb | - -use miden_core::field::PrimeCharacteristicRing; - -use super::{HasherColumns, HasherFlags}; -use crate::{ - Felt, - constraints::tagging::{ - TagGroup, TaggingAirBuilderExt, tagged_assert_zero, tagged_assert_zero_integrity, - tagged_assert_zeros, tagged_assert_zeros_integrity, - }, -}; - -// TAGGING NAMESPACES -// ================================================================================================ - -const SELECTOR_BOOL_NAMESPACE: &str = "chiplets.hasher.selectors.binary"; -const SELECTOR_STABILITY_NAMESPACE: &str = "chiplets.hasher.selectors.stability"; -const SELECTOR_CONT_NAMESPACE: &str = "chiplets.hasher.selectors.continuation"; -const SELECTOR_INVALID_NAMESPACE: &str = "chiplets.hasher.selectors.invalid"; - -const SELECTOR_BOOL_NAMES: [&str; 3] = [SELECTOR_BOOL_NAMESPACE; 3]; -const SELECTOR_CONSIST_NAMES: [&str; 4] = [ - SELECTOR_STABILITY_NAMESPACE, - SELECTOR_STABILITY_NAMESPACE, - SELECTOR_CONT_NAMESPACE, - SELECTOR_INVALID_NAMESPACE, -]; - -const SELECTOR_BOOL_TAGS: TagGroup = TagGroup { - base: super::HASHER_SELECTOR_BOOL_BASE_ID, - names: &SELECTOR_BOOL_NAMES, -}; -const SELECTOR_CONSIST_TAGS: TagGroup = TagGroup { - base: super::HASHER_SELECTOR_CONSIST_BASE_ID, - names: &SELECTOR_CONSIST_NAMES, -}; - -// CONSTRAINT HELPERS -// ================================================================================================ - -/// Enforces selector consistency constraints for the hasher chiplet. -/// -/// ## Constraints -/// -/// 1. **Selector stability**: `s[1]` and `s[2]` must remain unchanged across rows, except: -/// - On output rows (HOUT/SOUT on row 31), where selectors can change for the next cycle. -/// - On lookahead rows (row 30 when next row is output), to prepare output selectors. -/// -/// 2. **Continuation sequencing**: After ABP/MPA/MVA/MUA (absorb operations on row 31), the next -/// cycle must continue hashing, so `s[0]' = 0`. -/// -/// 3. **Invalid combination rejection**: On row 31, if `s[0]=0` then `s[1]` must also be 0. This -/// prevents invalid selector states like `(0,1,0)` or `(0,1,1)`. -pub(super) fn enforce_selector_consistency( - builder: &mut AB, - hasher_flag: AB::Expr, - cols: &HasherColumns, - cols_next: &HasherColumns, - flags: &HasherFlags, -) where - AB: TaggingAirBuilderExt, -{ - let one: AB::Expr = AB::Expr::ONE; - - // ------------------------------------------------------------------------- - // Constraint 1: Selector stability - // ------------------------------------------------------------------------- - // s[1] and s[2] unchanged unless f_out or f_out_next. - // Constraint: (1 - f_out - f_out_next) * (s[i]' - s[i]) = 0 - // Note: f_out and f_out_next are mutually exclusive (row30 vs row31), so no overlap. - let stability_gate = one.clone() - flags.f_out.clone() - flags.f_out_next.clone(); - - // Use a combined gate to share `hasher_flag * stability_gate` across both stability - // constraints. - let gate = hasher_flag.clone() * stability_gate; - let mut idx = 0; - tagged_assert_zeros( - builder, - &SELECTOR_CONSIST_TAGS, - &mut idx, - SELECTOR_STABILITY_NAMESPACE, - [ - gate.clone() * (cols_next.s1.clone() - cols.s1.clone()), - gate * (cols_next.s2.clone() - cols.s2.clone()), - ], - ); - - // Continuation constraint: hasher_flag * flag_cont * s0' = 0. - // (Single constraint, so no batching benefit beyond using `.when(gate)`.) - let gate = hasher_flag.clone() * flags.f_continuation(); - tagged_assert_zero(builder, &SELECTOR_CONSIST_TAGS, &mut idx, gate * cols_next.s0.clone()); - - // ------------------------------------------------------------------------- - // Constraint 3: Invalid selector combinations rejection - // ------------------------------------------------------------------------- - // On row31, if s0 = 0 then s1 must be 0. This prevents (0,1,*) combinations. - // Constraint: row31 * (1 - s0) * s1 = 0 - tagged_assert_zero_integrity( - builder, - &SELECTOR_CONSIST_TAGS, - &mut idx, - hasher_flag - * flags.cycle_row_31.clone() - * (one.clone() - cols.s0.clone()) - * cols.s1.clone(), - ); -} - -/// Enforces that selector columns are binary. -/// -/// This is called from the main permutation constraint with the step gate. -pub fn enforce_selector_booleanity( - builder: &mut AB, - hasher_flag: AB::Expr, - s0: AB::Var, - s1: AB::Var, - s2: AB::Var, -) where - AB: TaggingAirBuilderExt, -{ - let s0: AB::Expr = s0.into(); - let s1: AB::Expr = s1.into(); - let s2: AB::Expr = s2.into(); - let mut idx = 0; - tagged_assert_zeros_integrity( - builder, - &SELECTOR_BOOL_TAGS, - &mut idx, - SELECTOR_BOOL_NAMESPACE, - [ - hasher_flag.clone() * s0.clone() * (s0 - AB::Expr::ONE), - hasher_flag.clone() * s1.clone() * (s1 - AB::Expr::ONE), - hasher_flag * s2.clone() * (s2 - AB::Expr::ONE), - ], - ); -} diff --git a/air/src/constraints/chiplets/hasher/state.rs b/air/src/constraints/chiplets/hasher/state.rs deleted file mode 100644 index 1c924ba516..0000000000 --- a/air/src/constraints/chiplets/hasher/state.rs +++ /dev/null @@ -1,257 +0,0 @@ -//! Hasher chiplet state transition constraints. -//! -//! This module enforces the Poseidon2 permutation constraints for the hasher chiplet. -//! The permutation operates on a 32-row cycle with three types of steps: -//! -//! - **Row 0 (init linear)**: Apply external linear layer M_E only -//! - **Rows 1-4, 27-30 (external)**: Add lane RCs, full S-box^7, then M_E -//! - **Rows 5-26 (internal)**: Add RC to lane 0, S-box lane 0 only, then M_I -//! - **Row 31 (boundary)**: No step constraint (output/absorb row) -//! -//! ## Poseidon2 Parameters -//! -//! - State width: 12 field elements -//! - External rounds: 8 (4 initial + 4 terminal) -//! - Internal rounds: 22 -//! - S-box: x^7 - -use miden_core::{chiplets::hasher::Hasher, field::PrimeCharacteristicRing}; -use miden_crypto::stark::air::LiftedAirBuilder; - -use super::periodic::{ - P_ARK_EXT_START, P_ARK_INT, P_CYCLE_ROW_0, P_IS_EXTERNAL, P_IS_INTERNAL, STATE_WIDTH, -}; -use crate::{ - Felt, - constraints::tagging::{TagGroup, TaggingAirBuilderExt, tagged_assert_zeros}, -}; - -// TAGGING NAMESPACES -// ================================================================================================ - -const PERM_INIT_NAMESPACE: &str = "chiplets.hasher.permutation.init"; -const PERM_EXT_NAMESPACE: &str = "chiplets.hasher.permutation.external"; -const PERM_INT_NAMESPACE: &str = "chiplets.hasher.permutation.internal"; -const ABP_CAP_NAMESPACE: &str = "chiplets.hasher.abp.capacity"; - -const PERM_INIT_NAMES: [&str; STATE_WIDTH] = [PERM_INIT_NAMESPACE; STATE_WIDTH]; -const PERM_EXT_NAMES: [&str; STATE_WIDTH] = [PERM_EXT_NAMESPACE; STATE_WIDTH]; -const PERM_INT_NAMES: [&str; STATE_WIDTH] = [PERM_INT_NAMESPACE; STATE_WIDTH]; -const ABP_CAP_NAMES: [&str; 4] = [ABP_CAP_NAMESPACE; 4]; - -const PERM_INIT_TAGS: TagGroup = TagGroup { - base: super::HASHER_PERM_INIT_BASE_ID, - names: &PERM_INIT_NAMES, -}; -const PERM_EXT_TAGS: TagGroup = TagGroup { - base: super::HASHER_PERM_EXT_BASE_ID, - names: &PERM_EXT_NAMES, -}; -const PERM_INT_TAGS: TagGroup = TagGroup { - base: super::HASHER_PERM_INT_BASE_ID, - names: &PERM_INT_NAMES, -}; -const ABP_CAP_TAGS: TagGroup = TagGroup { - base: super::HASHER_ABP_BASE_ID, - names: &ABP_CAP_NAMES, -}; - -// CONSTRAINT HELPERS -// ================================================================================================ - -/// Enforces Poseidon2 permutation step constraints. -/// -/// ## Step Types -/// -/// 1. **Init linear (row 0)**: `h' = M_E(h)` -/// 2. **External round (rows 1-4, 27-30)**: `h' = M_E(S-box(h + ark_ext))` -/// 3. **Internal round (rows 5-26)**: `h' = M_I(h with lane0 = (h[0] + ark_int)^7)` -/// 4. **Boundary (row 31)**: No constraint -pub fn enforce_permutation_steps( - builder: &mut AB, - hasher_flag: AB::Expr, - h: &[AB::Expr; STATE_WIDTH], - h_next: &[AB::Expr; STATE_WIDTH], - periodic: &[AB::PeriodicVar], -) where - AB: TaggingAirBuilderExt, -{ - // Cycle markers and step selectors - let cycle_row_0: AB::Expr = periodic[P_CYCLE_ROW_0].into(); - let is_external: AB::Expr = periodic[P_IS_EXTERNAL].into(); - let is_internal: AB::Expr = periodic[P_IS_INTERNAL].into(); - let is_init_linear = cycle_row_0.clone(); - - // External round constants - let mut ark_ext = [AB::Expr::ZERO; STATE_WIDTH]; - for lane in 0..STATE_WIDTH { - ark_ext[lane] = periodic[P_ARK_EXT_START + lane].into(); - } - let ark_int: AB::Expr = periodic[P_ARK_INT].into(); - - // ------------------------------------------------------------------------- - // Compute expected next states for each step type - // ------------------------------------------------------------------------- - - // Init linear: h' = M_E(h) - let expected_init = apply_matmul_external::(h); - - // External round: h' = M_E(S-box(h + ark_ext)) - let ext_with_rc: [AB::Expr; STATE_WIDTH] = - core::array::from_fn(|i| h[i].clone() + ark_ext[i].clone()); - let ext_with_sbox: [AB::Expr; STATE_WIDTH] = - core::array::from_fn(|i| ext_with_rc[i].clone().exp_const_u64::<7>()); - let expected_ext = apply_matmul_external::(&ext_with_sbox); - - // Internal round: h' = M_I(h with h[0] = (h[0] + ark_int)^7) - let mut tmp_int = h.clone(); - tmp_int[0] = (tmp_int[0].clone() + ark_int).exp_const_u64::<7>(); - let expected_int = apply_matmul_internal::(&tmp_int); - - // ------------------------------------------------------------------------- - // Enforce step constraints - // ------------------------------------------------------------------------- - - // Use combined gates to share `hasher_flag * step_type` across all lanes. - let gate_init = hasher_flag.clone() * is_init_linear; - let mut idx = 0; - tagged_assert_zeros( - builder, - &PERM_INIT_TAGS, - &mut idx, - PERM_INIT_NAMESPACE, - core::array::from_fn::<_, STATE_WIDTH, _>(|i| { - gate_init.clone() * (h_next[i].clone() - expected_init[i].clone()) - }), - ); - - let gate_ext = hasher_flag.clone() * is_external; - let mut idx = 0; - tagged_assert_zeros( - builder, - &PERM_EXT_TAGS, - &mut idx, - PERM_EXT_NAMESPACE, - core::array::from_fn::<_, STATE_WIDTH, _>(|i| { - gate_ext.clone() * (h_next[i].clone() - expected_ext[i].clone()) - }), - ); - - let gate_int = hasher_flag * is_internal; - let mut idx = 0; - tagged_assert_zeros( - builder, - &PERM_INT_TAGS, - &mut idx, - PERM_INT_NAMESPACE, - core::array::from_fn::<_, STATE_WIDTH, _>(|i| { - gate_int.clone() * (h_next[i].clone() - expected_int[i].clone()) - }), - ); -} - -/// Enforces ABP capacity preservation constraint. -/// -/// When absorbing the next set of elements during linear hash computation (ABP on row 31), -/// the capacity portion `h[8..12]` is preserved unchanged. -pub fn enforce_abp_capacity_preservation( - builder: &mut AB, - hasher_flag: AB::Expr, - f_abp: AB::Expr, - h_cap: &[AB::Expr; 4], - h_cap_next: &[AB::Expr; 4], -) where - AB: TaggingAirBuilderExt, -{ - // Use a combined gate to share `hasher_flag * f_abp` across all 4 lanes. - let gate = hasher_flag * f_abp; - let mut idx = 0; - tagged_assert_zeros( - builder, - &ABP_CAP_TAGS, - &mut idx, - ABP_CAP_NAMESPACE, - core::array::from_fn::<_, 4, _>(|i| { - gate.clone() * (h_cap_next[i].clone() - h_cap[i].clone()) - }), - ); -} - -// ============================================================================= -// LINEAR ALGEBRA HELPERS -// ============================================================================= - -/// Applies the external linear layer M_E to the state. -/// -/// The external layer consists of: -/// 1. Apply M4 to each 4-element block -/// 2. Add cross-block sums to each element -fn apply_matmul_external>( - state: &[AB::Expr; STATE_WIDTH], -) -> [AB::Expr; STATE_WIDTH] { - // Apply M4 to each block - let b0 = - matmul_m4::(&[state[0].clone(), state[1].clone(), state[2].clone(), state[3].clone()]); - let b1 = - matmul_m4::(&[state[4].clone(), state[5].clone(), state[6].clone(), state[7].clone()]); - let b2 = matmul_m4::(&[ - state[8].clone(), - state[9].clone(), - state[10].clone(), - state[11].clone(), - ]); - - // Compute cross-block sums - let stored0 = b0[0].clone() + b1[0].clone() + b2[0].clone(); - let stored1 = b0[1].clone() + b1[1].clone() + b2[1].clone(); - let stored2 = b0[2].clone() + b1[2].clone() + b2[2].clone(); - let stored3 = b0[3].clone() + b1[3].clone() + b2[3].clone(); - - // Add sums to each element - [ - b0[0].clone() + stored0.clone(), - b0[1].clone() + stored1.clone(), - b0[2].clone() + stored2.clone(), - b0[3].clone() + stored3.clone(), - b1[0].clone() + stored0.clone(), - b1[1].clone() + stored1.clone(), - b1[2].clone() + stored2.clone(), - b1[3].clone() + stored3.clone(), - b2[0].clone() + stored0, - b2[1].clone() + stored1, - b2[2].clone() + stored2, - b2[3].clone() + stored3, - ] -} - -/// Applies the 4x4 MDS matrix M4. -fn matmul_m4>(input: &[AB::Expr; 4]) -> [AB::Expr; 4] { - let [a, b, c, d] = input.clone(); - - let t0 = a.clone() + b.clone(); - let t1 = c.clone() + d.clone(); - let t2 = b.clone() + b.clone() + t1.clone(); // 2b + t1 - let t3 = d.clone() + d.clone() + t0.clone(); // 2d + t0 - let t4 = t1.clone().double() + t1.clone().double() + t3.clone(); // 4*t1 + t3 - let t5 = t0.clone().double() + t0.clone().double() + t2.clone(); // 4*t0 + t2 - - let out0 = t3.clone() + t5.clone(); - let out1 = t5; - let out2 = t2 + t4.clone(); - let out3 = t4; - - [out0, out1, out2, out3] -} - -/// Applies the internal linear layer M_I to the state. -/// -/// M_I = I + diag(MAT_DIAG) where all rows share the same sum. -fn apply_matmul_internal>( - state: &[AB::Expr; STATE_WIDTH], -) -> [AB::Expr; STATE_WIDTH] { - // Sum of all state elements - let sum: AB::Expr = state.iter().cloned().reduce(|a, b| a + b).expect("STATE_WIDTH > 0"); - - // result[i] = state[i] * MAT_DIAG[i] + sum - core::array::from_fn(|i| state[i].clone() * AB::Expr::from(Hasher::MAT_DIAG[i]) + sum.clone()) -} diff --git a/air/src/constraints/chiplets/hasher_control/flags.rs b/air/src/constraints/chiplets/hasher_control/flags.rs new file mode 100644 index 0000000000..520bbc216d --- /dev/null +++ b/air/src/constraints/chiplets/hasher_control/flags.rs @@ -0,0 +1,146 @@ +//! Semantic row-kind flags for the controller sub-chiplet. +//! +//! [`ControllerFlags`] is a pure naming layer over compositions of the hasher-internal +//! sub-selectors `(s0, s1, s2)` on the current and next rows. Each field gives a +//! meaningful name to a bit-pattern product so constraint code never references +//! raw `cols.s0 / cols.s1 / cols.s2` as ad-hoc gate factors. +//! +//! This struct contains **no** chiplet-level scope (`is_active`, `is_transition`): +//! those live on [`ChipletFlags`] and are combined with these row flags by +//! multiplication at each call site. +//! +//! ## Selector encoding (current row, within controller rows) +//! +//! | s0 | s1 | s2 | Row type | Flag | +//! |----|----|----|----------|------| +//! | 1 | 0 | 0 | Sponge input (LINEAR_HASH / 2-to-1 / HPERM) | `is_sponge_input` | +//! | 1 | 0 | 1 | MP input (Merkle path verify) | `is_merkle_input` | +//! | 1 | 1 | 0 | MV input (old-path Merkle root update) | `is_merkle_input` / `is_mv_input` | +//! | 1 | 1 | 1 | MU input (new-path Merkle root update) | `is_merkle_input` | +//! | 0 | 0 | 0 | HOUT output (return digest) | `is_hout` / `is_output` | +//! | 0 | 0 | 1 | SOUT output (return full state) | `is_sout` / `is_output` | +//! | 0 | 1 | * | Padding (inactive slot) | `is_padding` | +//! +//! On permutation rows (`s_perm = 1`), `s0/s1/s2` hold S-box witnesses, so these +//! flags are don't-care there — constraint code gates them by `ChipletFlags.is_active` +//! (= `s_ctrl`) at the call site. +//! +//! ## Operation semantics +//! +//! - **Sponge** (`is_sponge_input`): LINEAR_HASH (multi-batch span), single 2-to-1 hash, or HPERM. +//! In sponge mode, capacity is set once on the first input and carried through across +//! continuations; in tree mode (Merkle ops), capacity is zeroed at every level. +//! - **MP**: MPVERIFY — read-only Merkle path check. Does not interact with the sibling table. +//! - **MV**: old-path leg of MRUPDATE. Each MV row inserts a sibling into the virtual sibling table +//! via the hash_kernel bus. +//! - **MU**: new-path leg of MRUPDATE. Each MU row removes a sibling from the virtual sibling +//! table. The table balance ensures the same siblings are used for both the old and new paths. + +use miden_core::field::PrimeCharacteristicRing; + +use crate::constraints::{chiplets::columns::ControllerCols, utils::BoolNot}; + +// CONTROLLER FLAGS +// ================================================================================================ + +/// Named compositions of the controller sub-selectors `(s0, s1, s2)` on the current +/// and next rows. +/// +/// Pure row-kind layer — contains no chiplet-level scope. Combine with [`ChipletFlags`]( +/// super::super::selectors::ChipletFlags) at the call site by multiplication. +pub struct ControllerFlags { + // ======================================================================== + // Current row — compositions of cols.{s0, s1, s2} + // ======================================================================== + /// Input row: `s0` (deg 1). Covers all input operations (sponge + Merkle variants). + pub is_input: E, + + /// Output row: `(1-s0)*(1-s1)` (deg 2). Covers HOUT and SOUT. + pub is_output: E, + + /// Padding row: `(1-s0)*s1` (deg 2). Inactive controller slot. + pub is_padding: E, + + /// Sponge input row (LINEAR_HASH / 2-to-1 / HPERM): `s0*(1-s1)*(1-s2)` (deg 3). + pub is_sponge_input: E, + + /// Any Merkle input row (MP/MV/MU): `s0*(s1+s2-s1*s2)` (deg 3). + /// + /// The expression `s1 + s2 - s1*s2` equals `s1 OR s2` for binary inputs. + pub is_merkle_input: E, + + /// HOUT (return digest) output: `(1-s0)*(1-s1)*(1-s2)` (deg 3). + pub is_hout: E, + + /// SOUT (return full state) output: `(1-s0)*(1-s1)*s2` (deg 3). + pub is_sout: E, + + // ======================================================================== + // Next row — compositions of cols_next.{s0, s1, s2} + // ======================================================================== + /// Next row is an output row: `(1-s0')*(1-s1')` (deg 2). + pub is_output_next: E, + + /// Next row is a padding row: `(1-s0')*s1'` (deg 2). + pub is_padding_next: E, + + /// Next row is a sponge input — LINEAR_HASH continuation: `s0'*(1-s1')*(1-s2')` (deg 3). + pub is_sponge_input_next: E, + + /// Next row is any Merkle input (MP/MV/MU): `s0'*(s1'+s2'-s1'*s2')` (deg 3). + pub is_merkle_input_next: E, + + /// Next row is an MV input — old-path MRUPDATE start: `s0'*s1'*(1-s2')` (deg 3). + pub is_mv_input_next: E, +} + +impl ControllerFlags { + /// Build all row-kind flags from the current and next row's sub-selector columns. + pub fn new>(cols: &ControllerCols, cols_next: &ControllerCols) -> Self { + // --- Current row --- + let s0: E = cols.s0.into(); + let s1: E = cols.s1.into(); + let s2: E = cols.s2.into(); + let not_s0 = s0.clone().not(); + let not_s1 = s1.clone().not(); + let not_s2 = s2.clone().not(); + + let is_input = s0.clone(); + let is_output = not_s0.clone() * not_s1.clone(); + let is_padding = not_s0 * s1.clone(); + let is_sponge_input = s0.clone() * not_s1.clone() * not_s2.clone(); + let is_merkle_input = s0 * (s1.clone() + s2.clone() - s1 * s2.clone()); + let is_hout = is_output.clone() * not_s2; + let is_sout = is_output.clone() * s2; + + // --- Next row --- + let s0n: E = cols_next.s0.into(); + let s1n: E = cols_next.s1.into(); + let s2n: E = cols_next.s2.into(); + let not_s0n = s0n.clone().not(); + let not_s1n = s1n.clone().not(); + let not_s2n = s2n.clone().not(); + + let is_output_next = not_s0n.clone() * not_s1n.clone(); + let is_padding_next = not_s0n * s1n.clone(); + let is_sponge_input_next = s0n.clone() * not_s1n * not_s2n.clone(); + let is_merkle_input_next = + s0n.clone() * (s1n.clone() + s2n.clone() - s1n.clone() * s2n.clone()); + let is_mv_input_next = s0n * s1n * not_s2n; + + Self { + is_input, + is_output, + is_padding, + is_sponge_input, + is_merkle_input, + is_hout, + is_sout, + is_output_next, + is_padding_next, + is_sponge_input_next, + is_merkle_input_next, + is_mv_input_next, + } + } +} diff --git a/air/src/constraints/chiplets/hasher_control/mod.rs b/air/src/constraints/chiplets/hasher_control/mod.rs new file mode 100644 index 0000000000..f33e95b6a8 --- /dev/null +++ b/air/src/constraints/chiplets/hasher_control/mod.rs @@ -0,0 +1,367 @@ +//! Controller sub-chiplet constraints (dispatch side). +//! +//! The hasher uses a dispatch/compute split architecture: the **controller** (this module) +//! records permutation requests as compact (input, output) row pairs and responds to the +//! chiplets bus; the **permutation** sub-chiplet executes the actual Poseidon2 cycles. +//! A LogUp perm-link bus on the shared `v_wiring` column binds the two regions. +//! +//! The controller is active when `s_ctrl = chiplets[0] = 1`, which covers ALL controller +//! rows (input, output, and padding). +//! +//! ## Sub-modules +//! +//! - [`flags`]: Pure row-kind [`ControllerFlags`](flags::ControllerFlags) — compositions of `(s0, +//! s1, s2)` on current and next rows. Contains no chiplet-level scope; combined with +//! [`ChipletFlags`] at each call site. +//! +//! ## Constraint layout (narrative by operation lifetime) +//! +//! Constraints are organized in the order an operation walks through them: +//! +//! 1. **Trace skeleton** — first-row boundary, selector booleanity, adjacency/stability rules that +//! don't depend on the operation kind. These are the trace-layout invariants. +//! 2. **Operation start** — input is_boundary booleanity and the input→output adjacency law that +//! every operation hits on its first row. +//! 3. **Sponge operations** (LINEAR_HASH / 2-to-1 / HPERM) — input state pinning plus the respan +//! capacity preservation that glues multi-batch spans. +//! 4. **Merkle operations** (MP / MV / MU) — per-level input state, cross-level transitions (index +//! continuity, direction bit propagation, digest routing), and the MRUPDATE domain-separator +//! progression. +//! 5. **Operation end** — output is_boundary booleanity and the HOUT / SOUT return-value +//! constraints. +//! +//! Every constraint takes both a [`ChipletFlags`] (scope: active / transition) and a +//! [`ControllerFlags`] (row-kind: input/output/...), combined by multiplication at each +//! gate site. With one exception — the sub-selector booleanity assertion below — no raw +//! `cols.s0 / cols.s1 / cols.s2` columns are referenced in constraint gates. + +pub mod flags; + +use flags::ControllerFlags; +use miden_core::field::PrimeCharacteristicRing; +use miden_crypto::stark::air::AirBuilder; + +use crate::{ + MainCols, MidenAirBuilder, + constraints::{ + chiplets::{columns::ControllerCols, selectors::ChipletFlags}, + utils::BoolNot, + }, +}; + +// ENTRY POINT +// ================================================================================================ + +/// Enforce all controller sub-chiplet constraints. +/// +/// Receives pre-computed [`ChipletFlags`] from `build_chiplet_selectors`. The `s_ctrl` +/// column (`chiplets[0]`) is never referenced directly by constraint code. +pub fn enforce_controller_constraints( + builder: &mut AB, + local: &MainCols, + next: &MainCols, + chiplet: &ChipletFlags, +) where + AB: MidenAirBuilder, +{ + let cols: &ControllerCols = local.controller(); + let cols_next: &ControllerCols = next.controller(); + + let rows = ControllerFlags::::new(cols, cols_next); + + // ===================================================================== + // 1. TRACE SKELETON + // + // Invariants on the shape of the controller section: where it starts, + // which selectors are binary, what can follow what. These constraints + // don't depend on which hasher operation is running. + // ===================================================================== + + // --- First-row boundary --- + // The first row of the trace must be a controller input row: asserting + // `is_active * is_input = 1` forces both `s_ctrl = 1` and `s0 = 1` because + // the only solution to a product of booleans equaling 1 is all factors = 1. + // NOTE: this assumes the controller is the first chiplet section in the trace. + // The transition rules (s_ctrl → s_ctrl' + s_perm' = 1) and the trace layout + // guarantee this, but a reordering of chiplet sections would require moving + // this constraint. + builder + .when_first_row() + .assert_one(chiplet.is_active.clone() * rows.is_input.clone()); + + // --- Sub-selector booleanity --- + // s0, s1, s2 are binary on all controller rows. On permutation rows, these + // columns hold S-box witnesses and are unconstrained here. + // + // NOTE: these are the only direct references to the raw `s0/s1/s2` columns + // in the controller constraint body — booleanity is inherent to the columns + // themselves and cannot be expressed through a composed row-kind flag. + builder + .when(chiplet.is_active.clone()) + .assert_bools([cols.s0, cols.s1, cols.s2]); + + // --- is_boundary booleanity on all controller rows --- + // `is_boundary = 1` marks the first row of a new operation (sponge start + // or Merkle path level 0); `is_boundary = 0` elsewhere. Hoisted to + // `when(is_active)` because input ∪ output ∪ padding covers every ctrl row + // — padding forces it to 0 (§1 below) and input/output use it as a bit. + builder.when(chiplet.is_active.clone()).assert_bool(cols.is_boundary); + + // --- Output non-adjacency --- + // An output row cannot be followed by another output row. Combined with the + // input→output adjacency law (§2 below), this guarantees strictly alternating + // (input, output) pairs for every operation. + // + // Gated on `is_transition` so `cols_next.*` columns are read only when the + // next row is also a controller row (on perm/s0 rows, `s0/s1/s2` hold + // unrelated data). + // Degree: is_transition(3) * is_output(2) * is_output_next(2) = 7. + builder + .when(chiplet.is_transition.clone()) + .when(rows.is_output.clone()) + .assert_zero(rows.is_output_next.clone()); + + // --- Padding stability --- + // A padding row may only be followed by another padding row (or the first + // permutation row, which ends the controller section). Gating on + // `chiplet.is_transition` = `is_transition * s_ctrl * s_ctrl'` makes the + // constraint vanish on the last padding row when the next row is a permutation + // row (where `cols_next.s0/s1/s2` hold S-box witnesses). + // + // Asserting `is_padding_next = (1-s0')*s1' = 1` forces `s0' = 0` and `s1' = 1`. + // Degree: is_transition(3) * is_padding(2) * is_padding_next(2) = 7. + builder + .when(chiplet.is_transition.clone()) + .when(rows.is_padding.clone()) + .assert_one(rows.is_padding_next.clone()); + + // --- Padding confinement --- + // is_boundary and direction_bit must be zero on padding rows. + builder + .when(chiplet.is_active.clone()) + .when(rows.is_padding.clone()) + .assert_zeros([cols.is_boundary, cols.direction_bit]); + + // ===================================================================== + // 2. OPERATION START + // + // The first row of every operation is a controller input row (s_ctrl = 1, + // s0 = 1). These constraints apply to ANY input row regardless of + // operation kind. + // ===================================================================== + + // --- No input row at the ctrl→perm boundary --- + // An input row cannot be the last controller row. Without this, the + // adjacency rule below (which relies on `s_ctrl'` so that `s0'/s1'` are + // binary on the next row) would have a hole at the ctrl→perm transition. + // `chiplet.is_last = s_ctrl * (1 - s_ctrl')` fires exactly on that boundary. + builder.when(chiplet.is_last.clone()).assert_zero(rows.is_input.clone()); + + // --- No non-final output at the ctrl→perm boundary --- + // Defensive: an output row at the ctrl→perm boundary must be final + // (is_boundary = 1). Without this, a non-final output (is_boundary = 0) + // would expect a continuation input that never comes, since the next row + // belongs to the permutation segment. + // Degree: is_last(2) * is_output(2) * inner(1) = 5. + builder + .when(chiplet.is_last.clone()) + .when(rows.is_output.clone()) + .assert_one(cols.is_boundary); + + // --- Input→output adjacency on ctrl→ctrl transitions --- + // On a ctrl→ctrl transition from an input row, the next row must be an + // output row. `is_transition` carries the `s_ctrl'` factor, so on this + // gate `cols_next.s0/s1` are boolean and `(1 - s0')(1 - s1') = 1` really + // does force both to 0. Combined with the `is_last` guard above, every + // ctrl_input is followed by a ctrl_output. + builder + .when(chiplet.is_transition.clone()) + .when(rows.is_input.clone()) + .assert_one(rows.is_output_next.clone()); + + // ===================================================================== + // 3. SPONGE OPERATIONS (LINEAR_HASH / 2-to-1 / HPERM) + // + // Sponge operations process rate data in (possibly multi-batch) spans. + // Capacity is set once on the first input (is_boundary = 1) and carried + // through RESPAN continuations via the preservation constraint below. + // Sponge operations have no tree position and don't use direction_bit. + // ===================================================================== + + // --- Sponge input state --- + // Sponge operations don't have a Merkle tree position, so `node_index = 0`, + // and they don't use `direction_bit` at all, so it's confined to 0. + builder + .when(chiplet.is_active.clone()) + .when(rows.is_sponge_input.clone()) + .assert_zeros([cols.node_index, cols.direction_bit]); + + // --- Respan capacity preservation --- + // During multi-batch linear hashing (RESPAN), each new batch overwrites the rate + // (h0..h7) but the capacity (h8..h11) must carry over from the previous permutation + // output. Without this, a prover could inject arbitrary capacity values on + // continuation rows, corrupting the sponge state. + // + // `is_sponge_input_next` restricts this to LINEAR_HASH continuations only (Merkle + // ops zero capacity at each level). The `!is_boundary_next` factor restricts to + // continuations (not new operation starts, which set fresh capacity). + // `is_transition` guarantees both rows are controller rows. + // Degree: is_transition(3) * is_sponge_input_next(3) * !is_boundary_next(1) * diff(1) = 8. + { + let is_boundary_next: AB::Expr = cols_next.is_boundary.into(); + let gate = chiplet.is_transition.clone() + * rows.is_sponge_input_next.clone() + * is_boundary_next.not(); + + let cap = cols.capacity(); + let cap_next = cols_next.capacity(); + + let builder = &mut builder.when(gate); + for i in 0..4 { + builder.assert_eq(cap_next[i], cap[i]); + } + } + + // ===================================================================== + // 4. MERKLE OPERATIONS (MP / MV / MU) + // + // Merkle path operations walk a 2-to-1 compression tree from leaf to root. + // Each level is an (input, output) pair: the input holds the current node + // plus the sibling in the correct rate half (selected by direction_bit), + // and the output holds the compressed digest. Between levels, the digest + // routes into the next input's rate half and the index shifts one bit. + // + // See [`flags::ControllerFlags`] for MP / MV / MU operation semantics. + // MV and MU interact with the sibling table via the hash_kernel bus; the + // shared sibling set is domain-separated by `mrupdate_id`. + // ===================================================================== + + // --- Merkle input state --- + // On each Merkle input row: + // - index decomposition: `idx = 2 * idx_next + direction_bit` threads the path bits down one + // level at a time + // - direction_bit is binary (left/right child selector) + // - capacity lanes h[8..12] are zeroed so each 2-to-1 compression starts with a clean sponge + // capacity + // Degree: is_active(1) * is_merkle_input(3) * diff(1) = 5 (on the decomp assert). + { + let gate = chiplet.is_active.clone() * rows.is_merkle_input.clone(); + let builder = &mut builder.when(gate); + + // idx = 2 * idx_next + direction_bit + let node_index_next: AB::Expr = cols_next.node_index.into(); + let idx_expected = node_index_next.double() + cols.direction_bit; + builder.assert_eq(cols.node_index, idx_expected); + + // direction_bit is binary + builder.assert_bool(cols.direction_bit); + + // Capacity lanes h[8..12] must be zero on Merkle input rows. + builder.assert_zeros(cols.capacity()); + } + + // --- Cross-step Merkle index continuity --- + // On non-final output rows, if the next row is a Merkle input, the node + // index must carry over: `idx_next = idx`. (The decomposition constraint + // above shifts the index on the input row itself.) + // + // NOTE: `is_merkle_input_next` is read without an explicit `is_active_next` + // gate. This is safe because `is_active` already scopes the current row to + // the controller section, and the transition rules enforce that the next + // row after a controller row must be either another controller row or a + // permutation row — never a non-hasher row. + // Gate: is_active(1) * is_output(2) * !is_boundary(1) * is_merkle_input_next(3) = 7 + // Constraint degree: gate(7) * diff(1) = 8 + let not_boundary: AB::Expr = cols.is_boundary.into().not(); + builder + .when(chiplet.is_active.clone()) + .when(rows.is_output.clone()) + .when(not_boundary.clone()) + .when(rows.is_merkle_input_next.clone()) + .assert_eq(cols_next.node_index, cols.node_index); + + // --- Direction bit forward propagation + digest routing --- + // + // **Forward propagation.** On non-final output → next-input Merkle boundaries, + // the `direction_bit` on the output must equal the `direction_bit` on the next + // input row. This makes `b_{i+1}` (the next step's direction bit) available on + // the output row so the digest can be routed to the correct rate half. + // + // **Digest routing.** The digest from output_i (in rate0, `h[0..4]`) must + // appear in the correct rate half of input_{i+1}, selected by direction_bit: + // - `direction_bit = 0`: digest goes to rate0 of input_{i+1} (`h_next[j]`) + // - `direction_bit = 1`: digest goes to rate1 of input_{i+1} (`h_next[4+j]`) + // + // Uses the full `is_merkle_input_next = s0' * (s1' + s2' - s1'*s2')` (degree 3) + // so the gate fires exclusively on genuine Merkle input continuations. This + // sits the constraint at exactly the max degree of 9, trading 2 degrees of + // headroom for local soundness: no bus invariant is required to reject + // sponge-mislabeling attacks, because the `s0'` factor already forbids them. + // Gate: is_active(1) * is_output(2) * !is_boundary(1) * is_merkle_input_next(3) = 7 + // Constraint degree: gate(7) * inner(2) = 9 + { + let gate = chiplet.is_active.clone() + * rows.is_output.clone() + * not_boundary + * rows.is_merkle_input_next.clone(); + let builder = &mut builder.when(gate); + + // Forward propagation: direction_bit on output = direction_bit on next input. + builder.assert_eq(cols.direction_bit, cols_next.direction_bit); + + // Digest routing: for each j in 0..4, enforce + // h[j] = b * h_next[4+j] + (1-b) * h_next[j] + // h[j] = h_next[j] + b * (h_next[4+j] - h_next[j]) + // where b = direction_bit on the output row. + let b: AB::Expr = cols.direction_bit.into(); + let rate0_curr = cols.rate0(); + let rate0_next = cols_next.rate0(); + let rate1_next = cols_next.rate1(); + for j in 0..4 { + builder.assert_eq( + rate0_curr[j], + rate0_next[j] + b.clone() * (rate1_next[j] - rate0_next[j]), + ); + } + } + + // --- MRUPDATE domain separator (mrupdate_id progression) --- + // On controller→controller transitions: + // mrupdate_id_next = mrupdate_id + is_mv_input_next * is_boundary_next + // i.e. the domain separator ticks forward exactly when the next row is an + // MV boundary input (the start of an old-path MRUPDATE leg). This separates + // sibling-table entries from different MRUPDATE operations so siblings from + // one update can't be replayed in another. + // Degree: is_transition(3) * (diff + is_mv_input_next(3) * bnd'(1))(4) = 7. + let mrupdate_id: AB::Expr = cols.mrupdate_id.into(); + let mv_start_next = rows.is_mv_input_next * cols_next.is_boundary; + builder + .when(chiplet.is_transition.clone()) + .assert_eq(cols_next.mrupdate_id, mrupdate_id + mv_start_next); + + // ===================================================================== + // 5. OPERATION END + // + // Every operation ends on an output row carrying its return value: HOUT + // returns a 4-element digest, SOUT returns the full 12-element state. + // The final output of an operation has is_boundary = 1; intermediate + // outputs (merkle levels, sponge batch boundaries) have is_boundary = 0. + // ===================================================================== + + // --- HOUT return digest --- + // HOUT output rows return a 4-element digest. They have no tree position + // (`node_index = 0`) and no direction bit (`direction_bit = 0`). + builder + .when(chiplet.is_active.clone()) + .when(rows.is_hout.clone()) + .assert_zeros([cols.node_index, cols.direction_bit]); + + // --- SOUT return full state (final row) --- + // SOUT on the boundary row (final output of an HPERM) has direction_bit = 0. + // Intermediate SOUT rows (non-boundary) are unconstrained here. + builder + .when(chiplet.is_active.clone()) + .when(rows.is_sout.clone()) + .when(cols.is_boundary) + .assert_zero(cols.direction_bit); +} diff --git a/air/src/constraints/chiplets/kernel_rom.rs b/air/src/constraints/chiplets/kernel_rom.rs index b721e9ab3f..8509b1de7e 100644 --- a/air/src/constraints/chiplets/kernel_rom.rs +++ b/air/src/constraints/chiplets/kernel_rom.rs @@ -22,58 +22,10 @@ //! 2. Digest contiguity: when sfirst'=0 and s4'=0, digest values stay the same //! 3. First row: when entering kernel ROM, sfirst' must be 1 -use miden_core::field::PrimeCharacteristicRing; +use miden_crypto::stark::air::AirBuilder; -use super::selectors::{ace_chiplet_flag, kernel_rom_chiplet_flag}; -use crate::{ - Felt, MainTraceRow, - constraints::tagging::{ - TagGroup, TaggingAirBuilderExt, tagged_assert_zero, tagged_assert_zero_integrity, - }, -}; - -// CONSTANTS -// ================================================================================================ - -// Kernel ROM chiplet offset from CHIPLETS_OFFSET (after s0, s1, s2, s3, s4). -const KERNEL_ROM_OFFSET: usize = 5; - -// Column indices within the kernel ROM chiplet -const SFIRST_IDX: usize = 0; -const R0_IDX: usize = 1; -const R1_IDX: usize = 2; -const R2_IDX: usize = 3; -const R3_IDX: usize = 4; - -// TAGGING CONSTANTS -// ================================================================================================ - -pub(super) const KERNEL_ROM_BASE_ID: usize = - super::memory::MEMORY_BASE_ID + super::memory::MEMORY_COUNT + super::ace::ACE_COUNT; -const KERNEL_ROM_SFIRST_ID: usize = KERNEL_ROM_BASE_ID; -const KERNEL_ROM_DIGEST_BASE_ID: usize = KERNEL_ROM_BASE_ID + 1; -const KERNEL_ROM_FIRST_ROW_ID: usize = KERNEL_ROM_BASE_ID + 5; - -const KERNEL_ROM_SFIRST_NAMESPACE: &str = "chiplets.kernel_rom.sfirst.binary"; -const KERNEL_ROM_DIGEST_NAMESPACE: &str = "chiplets.kernel_rom.digest.contiguity"; -const KERNEL_ROM_FIRST_ROW_NAMESPACE: &str = "chiplets.kernel_rom.first_row.start"; - -const KERNEL_ROM_SFIRST_NAMES: [&str; 1] = [KERNEL_ROM_SFIRST_NAMESPACE; 1]; -const KERNEL_ROM_DIGEST_NAMES: [&str; 4] = [KERNEL_ROM_DIGEST_NAMESPACE; 4]; -const KERNEL_ROM_FIRST_ROW_NAMES: [&str; 1] = [KERNEL_ROM_FIRST_ROW_NAMESPACE; 1]; - -const KERNEL_ROM_SFIRST_TAGS: TagGroup = TagGroup { - base: KERNEL_ROM_SFIRST_ID, - names: &KERNEL_ROM_SFIRST_NAMES, -}; -const KERNEL_ROM_DIGEST_TAGS: TagGroup = TagGroup { - base: KERNEL_ROM_DIGEST_BASE_ID, - names: &KERNEL_ROM_DIGEST_NAMES, -}; -const KERNEL_ROM_FIRST_ROW_TAGS: TagGroup = TagGroup { - base: KERNEL_ROM_FIRST_ROW_ID, - names: &KERNEL_ROM_FIRST_ROW_NAMES, -}; +use super::selectors::ChipletFlags; +use crate::{MainCols, MidenAirBuilder, constraints::utils::BoolNot}; // ENTRY POINTS // ================================================================================================ @@ -81,98 +33,43 @@ const KERNEL_ROM_FIRST_ROW_TAGS: TagGroup = TagGroup { /// Enforce kernel ROM chiplet constraints. pub fn enforce_kernel_rom_constraints( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, + flags: &ChipletFlags, ) where - AB: TaggingAirBuilderExt, + AB: MidenAirBuilder, { - // Chiplet selector columns; kernel ROM rows are selected by (s0..s4). - let s0: AB::Expr = local.chiplets[0].clone().into(); - let s1: AB::Expr = local.chiplets[1].clone().into(); - let s2: AB::Expr = local.chiplets[2].clone().into(); - let s3: AB::Expr = local.chiplets[3].clone().into(); - let s4: AB::Expr = local.chiplets[4].clone().into(); - let s3_next: AB::Expr = next.chiplets[3].clone().into(); - let s4_next: AB::Expr = next.chiplets[4].clone().into(); + let krom = local.kernel_rom(); + let krom_next = next.kernel_rom(); - let kernel_rom_flag = - kernel_rom_chiplet_flag(s0.clone(), s1.clone(), s2.clone(), s3.clone(), s4.clone()); - let ace_flag = ace_chiplet_flag(s0.clone(), s1.clone(), s2.clone(), s3.clone()); - - // Load kernel ROM columns (sfirst + 4-word digest). - let sfirst: AB::Expr = load_kernel_rom_col::(local, SFIRST_IDX); - let sfirst_next: AB::Expr = load_kernel_rom_col::(next, SFIRST_IDX); - let r0: AB::Expr = load_kernel_rom_col::(local, R0_IDX); - let r0_next: AB::Expr = load_kernel_rom_col::(next, R0_IDX); - let r1: AB::Expr = load_kernel_rom_col::(local, R1_IDX); - let r1_next: AB::Expr = load_kernel_rom_col::(next, R1_IDX); - let r2: AB::Expr = load_kernel_rom_col::(local, R2_IDX); - let r2_next: AB::Expr = load_kernel_rom_col::(next, R2_IDX); - let r3: AB::Expr = load_kernel_rom_col::(local, R3_IDX); - let r3_next: AB::Expr = load_kernel_rom_col::(next, R3_IDX); - - let one: AB::Expr = AB::Expr::ONE; - - // Gate transition constraints by is_transition() to avoid last-row access. // ========================================================================== // SELECTOR CONSTRAINT // ========================================================================== // sfirst must be binary - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &KERNEL_ROM_SFIRST_TAGS, - &mut idx, - kernel_rom_flag.clone() * sfirst.clone() * (sfirst.clone() - one.clone()), - ); + builder.when(flags.is_active.clone()).assert_bool(krom.s_first); // ========================================================================== // DIGEST CONTIGUITY CONSTRAINTS // ========================================================================== - // When sfirst' = 0 (not the start of a new digest block) and s4' = 0 (not exiting kernel ROM), - // the digest values must remain unchanged. - let not_exiting = one.clone() - s4_next.clone(); - let not_new_block = one.clone() - sfirst_next.clone(); - let contiguity_condition = not_exiting * not_new_block; + // In all rows but last, ensure that the digest repeats except when the next + // row is the start of a new digest (i.e., s_first' = 0) + { + let gate = flags.is_transition.clone() * krom_next.s_first.into().not(); + let builder = &mut builder.when(gate); - // Use a combined gate to share `kernel_rom_flag * contiguity_condition` across all 4 lanes. - let gate = kernel_rom_flag * contiguity_condition; - let mut idx = 0; - tagged_assert_zero(builder, &KERNEL_ROM_DIGEST_TAGS, &mut idx, gate.clone() * (r0_next - r0)); - tagged_assert_zero(builder, &KERNEL_ROM_DIGEST_TAGS, &mut idx, gate.clone() * (r1_next - r1)); - tagged_assert_zero(builder, &KERNEL_ROM_DIGEST_TAGS, &mut idx, gate.clone() * (r2_next - r2)); - tagged_assert_zero(builder, &KERNEL_ROM_DIGEST_TAGS, &mut idx, gate * (r3_next - r3)); + builder.assert_eq(krom_next.root[0], krom.root[0]); + builder.assert_eq(krom_next.root[1], krom.root[1]); + builder.assert_eq(krom_next.root[2], krom.root[2]); + builder.assert_eq(krom_next.root[3], krom.root[3]); + } // ========================================================================== // FIRST ROW CONSTRAINT // ========================================================================== - // s0..s2 are stable once 1 (selector constraints), so ACE -> kernel ROM transition is - // determined by s3' = 1 and s4' = 0. - let kernel_rom_next = s3_next * (one.clone() - s4_next.clone()); - let flag_next_row_first_kernel_rom = ace_flag * kernel_rom_next; - // First row of kernel ROM must have sfirst' = 1. - let mut idx = 0; - tagged_assert_zero( - builder, - &KERNEL_ROM_FIRST_ROW_TAGS, - &mut idx, - flag_next_row_first_kernel_rom * (sfirst_next - one), - ); -} - -// INTERNAL HELPERS -// ================================================================================================ - -/// Load a column from the kernel ROM section of chiplets. -fn load_kernel_rom_col(row: &MainTraceRow, col_idx: usize) -> AB::Expr -where - AB: TaggingAirBuilderExt, -{ - // Kernel ROM columns start after s0, s1, s2, s3, s4 (5 selectors) - let local_idx = KERNEL_ROM_OFFSET + col_idx; - row.chiplets[local_idx].clone().into() + // Uses the precomputed next_is_first flag to detect ACE→KernelROM boundary. + builder.when(flags.next_is_first.clone()).assert_one(krom_next.s_first); } diff --git a/air/src/constraints/chiplets/memory.rs b/air/src/constraints/chiplets/memory.rs index 2aa0472357..64fecf2eec 100644 --- a/air/src/constraints/chiplets/memory.rs +++ b/air/src/constraints/chiplets/memory.rs @@ -14,623 +14,225 @@ //! | idx0, idx1 | Element index bits (0-3) | //! | clk | Clock cycle of operation | //! | v0-v3 | Memory word values | -//! | d0, d1 | Delta tracking columns | -//! | d_inv | Delta inverse | -//! | f_scw | Same context/word flag | +//! | d0, d1 | Lower/upper 16 bits of the active delta | +//! | d_inv | Inverse of the active delta (docs: column `t`) | +//! | f_sca | Same context/addr flag (`is_same_ctx_and_addr`) | +//! | w0 | Lower 16 bits of word index (word_addr / 4) | +//! | w1 | Upper 16 bits of word index (word_addr / 4) | //! -//! ## Address range checks (TODO) +//! ## Address range checks //! -//! The trace stores a word address plus idx bits, i.e. `addr = 4 * w_addr + idx`. -//! To fully range-check addresses, we plan to commit to 16-bit limbs of `w_addr` -//! (w0, w1) and enforce: -//! addr = 4 * (w0 + 2^16 * w1) + idx0 + 2 * idx1. -//! Range checks should include `w0`, `w1`, and `4 * w1`; the extra term -//! prevents wraparound, and Goldilocks satisfies P > 2^18 so this is sound. - -use core::ops::{Add, Mul, Sub}; +//! The constraint `word_addr = 4 * (w0 + 2^16 * w1)` decomposes the word address +//! into 16-bit limbs. Combined with range checks on `w0`, `w1`, and `4 * w1` via +//! the wiring bus, this proves all memory addresses are valid 32-bit values. +//! The `4 * w1` check prevents Goldilocks field wraparound (P > 2^18). use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::LiftedAirBuilder; +use miden_crypto::stark::air::AirBuilder; -use super::selectors::memory_chiplet_flag; +use super::selectors::ChipletFlags; use crate::{ - Felt, MainTraceRow, - constraints::tagging::{TagGroup, TaggingAirBuilderExt, tagged_assert_zero_integrity}, - trace::{ - CHIPLETS_OFFSET, - chiplets::{ - MEMORY_CLK_COL_IDX, MEMORY_CTX_COL_IDX, MEMORY_D_INV_COL_IDX, MEMORY_D0_COL_IDX, - MEMORY_D1_COL_IDX, MEMORY_FLAG_SAME_CONTEXT_AND_WORD, MEMORY_IDX0_COL_IDX, - MEMORY_IDX1_COL_IDX, MEMORY_IS_READ_COL_IDX, MEMORY_IS_WORD_ACCESS_COL_IDX, - MEMORY_V_COL_RANGE, MEMORY_WORD_COL_IDX, - }, - }, -}; - -// TAGGING IDS -// ================================================================================================ - -pub const MEMORY_BASE_ID: usize = super::bitwise::BITWISE_BASE_ID + super::bitwise::BITWISE_COUNT; -pub const MEMORY_COUNT: usize = 21; -const MEMORY_BINARY_BASE_ID: usize = MEMORY_BASE_ID; -const MEMORY_WORD_IDX_BASE_ID: usize = MEMORY_BASE_ID + 4; -const MEMORY_FIRST_ROW_BASE_ID: usize = MEMORY_BASE_ID + 6; -const MEMORY_DELTA_INV_BASE_ID: usize = MEMORY_BASE_ID + 10; -const MEMORY_DELTA_TRANSITION_ID: usize = MEMORY_BASE_ID + 14; -const MEMORY_SCW_FLAG_ID: usize = MEMORY_BASE_ID + 15; -const MEMORY_SCW_READS_ID: usize = MEMORY_BASE_ID + 16; -const MEMORY_VALUE_CONSIST_BASE_ID: usize = MEMORY_BASE_ID + 17; - -const MEMORY_BINARY_NAMESPACE: &str = "chiplets.memory.binary"; -const MEMORY_WORD_IDX_NAMESPACE: &str = "chiplets.memory.word_idx.zero"; -const MEMORY_FIRST_ROW_NAMESPACE: &str = "chiplets.memory.first_row.zero"; -const MEMORY_DELTA_INV_NAMESPACE: &str = "chiplets.memory.delta.inv"; -const MEMORY_DELTA_TRANSITION_NAMESPACE: &str = "chiplets.memory.delta.transition"; -const MEMORY_SCW_FLAG_NAMESPACE: &str = "chiplets.memory.scw.flag"; -const MEMORY_SCW_READS_NAMESPACE: &str = "chiplets.memory.scw.reads"; -const MEMORY_VALUE_CONSIST_NAMESPACE: &str = "chiplets.memory.value.consistency"; - -const MEMORY_BINARY_NAMES: [&str; 4] = [MEMORY_BINARY_NAMESPACE; 4]; -const MEMORY_WORD_IDX_NAMES: [&str; 2] = [MEMORY_WORD_IDX_NAMESPACE; 2]; -const MEMORY_FIRST_ROW_NAMES: [&str; 4] = [MEMORY_FIRST_ROW_NAMESPACE; 4]; -const MEMORY_DELTA_INV_NAMES: [&str; 4] = [MEMORY_DELTA_INV_NAMESPACE; 4]; -const MEMORY_DELTA_TRANSITION_NAMES: [&str; 1] = [MEMORY_DELTA_TRANSITION_NAMESPACE; 1]; -const MEMORY_SCW_FLAG_NAMES: [&str; 1] = [MEMORY_SCW_FLAG_NAMESPACE; 1]; -const MEMORY_SCW_READS_NAMES: [&str; 1] = [MEMORY_SCW_READS_NAMESPACE; 1]; -const MEMORY_VALUE_CONSIST_NAMES: [&str; 4] = [MEMORY_VALUE_CONSIST_NAMESPACE; 4]; - -const MEMORY_BINARY_TAGS: TagGroup = TagGroup { - base: MEMORY_BINARY_BASE_ID, - names: &MEMORY_BINARY_NAMES, -}; -const MEMORY_WORD_IDX_TAGS: TagGroup = TagGroup { - base: MEMORY_WORD_IDX_BASE_ID, - names: &MEMORY_WORD_IDX_NAMES, -}; -const MEMORY_FIRST_ROW_TAGS: TagGroup = TagGroup { - base: MEMORY_FIRST_ROW_BASE_ID, - names: &MEMORY_FIRST_ROW_NAMES, -}; -const MEMORY_DELTA_INV_TAGS: TagGroup = TagGroup { - base: MEMORY_DELTA_INV_BASE_ID, - names: &MEMORY_DELTA_INV_NAMES, -}; -const MEMORY_DELTA_TRANSITION_TAGS: TagGroup = TagGroup { - base: MEMORY_DELTA_TRANSITION_ID, - names: &MEMORY_DELTA_TRANSITION_NAMES, -}; -const MEMORY_SCW_FLAG_TAGS: TagGroup = TagGroup { - base: MEMORY_SCW_FLAG_ID, - names: &MEMORY_SCW_FLAG_NAMES, -}; -const MEMORY_SCW_READS_TAGS: TagGroup = TagGroup { - base: MEMORY_SCW_READS_ID, - names: &MEMORY_SCW_READS_NAMES, -}; -const MEMORY_VALUE_CONSIST_TAGS: TagGroup = TagGroup { - base: MEMORY_VALUE_CONSIST_BASE_ID, - names: &MEMORY_VALUE_CONSIST_NAMES, + MainCols, MidenAirBuilder, + constraints::{chiplets::columns::MemoryCols, constants::TWO_POW_16, utils::BoolNot}, }; // ENTRY POINTS // ================================================================================================ /// Enforce all memory chiplet constraints. -pub fn enforce_memory_constraints( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, -) where - AB: TaggingAirBuilderExt, -{ - let s0: AB::Expr = local.chiplets[0].clone().into(); - let s1: AB::Expr = local.chiplets[1].clone().into(); - let s1_next: AB::Expr = next.chiplets[1].clone().into(); - let s2_next: AB::Expr = next.chiplets[2].clone().into(); - - let is_transition: AB::Expr = builder.is_transition(); - - enforce_memory_constraints_all_rows(builder, local, next); - - let flag_next_row_first_memory = is_transition.clone() - * flag_next_row_first_memory(s0.clone(), s1.clone(), s1_next, s2_next.clone()); - enforce_memory_constraints_first_row(builder, local, next, flag_next_row_first_memory); - - let flag_memory_active_not_last = - is_transition * flag_memory_active_not_last_row(s0, s1, s2_next); - enforce_memory_constraints_all_rows_except_last( - builder, - local, - next, - flag_memory_active_not_last, - ); -} - -/// Enforce memory chiplet constraints that apply to all rows. -/// -/// This enforces: -/// - Binary constraints for selectors and indices -pub fn enforce_memory_constraints_all_rows( - builder: &mut AB, - local: &MainTraceRow, - _next: &MainTraceRow, -) where - AB: TaggingAirBuilderExt, -{ - // Compute memory active flag from top-level selectors - let s0: AB::Expr = local.chiplets[0].clone().into(); - let s1: AB::Expr = local.chiplets[1].clone().into(); - let s2: AB::Expr = local.chiplets[2].clone().into(); - let memory_flag = memory_chiplet_flag(s0, s1, s2); - - // Load memory columns using typed struct - let cols: MemoryColumns = MemoryColumns::from_row::(local); - - let one: AB::Expr = AB::Expr::ONE; - - // Binary constraints - let gate = memory_flag.clone(); - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &MEMORY_BINARY_TAGS, - &mut idx, - gate.clone() * cols.is_read.clone() * (cols.is_read.clone() - one.clone()), - ); - tagged_assert_zero_integrity( - builder, - &MEMORY_BINARY_TAGS, - &mut idx, - gate.clone() * cols.is_word.clone() * (cols.is_word.clone() - one.clone()), - ); - tagged_assert_zero_integrity( - builder, - &MEMORY_BINARY_TAGS, - &mut idx, - gate.clone() * cols.idx0.clone() * (cols.idx0.clone() - one.clone()), - ); - tagged_assert_zero_integrity( - builder, - &MEMORY_BINARY_TAGS, - &mut idx, - gate * cols.idx1.clone() * (cols.idx1.clone() - one), - ); - - // For word access, idx bits must be zero (only element accesses use idx0/idx1). - let word_gate = memory_flag.clone() * cols.is_word.clone(); - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &MEMORY_WORD_IDX_TAGS, - &mut idx, - word_gate.clone() * cols.idx0.clone(), - ); - tagged_assert_zero_integrity( - builder, - &MEMORY_WORD_IDX_TAGS, - &mut idx, - word_gate * cols.idx1.clone(), - ); -} - -/// Enforce memory first row initialization constraints. -/// -/// This constraint is enforced in the last row of the previous trace segment (bitwise). -/// When entering the memory chiplet, unwritten values must be 0. -pub fn enforce_memory_constraints_first_row( - builder: &mut AB, - _local: &MainTraceRow, - cols_first: &MainTraceRow, - flag_next_row_first_memory: AB::Expr, -) where - AB: TaggingAirBuilderExt, -{ - // Load first memory row columns using typed struct - let cols_next: MemoryColumns = MemoryColumns::from_row::(cols_first); - - let one: AB::Expr = AB::Expr::ONE; - - // Compute constraint flags for all 4 word elements - let [c0, c1, c2, c3] = cols_next.compute_value_constraint_flags(one.clone()); - - // First row: if v'[i] is not written to, then v'[i] = 0 - let gate = flag_next_row_first_memory; - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &MEMORY_FIRST_ROW_TAGS, - &mut idx, - gate.clone() * c0 * cols_next.values[0].clone(), - ); - tagged_assert_zero_integrity( - builder, - &MEMORY_FIRST_ROW_TAGS, - &mut idx, - gate.clone() * c1 * cols_next.values[1].clone(), - ); - tagged_assert_zero_integrity( - builder, - &MEMORY_FIRST_ROW_TAGS, - &mut idx, - gate.clone() * c2 * cols_next.values[2].clone(), - ); - tagged_assert_zero_integrity( - builder, - &MEMORY_FIRST_ROW_TAGS, - &mut idx, - gate * c3 * cols_next.values[3].clone(), - ); -} - -/// Enforce memory transition constraints (all rows except last). /// -/// This enforces: -/// - Delta inverse constraints -/// - Context/address/clock delta constraints -/// - Same context/word flag constraints -/// - Value consistency constraints -pub fn enforce_memory_constraints_all_rows_except_last( +/// The memory trace is ordered by (ctx, addr, clk). Consecutive rows are compared +/// via deltas to enforce monotonicity of this ordering. A select mechanism +/// using `ctx_changed` and `addr_changed` (docs: `n0`, `n1`) determines which delta +/// is active: context change takes precedence over address change, which takes +/// precedence over clock change. +pub fn enforce_memory_constraints( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, - flag_memory_active_not_last: AB::Expr, + local: &MainCols, + next: &MainCols, + flags: &ChipletFlags, ) where - AB: TaggingAirBuilderExt, + AB: MidenAirBuilder, { - // Load columns using typed struct - let cols: MemoryColumns = MemoryColumns::from_row::(local); - let cols_next: MemoryColumns = MemoryColumns::from_row::(next); - - let one: AB::Expr = AB::Expr::ONE; - - let deltas = MemoryDeltas::new::(&cols, &cols_next, one.clone()); - - // ========================================================================== - // DELTA INVERSE CONSTRAINTS - // ========================================================================== - enforce_delta_inverse_constraints::( - builder, - flag_memory_active_not_last.clone(), - &deltas, - one.clone(), - ); - - // ========================================================================== - // DELTA CONSTRAINTS (monotonicity) - // ========================================================================== - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &MEMORY_DELTA_TRANSITION_TAGS, - &mut idx, - flag_memory_active_not_last.clone() - * (deltas.computed_delta.clone() - deltas.delta_next.clone()), - ); + let cols = local.memory(); + let cols_next = next.memory(); // ========================================================================== - // SAME CONTEXT/WORD FLAG + // BINARY CONSTRAINTS (all rows) // ========================================================================== - // f_scw' = !n0 * !n1 - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &MEMORY_SCW_FLAG_TAGS, - &mut idx, - flag_memory_active_not_last.clone() - * (cols_next.flag_same_ctx_word.clone() - - (one.clone() - deltas.n0.clone()) * (one.clone() - deltas.n1.clone())), - ); + // Selectors and indices must be binary. + { + let builder = &mut builder.when(flags.is_active.clone()); + builder.assert_bool(cols.is_read); + builder.assert_bool(cols.is_word); + builder.assert_bool(cols.idx0); + builder.assert_bool(cols.idx1); + + // For word access, idx bits must be zero (only element accesses use idx0/idx1). + { + let builder = &mut builder.when(cols.is_word); + builder.assert_zero(cols.idx0); + builder.assert_zero(cols.idx1); + } + } - // ========================================================================== - // SAME CONTEXT/WORD READ-ONLY CONSTRAINTS - // ========================================================================== - enforce_scw_readonly_constraint::( - builder, - flag_memory_active_not_last.clone(), - &cols, - &cols_next, - &deltas, - one.clone(), - ); + // not_written[i] = 1 when v'[i] is NOT being written and must be constrained. + // Computed once, shared between first-row initialization and value consistency. + let not_written = compute_not_written_flags::(cols_next); // ========================================================================== - // VALUE CONSISTENCY + // FIRST-ROW INITIALIZATION // ========================================================================== - - // Compute constraint flags for all 4 elements - let [c0, c1, c2, c3] = cols_next.compute_value_constraint_flags(one.clone()); - - // When v'[i] is not written to: - // - if f_scw' = 1: v'[i] = v[i] (copy from previous) - // - if f_scw' = 0: v'[i] = 0 (initialize to zero) - // Simplified: v'[i] = f_scw' * v[i] - let constrain_value = |c: AB::Expr, v: AB::Expr, v_next: AB::Expr| { - flag_memory_active_not_last.clone() - * c - * (v_next - cols_next.flag_same_ctx_word.clone() * v) - }; - - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &MEMORY_VALUE_CONSIST_TAGS, - &mut idx, - constrain_value(c0, cols.values[0].clone(), cols_next.values[0].clone()), - ); - tagged_assert_zero_integrity( - builder, - &MEMORY_VALUE_CONSIST_TAGS, - &mut idx, - constrain_value(c1, cols.values[1].clone(), cols_next.values[1].clone()), - ); - tagged_assert_zero_integrity( - builder, - &MEMORY_VALUE_CONSIST_TAGS, - &mut idx, - constrain_value(c2, cols.values[2].clone(), cols_next.values[2].clone()), - ); - tagged_assert_zero_integrity( - builder, - &MEMORY_VALUE_CONSIST_TAGS, - &mut idx, - constrain_value(c3, cols.values[3].clone(), cols_next.values[3].clone()), - ); -} - -// INTERNAL HELPERS -// ================================================================================================ - -/// Derived delta values for memory transitions. -/// -/// These capture the deltas, selection flags, and the computed monotonicity term -/// used across multiple constraint groups. -struct MemoryDeltas { - ctx_delta: E, - addr_delta: E, - clk_delta: E, - n0: E, - n1: E, - delta_next: E, - computed_delta: E, -} - -impl MemoryDeltas -where - E: Clone + Add + Sub + Mul, -{ - fn new(cols: &MemoryColumns, cols_next: &MemoryColumns, one: E) -> Self - where - AB: LiftedAirBuilder, - AB::Expr: Into, + // Enforced at the bitwise→memory boundary. When entering the memory chiplet, + // values not being written must be zero. { - let ctx_delta = cols_next.ctx.clone() - cols.ctx.clone(); - let addr_delta = cols_next.word_addr.clone() - cols.word_addr.clone(); - let clk_delta = cols_next.clk.clone() - cols.clk.clone(); - let two_pow_16: E = AB::Expr::from_u32(1 << 16).into(); - - // n0 = ctx_delta * d_inv' - // n1 = addr_delta * d_inv' - let n0 = ctx_delta.clone() * cols_next.d_inv.clone(); - let n1 = addr_delta.clone() * cols_next.d_inv.clone(); - - // delta_next = d1' * 2^16 + d0' - let delta_next = cols_next.d1.clone() * two_pow_16 + cols_next.d0.clone(); - - // n0 * ctx_delta + !n0 * (n1 * addr_delta + !n1 * clk_delta) = delta_next - let computed_delta = n0.clone() * ctx_delta.clone() - + (one.clone() - n0.clone()) - * (n1.clone() * addr_delta.clone() + (one - n1.clone()) * clk_delta.clone()); - - Self { - ctx_delta, - addr_delta, - clk_delta, - n0, - n1, - delta_next, - computed_delta, + let builder = &mut builder.when(flags.next_is_first.clone()); + for (i, nw) in not_written.iter().enumerate() { + builder.when(nw.clone()).assert_zero(cols_next.values[i]); } } -} -/// Typed access to memory chiplet columns. -/// -/// This struct provides named access to memory columns, eliminating error-prone -/// index arithmetic. Created from a `MainTraceRow` reference. -pub struct MemoryColumns { - /// Read/write selector: 1=read, 0=write - pub is_read: E, - /// Element/word access: 0=element, 1=word - pub is_word: E, - /// Context ID - pub ctx: E, - /// Word address - pub word_addr: E, - /// First bit of element index - pub idx0: E, - /// Second bit of element index - pub idx1: E, - /// Clock cycle - pub clk: E, - /// Memory word values (4 elements) - pub values: [E; 4], - /// Delta low 16 bits - pub d0: E, - /// Delta high 16 bits - pub d1: E, - /// Delta inverse - pub d_inv: E, - /// Same context/word flag - pub flag_same_ctx_word: E, -} - -impl MemoryColumns { - /// Extract memory columns from a main trace row. - pub fn from_row(row: &MainTraceRow) -> Self - where - AB: LiftedAirBuilder, - AB::Var: Into + Clone, + // ========================================================================== + // TRANSITION CONSTRAINTS (all rows except last) + // ========================================================================== + // Enforces: delta inverse, monotonicity, same-context/addr flag, read-only, + // and value consistency. + let builder = &mut builder.when(flags.is_transition.clone()); + + // --- delta inverse --- + // d_inv (docs: column `t`) is shared across all three delta levels (ctx, addr, clk). + // The assert_bool + assert_zero pairs below form conditional inverses that force d_inv + // to the correct value at each level. + let d_inv_next = cols_next.d_inv; + + // Context: prover sets d_inv = 1/ctx_delta → ctx_changed = 1. + let ctx_delta = cols_next.ctx - cols.ctx; + let ctx_changed = ctx_delta.clone() * d_inv_next; + let same_ctx = ctx_changed.not(); + // ctx_changed must be boolean. When ctx_delta ≠ 0, this forces ctx_changed ∈ {0, 1}. + // If ctx_changed were 0 (same_ctx = 1), the assert_zero(ctx_delta) below would + // require ctx_delta = 0 — contradiction. So ctx_changed = 1, forcing d_inv = 1/ctx_delta. + builder.assert_bool(ctx_changed.clone()); + + // Address: prover sets d_inv = 1/addr_delta → addr_changed = 1. + // Only meaningful when same_ctx = 1; when context changes, addr_changed = + // addr_delta/ctx_delta which is unconstrained, but always gated by same_ctx. + let addr_delta = cols_next.word_addr - cols.word_addr; + let addr_changed = addr_delta.clone() * d_inv_next; + let same_addr = addr_changed.not(); + + // When context is unchanged (same_ctx = 1): { - let load = |global_idx: usize| { - let local_idx = global_idx - CHIPLETS_OFFSET; - row.chiplets[local_idx].clone().into() - }; - - MemoryColumns { - is_read: load(MEMORY_IS_READ_COL_IDX), - is_word: load(MEMORY_IS_WORD_ACCESS_COL_IDX), - ctx: load(MEMORY_CTX_COL_IDX), - word_addr: load(MEMORY_WORD_COL_IDX), - idx0: load(MEMORY_IDX0_COL_IDX), - idx1: load(MEMORY_IDX1_COL_IDX), - clk: load(MEMORY_CLK_COL_IDX), - values: core::array::from_fn(|i| load(MEMORY_V_COL_RANGE.start + i)), - d0: load(MEMORY_D0_COL_IDX), - d1: load(MEMORY_D1_COL_IDX), - d_inv: load(MEMORY_D_INV_COL_IDX), - flag_same_ctx_word: load(MEMORY_FLAG_SAME_CONTEXT_AND_WORD), - } + let builder = &mut builder.when(same_ctx.clone()); + // Completes the ctx_changed enforcement: ctx_delta must be zero. + builder.assert_zero(ctx_delta.clone()); + // addr_changed must be boolean. Same enforcement as ctx_changed: when + // addr_delta ≠ 0, this + the assert_zero(addr_delta) below forces + // addr_changed = 1, i.e. d_inv = 1/addr_delta. + builder.assert_bool(addr_changed.clone()); + // Completes the addr_changed enforcement: addr_delta must be zero. + builder.when(same_addr.clone()).assert_zero(addr_delta.clone()); } - /// Compute constraint flags c_0, c_1, c_2, c_3 for value consistency constraints. - /// - /// c_i = 1 when v[i] needs to be constrained (not being written to), 0 otherwise. - /// - /// For each element i: - /// - Read operation: c_i = 1 (always constrain) - /// - Write operation, element access, element i selected: c_i = 0 (being written, no - /// constraining needed) - /// - Write operation, otherwise: c_i = 1 (not being written, constrain) - /// - /// Logic: c_i = is_read + is_write * is_element * !f_i - /// = is_read + (1 - is_read) * (1 - is_word) * (1 - f_i) - pub fn compute_value_constraint_flags(&self, one: One) -> [E; 4] - where - E: Add + Sub + Mul, - One: Into, + // --- same context/addr flag --- + // f_sca' = 1 when both context and word address are unchanged between rows. + // Stored in a dedicated column for degree reduction (same_ctx * same_addr is + // degree 4; the column lets downstream constraints use it at degree 1). + // Not constrained in the first row (intentional — first-row constraints use + // not_written flags directly, not f_sca). + let same_ctx_and_addr = cols_next.is_same_ctx_and_addr; + builder.assert_eq(same_ctx_and_addr, same_ctx.clone() * same_addr.clone()); + + // --- monotonicity --- + // The priority-selected delta must equal the range-checked decomposition. + // d0, d1 are range-checked 16-bit limbs, so delta_next >= 0. For ctx and addr, + // delta = 0 would contradict the flag being 1, so those deltas are strictly + // positive. For clk, delta = 0 is allowed (duplicate reads; see read-only). + // ctx changed → ctx_delta + // addr changed → addr_delta (reachable only when same context) + // neither → clk_delta + let clk_delta = cols_next.clk - cols.clk; + let computed_delta = { + let ctx_term = ctx_changed * ctx_delta; + let addr_term = addr_changed * addr_delta; + let clk_term = same_addr * clk_delta.clone(); + ctx_term + same_ctx * (addr_term + clk_term) + }; + let delta_next = cols_next.d1 * TWO_POW_16 + cols_next.d0; + builder.assert_eq(computed_delta, delta_next); + + // --- read-only constraint --- + // When context/addr are unchanged (f_sca'=1) and the clock doesn't advance, + // both operations must be reads. + // + // clk_no_change = 1 - clk_delta * d_inv is used as a when() gate. Unlike the ctx + // and addr levels, no constraint forces d_inv = 1/clk_delta. This is intentional: + // clk advances → prover must set d_inv = 1/clk_delta to get clk_no_change = 0, + // otherwise the gate stays active and blocks writes the prover needs. + // clk unchanged → clk_delta = 0, so clk_no_change = 1 regardless of d_inv. + // One-sided safe: a wrong d_inv can only block writes, never enable them. { - let one = one.into(); - - let is_write = one.clone() - self.is_read.clone(); - let is_element = one.clone() - self.is_word.clone(); + let clk_no_change = AB::Expr::ONE - clk_delta * d_inv_next; + let is_write = cols.is_read.into().not(); + let is_write_next = cols_next.is_read.into().not(); + let any_write = is_write + is_write_next; - // Element selection flags (f_i = 1 when idx0,idx1 select element i) - let f0 = (one.clone() - self.idx1.clone()) * (one.clone() - self.idx0.clone()); - let f1 = (one.clone() - self.idx1.clone()) * self.idx0.clone(); - let f2 = self.idx1.clone() * (one.clone() - self.idx0.clone()); - let f3 = self.idx1.clone() * self.idx0.clone(); - - // c_i = is_read + is_write * is_element * !f_i - let compute_c = |f_i: E| { - let not_f_i = one.clone() - f_i; - self.is_read.clone() + is_write.clone() * is_element.clone() * not_f_i - }; + builder.when(same_ctx_and_addr).when(clk_no_change).assert_zero(any_write); + } - [compute_c(f0), compute_c(f1), compute_c(f2), compute_c(f3)] + // --- value consistency --- + // Values not being written must follow the consistency rule: + // same context/addr (f_sca'=1): v'[i] = v[i] (copy from previous row) + // new context/addr (f_sca'=0): v'[i] = 0 (initialize to zero) + // Combined: v'[i] = f_sca' * v[i] + let values = cols.values; + let values_next = cols_next.values; + for (i, nw) in not_written.into_iter().enumerate() { + builder.when(nw).assert_eq(values_next[i], same_ctx_and_addr * values[i]); } } -/// Enforce delta inverse constraints for ctx/addr/clk monotonicity. -/// -/// n0 and n1 are binary flags computed via delta inverse: -/// - n0 = 1 iff ctx changes (ctx_delta != 0) -/// - n1 = 1 iff addr changes when ctx doesn't (addr_delta != 0 and ctx_delta = 0) -fn enforce_delta_inverse_constraints( - builder: &mut AB, - flag_memory_active_not_last: AB::Expr, - deltas: &MemoryDeltas, - one: AB::Expr, -) where - AB: TaggingAirBuilderExt, -{ - let n0 = deltas.n0.clone(); - let n1 = deltas.n1.clone(); - let ctx_delta = deltas.ctx_delta.clone(); - let addr_delta = deltas.addr_delta.clone(); - - // Extract negations for reuse - let not_n0 = one.clone() - n0.clone(); - let not_n1 = one.clone() - n1.clone(); - - let gate = flag_memory_active_not_last; - let gate_not_n0 = gate.clone() * not_n0.clone(); - - let mut idx = 0; - // n0 is binary - tagged_assert_zero_integrity( - builder, - &MEMORY_DELTA_INV_TAGS, - &mut idx, - gate * n0.clone() * (n0.clone() - one.clone()), - ); - // !n0 => ctx_delta = 0 - tagged_assert_zero_integrity( - builder, - &MEMORY_DELTA_INV_TAGS, - &mut idx, - gate_not_n0.clone() * ctx_delta.clone(), - ); - // !n0 and n1 is binary - tagged_assert_zero_integrity( - builder, - &MEMORY_DELTA_INV_TAGS, - &mut idx, - gate_not_n0.clone() * n1.clone() * (n1.clone() - one.clone()), - ); - // !n0 and !n1 => addr_delta = 0 - tagged_assert_zero_integrity( - builder, - &MEMORY_DELTA_INV_TAGS, - &mut idx, - gate_not_n0 * not_n1 * addr_delta.clone(), - ); -} +// INTERNAL HELPERS +// ================================================================================================ -/// Enforce read-only access when context and word address are unchanged. -fn enforce_scw_readonly_constraint( - builder: &mut AB, - flag_memory_active_not_last: AB::Expr, - cols: &MemoryColumns, - cols_next: &MemoryColumns, - deltas: &MemoryDeltas, - one: AB::Expr, -) where - AB: TaggingAirBuilderExt, +/// Compute "not written" flags for each of the 4 word elements. +/// +/// Returns `not_written[i]`: 1 when `v[i]` is NOT the write target (must be constrained), +/// 0 when `v[i]` IS being written (unconstrained). +/// +/// The three operation modes: +/// - **Read** (`is_read=1`): all flags = 1 (reads don't change any value) +/// - **Word write** (`is_word=1`): all flags = 0 (all 4 elements are written) +/// - **Element write** (`is_word=0, is_read=0`): flag = 0 for the selected element, 1 for the other +/// three +/// +/// Corresponds to `c_i` in the docs, with `selected[i]` ≡ `f_i`. +/// +/// Formula: `not_written[i] = is_read + is_write * is_element * !selected[i]` +fn compute_not_written_flags(cols: &MemoryCols) -> [AB::Expr; 4] +where + AB: MidenAirBuilder, { - // If ctx/word are unchanged and clk_delta = 0, both rows must be reads. - // Constraint: f_scw' * (1 - clk_delta * d_inv') * (is_write + is_write') = 0 - - let clk_no_change = one.clone() - deltas.clk_delta.clone() * cols_next.d_inv.clone(); - - let is_write = one.clone() - cols.is_read.clone(); - let is_write_next = one.clone() - cols_next.is_read.clone(); - let any_write = is_write + is_write_next; - - let mut idx = 0; - tagged_assert_zero_integrity( - builder, - &MEMORY_SCW_READS_TAGS, - &mut idx, - flag_memory_active_not_last - * cols_next.flag_same_ctx_word.clone() - * clk_no_change - * any_write, - ); -} - -/// Memory chiplet flag for current row active and continuing to next row. -pub fn flag_memory_active_not_last_row(s0: E, s1: E, s2_next: E) -> E { - // Memory active when s0 = s1 = 1 and not transitioning out (s2' = 0) - s0 * s1 * (E::ONE - s2_next) -} - -/// Flag for transitioning into memory chiplet (first row of memory). -pub fn flag_next_row_first_memory( - s0: E, - s1: E, - s1_next: E, - s2_next: E, -) -> E { - // Current row is bitwise (!s1), next row is memory (s1' & !s2') - (E::ONE - s1) * s0.clone() * s1_next * (E::ONE - s2_next) + let is_read = cols.is_read; + let is_write = is_read.into().not(); + + let is_word = cols.is_word; + let is_element = is_word.into().not(); + + // One-hot element selection: selected[i] = 1 when idx = 2*idx1 + idx0 equals i. + let idx0 = cols.idx0; + let idx1 = cols.idx1; + let not_idx0 = idx0.into().not(); + let not_idx1 = idx1.into().not(); + + let selected = [ + not_idx1.clone() * not_idx0.clone(), // element 0: idx = 0b00 + not_idx1 * idx0, // element 1: idx = 0b01 + idx1 * not_idx0, // element 2: idx = 0b10 + idx1 * idx0, // element 3: idx = 0b11 + ]; + + // not_written[i] = is_read + is_write * is_element * !selected[i] + let is_element_write = is_write * is_element; + selected.map(|s_i| is_read + is_element_write.clone() * s_i.not()) } diff --git a/air/src/constraints/chiplets/mod.rs b/air/src/constraints/chiplets/mod.rs index 4f52c9f23c..da01faa4f5 100644 --- a/air/src/constraints/chiplets/mod.rs +++ b/air/src/constraints/chiplets/mod.rs @@ -1,8 +1,9 @@ -//! Chiplets constraints module (partial). +//! Chiplets constraints module. //! //! Currently we implement: -//! - chiplet selector constraints -//! - hasher chiplet main-trace constraints +//! - chiplet selector constraints (including hasher internal selectors) +//! - permutation sub-chiplet main-trace constraints +//! - controller sub-chiplet main-trace constraints //! - bitwise chiplet main-trace constraints //! - memory chiplet main-trace constraints //! - ACE chiplet main-trace constraints @@ -13,14 +14,16 @@ pub mod ace; pub mod bitwise; pub mod bus; -pub mod hasher; +pub mod columns; +pub mod hasher_control; pub mod kernel_rom; pub mod memory; +pub mod permutation; pub mod selectors; -use miden_crypto::stark::air::LiftedAirBuilder; +use selectors::ChipletSelectors; -use crate::{Felt, MainTraceRow}; +use crate::{MainCols, MidenAirBuilder}; // ENTRY POINTS // ================================================================================================ @@ -28,15 +31,21 @@ use crate::{Felt, MainTraceRow}; /// Enforces chiplets main-trace constraints. pub fn enforce_main( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, + selectors: &ChipletSelectors, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { - selectors::enforce_chiplet_selectors(builder, local, next); - hasher::enforce_hasher_constraints(builder, local, next); - bitwise::enforce_bitwise_constraints(builder, local, next); - memory::enforce_memory_constraints(builder, local, next); - ace::enforce_ace_constraints(builder, local, next); - kernel_rom::enforce_kernel_rom_constraints(builder, local, next); + // Selector constraints (including hasher internal selectors) are enforced in + // build_chiplet_selectors (called from lib.rs). + + // Hasher sub-chiplets: permutation + controller. + permutation::enforce_permutation_constraints(builder, local, next, &selectors.permutation); + hasher_control::enforce_controller_constraints(builder, local, next, &selectors.controller); + + bitwise::enforce_bitwise_constraints(builder, local, next, &selectors.bitwise); + memory::enforce_memory_constraints(builder, local, next, &selectors.memory); + ace::enforce_ace_constraints_all_rows(builder, local, next, &selectors.ace); + kernel_rom::enforce_kernel_rom_constraints(builder, local, next, &selectors.kernel_rom); } diff --git a/air/src/constraints/chiplets/permutation/mod.rs b/air/src/constraints/chiplets/permutation/mod.rs new file mode 100644 index 0000000000..36e81bc210 --- /dev/null +++ b/air/src/constraints/chiplets/permutation/mod.rs @@ -0,0 +1,112 @@ +//! Permutation sub-chiplet constraints. +//! +//! The permutation sub-chiplet executes Poseidon2 permutations as 16-row cycles. +//! It is active when `s_perm = 1` (the permutation segment selector). +//! +//! ## Sub-modules +//! +//! - [`state`]: Poseidon2 round transition constraints +//! +//! ## Column Layout (via [`PermutationCols`]) +//! +//! | Column | Purpose | +//! |--------------|---------| +//! | w0, w1, w2 | S-box witnesses (same physical columns as hasher selectors) | +//! | h[0..12) | Poseidon2 state (RATE0, RATE1, CAP) | +//! | multiplicity | Request multiplicity (same physical column as node_index) | +//! | s_perm | Permutation segment selector (consumed by chiplet selectors) | + +pub mod state; + +use core::borrow::Borrow; + +use miden_crypto::stark::air::AirBuilder; + +use crate::{ + MainCols, MidenAirBuilder, + constraints::chiplets::{ + columns::{HasherPeriodicCols, PeriodicCols}, + selectors::ChipletFlags, + }, +}; + +// ENTRY POINT +// ================================================================================================ + +/// Enforce all permutation sub-chiplet constraints. +/// +/// Receives pre-computed [`ChipletFlags`] from `build_chiplet_selectors`. The `s_perm` +/// column is never referenced directly by constraint code. +pub fn enforce_permutation_constraints( + builder: &mut AB, + local: &MainCols, + next: &MainCols, + flags: &ChipletFlags, +) where + AB: MidenAirBuilder, +{ + let periodic_hasher: HasherPeriodicCols = { + let periodic: &PeriodicCols = builder.periodic_values().borrow(); + periodic.hasher + }; + + let cols = local.permutation(); + let cols_next = next.permutation(); + + // not_cycle_end: 1 on perm-cycle rows 0-14, 0 on the cycle boundary row 15. + let not_cycle_end: AB::Expr = [ + periodic_hasher.is_init_ext, + periodic_hasher.is_ext, + periodic_hasher.is_packed_int, + periodic_hasher.is_int_ext, + ] + .map(Into::into) + .into_iter() + .sum(); + + // --- Poseidon2 permutation step constraints --- + // Gate by is_active (= s_perm, degree 1) alone. This is sound because + // the tri-state selector constraints confine s_perm to hasher rows. + // Keeping the gate at degree 1 is critical: the S-box has degree 7, and + // with the periodic selector (degree 1), the total constraint degree is + // 1 + 1 + 7 = 9, which matches the system's max degree. + state::enforce_permutation_steps( + builder, + flags.is_active.clone(), + cols, + cols_next, + &periodic_hasher, + ); + + // --- Structural confinement on perm rows --- + // is_boundary, direction_bit, and mrupdate_id are unused on permutation rows + // and must be zero to avoid accidental coupling with controller-side logic. + builder.when(flags.is_active.clone()).assert_zeros(cols.unused_padding()); + + // --- Multiplicity constancy within perm cycles --- + // On perm rows that are NOT the cycle boundary (row 15), multiplicity must stay + // constant. This ensures each 16-row cycle has a single multiplicity value. + // Degree: is_active(1) * not_cycle_end(1) * diff(1) = 3. + builder + .when(flags.is_active.clone()) + .when(not_cycle_end.clone()) + .assert_eq(cols_next.multiplicity, cols.multiplicity); + + // --- Cycle boundary alignment --- + // The permutation section must be aligned to the 16-row Poseidon2 cycle: the + // first perm row must land on cycle row 0 and the last on cycle row 15. + // Together these guarantee every permutation spans exactly one complete cycle, + // so the periodic column selectors assign the correct round type to each row. + // + // Entry alignment: the row before the first perm row (= last controller row) + // must be on cycle row 15. `flags.next_is_first` = `ctrl.is_last * s_perm'`, + // which equals `ctrl.is_last` because the transition rules force `s_perm' = 1` + // when `ctrl.is_last` fires. + // Degree: next_is_first(3) * not_cycle_end(1) = 4. + builder.when(flags.next_is_first.clone()).assert_zero(not_cycle_end.clone()); + + // Exit safety: the last permutation row must be on cycle row 15. + // This prevents cross-chiplet next-row reads from firing under perm gates. + // Degree: is_last(2) * not_cycle_end(1) = 3. + builder.when(flags.is_last.clone()).assert_zero(not_cycle_end); +} diff --git a/air/src/constraints/chiplets/permutation/state.rs b/air/src/constraints/chiplets/permutation/state.rs new file mode 100644 index 0000000000..dee5ef7633 --- /dev/null +++ b/air/src/constraints/chiplets/permutation/state.rs @@ -0,0 +1,337 @@ +//! Permutation chiplet state transition constraints. +//! +//! This module enforces the Poseidon2 permutation constraints for the permutation sub-chiplet. +//! The permutation operates on a 16-row cycle with five types of steps: +//! +//! - **Row 0 (init+ext1)**: Merged init linear layer + first external round +//! - **Rows 1-3, 12-14 (external)**: Single external round: add RCs, S-box^7, M_E +//! - **Rows 4-10 (packed internal)**: 3 internal rounds packed per row using witnesses as S-box +//! outputs +//! - **Row 11 (int+ext)**: Last internal round + first trailing external round +//! - **Row 15 (boundary)**: No step constraint (cycle boundary, final permutation state) +//! +//! ## Poseidon2 Parameters +//! +//! - State width: 12 field elements +//! - External rounds: 8 (4 initial + 4 terminal) +//! - Internal rounds: 22 +//! - S-box: x^7 + +use miden_core::{chiplets::hasher::Hasher, field::PrimeCharacteristicRing}; +use miden_crypto::stark::air::AirBuilder; + +use crate::{ + MidenAirBuilder, + constraints::chiplets::columns::{HasherPeriodicCols, PermutationCols}, + trace::chiplets::hasher::STATE_WIDTH, +}; + +// CONSTRAINT HELPERS +// ================================================================================================ + +/// Enforces Poseidon2 permutation step constraints on the 16-row packed cycle. +/// +/// These constraints are gated by `perm_gate = flags.is_active`, so they only +/// fire on permutation segment rows. +/// +/// ## Step Types +/// +/// 1. **Init+ext1 (row 0)**: `h' = M_E(S(M_E(h) + ark))` — degree 9 +/// 2. **Single ext (rows 1-3, 12-14)**: `h' = M_E(S(h + ark))` — degree 9 +/// 3. **Packed 3x internal (rows 4-10)**: witnesses + affine next-state — degree 9 / 3 +/// 4. **Int+ext (row 11)**: witness + `h' = M_E(S(y + ark))` — degree 9 +/// 5. **Boundary (row 15)**: No constraint +/// +/// The witness columns `w[0..2]` correspond to the S-box outputs on permutation rows. +pub fn enforce_permutation_steps( + builder: &mut AB, + perm_gate: AB::Expr, + cols: &PermutationCols, + cols_next: &PermutationCols, + periodic: &HasherPeriodicCols, +) where + AB: MidenAirBuilder, +{ + let h: [AB::Expr; STATE_WIDTH] = core::array::from_fn(|i| cols.state[i].into()); + let h_next: [AB::Expr; STATE_WIDTH] = core::array::from_fn(|i| cols_next.state[i].into()); + let w: [AB::Expr; 3] = core::array::from_fn(|i| cols.witnesses[i].into()); + + // Step-type selectors + let is_init_ext: AB::Expr = periodic.is_init_ext.into(); + let is_ext: AB::Expr = periodic.is_ext.into(); + let is_packed_int: AB::Expr = periodic.is_packed_int.into(); + let is_int_ext: AB::Expr = periodic.is_int_ext.into(); + + // Shared round constants + let ark: [AB::Expr; STATE_WIDTH] = core::array::from_fn(|i| periodic.ark[i].into()); + + // Lift Felt constants needed by pure math helpers. + let mat_diag: [AB::Expr; STATE_WIDTH] = core::array::from_fn(|i| Hasher::MAT_DIAG[i].into()); + let ark_int_21: AB::Expr = Hasher::ARK_INT[21].into(); + + // ------------------------------------------------------------------------- + // 0. Unused witness zeroing + // + // Unused witness columns are forced to zero. On non-packed rows, this means: + // - rows 0-3, 12-15: w0 = w1 = w2 = 0 + // - row 11: w1 = w2 = 0 + // - rows 4-10: w0, w1, w2 unconstrained here (checked by packed witness equations) + // + // These constraints are primarily defensive. They make permutation rows inert when + // witnesses are reused and reduce accidental coupling with controller-side selector + // logic. + // + // Gate degrees: + // - perm_gate(1) * (1 - is_packed_int - is_int_ext)(1) = 2 for w0 + // - perm_gate(1) * (1 - is_packed_int)(1) = 2 for w1,w2 + // Constraint degree: gate(2) * witness(1) = 3 + // ------------------------------------------------------------------------- + // w0 unused on rows that are neither packed-int nor int+ext. + builder + .when(perm_gate.clone() * (AB::Expr::ONE - is_packed_int.clone() - is_int_ext.clone())) + .assert_zero(w[0].clone()); + // w1, w2 unused on rows that are not packed-int. + { + let builder = + &mut builder.when(perm_gate.clone() * (AB::Expr::ONE - is_packed_int.clone())); + builder.assert_zero(w[1].clone()); + builder.assert_zero(w[2].clone()); + } + + // ------------------------------------------------------------------------- + // 1. Init+ext1 (row 0): h' = M_E(S(M_E(h) + ark)) + // Gate degree: perm_gate(1) * is_init_ext(1) = 2 + // Constraint degree: gate(2) * sbox(7) = 9 + // ------------------------------------------------------------------------- + { + let expected = apply_init_plus_ext(&h, &ark); + let builder = &mut builder.when(perm_gate.clone() * is_init_ext); + for i in 0..STATE_WIDTH { + builder.assert_eq(h_next[i].clone(), expected[i].clone()); + } + } + + // ------------------------------------------------------------------------- + // 2. Single external round (rows 1-3, 12-14): h' = M_E(S(h + ark)) + // Gate degree: perm_gate(1) * is_ext(1) = 2 + // Constraint degree: gate(2) * sbox(7) = 9 + // ------------------------------------------------------------------------- + { + let ext_with_rc: [AB::Expr; STATE_WIDTH] = + core::array::from_fn(|i| h[i].clone() + ark[i].clone()); + let ext_with_sbox: [AB::Expr; STATE_WIDTH] = + core::array::from_fn(|i| ext_with_rc[i].clone().exp_const_u64::<7>()); + let expected = apply_matmul_external(&ext_with_sbox); + + let builder = &mut builder.when(perm_gate.clone() * is_ext); + for i in 0..STATE_WIDTH { + builder.assert_eq(h_next[i].clone(), expected[i].clone()); + } + } + + // ------------------------------------------------------------------------- + // 3. Packed 3x internal (rows 4-10): witness checks + affine next-state + // Gate degree: perm_gate(1) * is_packed_int(1) = 2 + // Witness constraint degree: gate(2) * sbox(7) = 9 + // Next-state constraint degree: gate(2) * affine(1) = 3 + // ------------------------------------------------------------------------- + { + // ark[0..2] hold the 3 internal round constants on packed-int rows + let ark_int_3: [AB::Expr; 3] = core::array::from_fn(|i| ark[i].clone()); + let (expected, witness_checks) = apply_packed_internals(&h, &w, &ark_int_3, &mat_diag); + + let builder = &mut builder.when(perm_gate.clone() * is_packed_int); + // 3 witness constraints + for wc in &witness_checks { + builder.assert_zero(wc.clone()); + } + // 12 next-state constraints + for i in 0..STATE_WIDTH { + builder.assert_eq(h_next[i].clone(), expected[i].clone()); + } + } + + // ------------------------------------------------------------------------- + // 4. Int+ext merged (row 11): 1 internal (ARK_INT[21] hardcoded) + 1 external + // Gate degree: perm_gate(1) * is_int_ext(1) = 2 + // Witness constraint degree: gate(2) * sbox(7) = 9 + // Next-state constraint degree: gate(2) * sbox(7) = 9 + // ------------------------------------------------------------------------- + { + let (expected, witness_check) = + apply_internal_plus_ext(&h, &w[0], ark_int_21, &ark, &mat_diag); + + let builder = &mut builder.when(perm_gate * is_int_ext); + // 1 witness constraint + builder.assert_zero(witness_check); + // 12 next-state constraints + for i in 0..STATE_WIDTH { + builder.assert_eq(h_next[i].clone(), expected[i].clone()); + } + } +} + +// ============================================================================= +// LINEAR ALGEBRA HELPERS +// ============================================================================= + +/// Applies the external linear layer M_E to the state. +/// +/// The external layer consists of: +/// 1. Apply M4 to each 4-element block +/// 2. Add cross-block sums to each element +fn apply_matmul_external(state: &[E; STATE_WIDTH]) -> [E; STATE_WIDTH] { + // Apply M4 to each 4-element block + let b0 = matmul_m4(core::array::from_fn(|i| state[i].clone())); + let b1 = matmul_m4(core::array::from_fn(|i| state[4 + i].clone())); + let b2 = matmul_m4(core::array::from_fn(|i| state[8 + i].clone())); + + // Compute cross-block sums + let stored0 = b0[0].clone() + b1[0].clone() + b2[0].clone(); + let stored1 = b0[1].clone() + b1[1].clone() + b2[1].clone(); + let stored2 = b0[2].clone() + b1[2].clone() + b2[2].clone(); + let stored3 = b0[3].clone() + b1[3].clone() + b2[3].clone(); + + // Add sums to each element + [ + b0[0].clone() + stored0.clone(), + b0[1].clone() + stored1.clone(), + b0[2].clone() + stored2.clone(), + b0[3].clone() + stored3.clone(), + b1[0].clone() + stored0.clone(), + b1[1].clone() + stored1.clone(), + b1[2].clone() + stored2.clone(), + b1[3].clone() + stored3.clone(), + b2[0].clone() + stored0, + b2[1].clone() + stored1, + b2[2].clone() + stored2, + b2[3].clone() + stored3, + ] +} + +/// Applies the 4x4 matrix M4 used in Poseidon2's external linear layer. +fn matmul_m4(input: [E; 4]) -> [E; 4] { + let [a, b, c, d] = input.clone(); + + let t0 = a.clone() + b.clone(); + let t1 = c.clone() + d.clone(); + let t2 = b.double() + t1.clone(); // 2b + t1 + let t3 = d.double() + t0.clone(); // 2d + t0 + let t4 = t1.double().double() + t3.clone(); // 4*t1 + t3 + let t5 = t0.double().double() + t2.clone(); // 4*t0 + t2 + + let out0 = t3.clone() + t5.clone(); + let out1 = t5; + let out2 = t2 + t4.clone(); + let out3 = t4; + + [out0, out1, out2, out3] +} + +/// Applies the internal linear layer M_I to the state. +/// +/// M_I = I + diag(MAT_DIAG) where all rows share the same sum. +/// The `mat_diag` parameter provides `Hasher::MAT_DIAG` pre-lifted to the expression type. +fn apply_matmul_internal( + state: &[E; STATE_WIDTH], + mat_diag: &[E; STATE_WIDTH], +) -> [E; STATE_WIDTH] { + // Sum of all state elements + let sum = E::sum_array::(state); + // result[i] = state[i] * MAT_DIAG[i] + sum + core::array::from_fn(|i| state[i].clone() * mat_diag[i].clone() + sum.clone()) +} + +// ============================================================================= +// PACKED ROUND HELPERS +// ============================================================================= + +/// Computes the expected next state for the merged init linear + first external round. +/// +/// h' = M_E(S(M_E(h) + ark_ext)) +/// +/// The init step applies M_E to the input, then the first external round adds round +/// constants, applies the full S-box, and applies M_E again. This is a single S-box +/// layer over affine expressions, so the constraint degree is 7. +pub fn apply_init_plus_ext( + h: &[E; STATE_WIDTH], + ark_ext: &[E; STATE_WIDTH], +) -> [E; STATE_WIDTH] { + // Apply M_E to get the pre-round state + let pre = apply_matmul_external(h); + + // Add round constants, apply S-box, apply M_E + let with_rc: [E; STATE_WIDTH] = core::array::from_fn(|i| pre[i].clone() + ark_ext[i].clone()); + let with_sbox: [E; STATE_WIDTH] = + core::array::from_fn(|i| with_rc[i].clone().exp_const_u64::<7>()); + apply_matmul_external(&with_sbox) +} + +/// Computes the expected next state and witness checks for 3 packed internal rounds. +/// +/// Each internal round applies: add RC to lane 0, S-box lane 0, then M_I. +/// The S-box output for each round is provided as an explicit witness (w0, w1, w2), +/// which keeps the intermediate states affine and the constraint degree at 7. +/// +/// Returns: +/// - `next_state`: expected state after all 3 rounds (affine in trace columns, degree 1) +/// - `witness_checks`: 3 expressions that must be zero (each degree 7): `wk - (y(k)_0 + +/// ark_int[k])^7` +pub fn apply_packed_internals( + h: &[E; STATE_WIDTH], + w: &[E; 3], + ark_int: &[E; 3], + mat_diag: &[E; STATE_WIDTH], +) -> ([E; STATE_WIDTH], [E; 3]) { + let mut state = h.clone(); + let mut witness_checks: [E; 3] = core::array::from_fn(|_| E::ZERO); + + for k in 0..3 { + // Witness check: wk = (state[0] + ark_int[k])^7 + let sbox_input = state[0].clone() + ark_int[k].clone(); + witness_checks[k] = w[k].clone() - sbox_input.exp_const_u64::<7>(); + + // Substitute witness for lane 0 and apply M_I + state[0] = w[k].clone(); + state = apply_matmul_internal(&state, mat_diag); + } + + (state, witness_checks) +} + +/// Computes the expected next state and witness check for one internal round followed +/// by one external round. +/// +/// Used for the int22+ext5 merged row (row 11). The internal round constant ARK_INT[21] +/// is passed as a concrete Felt rather than read from a periodic column. This is valid +/// because row 11 is the only row gated by `is_int_ext` -- no other row needs a different +/// value under the same gate. A periodic column would waste 15 zero entries to deliver +/// one value. +/// +/// Returns: +/// - `next_state`: expected state after int + ext (degree 7 in trace columns) +/// - `witness_check`: `w0 - (h[0] + ark_int_const)^7` (degree 7) +pub fn apply_internal_plus_ext( + h: &[E; STATE_WIDTH], + w0: &E, + ark_int_const: E, + ark_ext: &[E; STATE_WIDTH], + mat_diag: &[E; STATE_WIDTH], +) -> ([E; STATE_WIDTH], E) { + // Internal round: witness check and state update + let sbox_input = h[0].clone() + ark_int_const; + let witness_check = w0.clone() - sbox_input.exp_const_u64::<7>(); + + let mut int_state = h.clone(); + int_state[0] = w0.clone(); + let intermediate = apply_matmul_internal(&int_state, mat_diag); + + // External round: add RC, S-box all lanes, M_E + let with_rc: [E; STATE_WIDTH] = + core::array::from_fn(|i| intermediate[i].clone() + ark_ext[i].clone()); + let with_sbox: [E; STATE_WIDTH] = + core::array::from_fn(|i| with_rc[i].clone().exp_const_u64::<7>()); + let next_state = apply_matmul_external(&with_sbox); + + (next_state, witness_check) +} diff --git a/air/src/constraints/chiplets/selectors.rs b/air/src/constraints/chiplets/selectors.rs index 2810da7bcb..5ef30bdf21 100644 --- a/air/src/constraints/chiplets/selectors.rs +++ b/air/src/constraints/chiplets/selectors.rs @@ -1,204 +1,322 @@ -//! Chiplet selector system constraints. +//! Chiplet selector system constraints and precomputed flags. //! -//! This module implements the hierarchical chiplet selector system that determines -//! which chiplet is active at any given row. +//! This module implements the chiplet selector system that determines which chiplet is +//! active at any given row, and provides precomputed flags for gating chiplet-specific +//! constraints. //! //! ## Selector Hierarchy //! -//! The chiplet system uses 5 selector columns `s[0..4]` to identify active chiplets: +//! The chiplet system uses two physical selector columns (`s_ctrl = chiplets[0]` and +//! `s_perm = chiplets[20]`) plus the virtual `s0 = 1 - (s_ctrl + s_perm)` to partition +//! rows into three top-level regions. The remaining selectors `s1..s4` subdivide the +//! `s0` region into the remaining chiplets. //! -//! | Chiplet | Active when | Selector pattern | -//! |-------------|--------------------------------|------------------| -//! | Hasher | `!s0` | `(0, *, *, *, *)` | -//! | Bitwise | `s0 * !s1` | `(1, 0, *, *, *)` | -//! | Memory | `s0 * s1 * !s2` | `(1, 1, 0, *, *)` | -//! | ACE | `s0 * s1 * s2 * !s3` | `(1, 1, 1, 0, *)` | -//! | Kernel ROM | `s0 * s1 * s2 * s3 * !s4` | `(1, 1, 1, 1, 0)` | +//! | Chiplet | Active when | +//! |-------------|--------------------------------| +//! | Controller | `s_ctrl` | +//! | Permutation | `s_perm` | +//! | Bitwise | `s0 * !s1` | +//! | Memory | `s0 * s1 * !s2` | +//! | ACE | `s0 * s1 * s2 * !s3` | +//! | Kernel ROM | `s0 * s1 * s2 * s3 * !s4` | +//! +//! ## Selector Transition Rules +//! +//! - `s_ctrl`, `s_perm`, and `s_ctrl + s_perm` are boolean (at most one is active) +//! - `s_ctrl = 1 → s_ctrl' + s_perm' = 1` (a controller row must be followed by another controller +//! row or a permutation row) +//! - `s_perm = 1 → s_ctrl' = 0` (a permutation row cannot be followed by a controller row; it can +//! only continue as permutation or transition to s0) +//! - `s0 = 1 → s_ctrl' = 0 ∧ s_perm' = 0` (once in the s0 region, stay there) +//! +//! These force the trace ordering: `ctrl...ctrl, perm...perm, s0...s0`. +//! +//! ## Precomputed Flags +//! +//! Each chiplet gets a [`ChipletFlags`] struct with four flags: +//! - `is_active`: 1 when this chiplet owns the current row +//! - `is_transition`: active on both current and next row (bakes in `is_transition()`) +//! - `is_last`: last row of this chiplet's section (`is_active * s_n'`) +//! - `next_is_first`: next row is the first of this chiplet (`is_last[n-1] * (1 - s_n')`) +//! +//! For controller and permutation, `is_active` is the direct physical selector (`s_ctrl` or +//! `s_perm`). For the remaining chiplets under `s0`, `is_active` uses the subtraction trick +//! (`prefix - prefix * s_n`). //! //! ## Constraints //! -//! 1. **Binary constraints**: Each selector is binary when it could be active -//! 2. **Stability constraints**: Once a selector becomes 1, it stays 1 (no 1→0 transitions) +//! 1. **Tri-state partition**: `s_ctrl`, `s_perm`, `(s_ctrl + s_perm)` are boolean +//! 2. **Transition rules**: ctrl→ctrl|perm, perm→perm|s0, s0→s0 +//! 3. **Binary constraints**: `s1..s4` are binary when their prefix is active +//! 4. **Stability constraints**: Once `s1..s4` become 1, they stay 1 (no 1→0 transitions) +//! 5. **Last-row invariant**: `s_ctrl = 0`, `s1 = s2 = s3 = s4 = 1` on the final row +//! +//! The last-row invariant ensures every chiplet's `is_active` flag is zero on the last +//! row. Combined with the `(1 - s_n')` factor in the precomputed flags, this makes +//! chiplet-gated constraints automatically vanish on the last row without needing +//! explicit `when_transition()` guards. use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::{AirBuilder, LiftedAirBuilder}; +use miden_crypto::stark::air::AirBuilder; -use crate::{ - Felt, MainTraceRow, - constraints::tagging::{TaggingAirBuilderExt, ids::TAG_CHIPLETS_BASE}, -}; +use crate::{MainCols, MidenAirBuilder, constraints::utils::BoolNot}; -// TAGGING IDS +// CHIPLET FLAGS // ================================================================================================ -/// Base ID for chiplet selector constraints. -const CHIPLET_SELECTORS_BASE_ID: usize = TAG_CHIPLETS_BASE; - -/// Constraint namespaces in assertion order. -const CHIPLET_SELECTORS_NAMES: [&str; 10] = [ - "chiplets.selectors.s0.binary", - "chiplets.selectors.s1.binary", - "chiplets.selectors.s2.binary", - "chiplets.selectors.s3.binary", - "chiplets.selectors.s4.binary", - "chiplets.selectors.s0.stability", - "chiplets.selectors.s1.stability", - "chiplets.selectors.s2.stability", - "chiplets.selectors.s3.stability", - "chiplets.selectors.s4.stability", -]; - -// ENTRY POINTS +/// Precomputed flags for a single chiplet. +#[derive(Clone)] +pub struct ChipletFlags { + /// 1 when this chiplet owns the current row. + pub is_active: E, + /// `is_transition() * prefix * (1 - s_n')` — bakes in the transition flag. + pub is_transition: E, + /// `is_active * s_n'` — last row of this chiplet's section. + pub is_last: E, + /// `is_last[n-1] * (1 - s_n')` — next row is the first row of this chiplet. + pub next_is_first: E, +} + +/// Precomputed flags for all chiplets. +#[derive(Clone)] +pub struct ChipletSelectors { + pub controller: ChipletFlags, + pub permutation: ChipletFlags, + pub bitwise: ChipletFlags, + pub memory: ChipletFlags, + pub ace: ChipletFlags, + pub kernel_rom: ChipletFlags, +} + +// ENTRY POINT // ================================================================================================ -/// Enforce chiplet selector constraints. +/// Enforce chiplet selector constraints and build precomputed flags. /// /// This enforces: -/// 1. Binary constraints for each selector level -/// 2. Stability constraints (no 1→0 transitions) -pub fn enforce_chiplet_selectors( +/// 1. Tri-state partition constraints for `s_ctrl`, `s_perm`, virtual `s0` +/// 2. Transition rules (ctrl→ctrl|perm, perm→perm|s0, s0→s0) +/// 3. Binary and stability constraints for `s1..s4` under `s0` +/// 4. Last-row invariant (`s_ctrl = 0`, `s1..s4 = 1`) +/// 5. Hasher domain-specific constraints (sub-selector booleanity, pairing, cycle alignment) +/// +/// Returns [`ChipletSelectors`] with precomputed flags for gating chiplet constraints. +pub fn build_chiplet_selectors( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, -) where - AB: LiftedAirBuilder, + local: &MainCols, + next: &MainCols, +) -> ChipletSelectors +where + AB: MidenAirBuilder, { - // Load selector columns (chiplets[0..5] are the selectors) - let s0: AB::Expr = local.chiplets[0].clone().into(); - let s1: AB::Expr = local.chiplets[1].clone().into(); - let s2: AB::Expr = local.chiplets[2].clone().into(); - let s3: AB::Expr = local.chiplets[3].clone().into(); - let s4: AB::Expr = local.chiplets[4].clone().into(); - - let s0_next: AB::Expr = next.chiplets[0].clone().into(); - let s1_next: AB::Expr = next.chiplets[1].clone().into(); - let s2_next: AB::Expr = next.chiplets[2].clone().into(); - let s3_next: AB::Expr = next.chiplets[3].clone().into(); - let s4_next: AB::Expr = next.chiplets[4].clone().into(); - - let one: AB::Expr = AB::Expr::ONE; - - // ========================================================================== - // BINARY CONSTRAINTS - // ========================================================================== - // Each selector is binary when it could be active - - // s0 is always binary - builder.tagged(CHIPLET_SELECTORS_BASE_ID, CHIPLET_SELECTORS_NAMES[0], |builder| { - builder.assert_zero(s0.clone() * (s0.clone() - one.clone())); - }); - - // s1 is binary when s0 = 1 (bitwise, memory, ACE, or kernel ROM could be active) - builder.tagged(CHIPLET_SELECTORS_BASE_ID + 1, CHIPLET_SELECTORS_NAMES[1], |builder| { - builder.when(s0.clone()).assert_zero(s1.clone() * (s1.clone() - one.clone())); - }); - - // s2 is binary when s0 = 1 and s1 = 1 (memory, ACE, or kernel ROM could be active) - builder.tagged(CHIPLET_SELECTORS_BASE_ID + 2, CHIPLET_SELECTORS_NAMES[2], |builder| { - builder - .when(s0.clone()) - .when(s1.clone()) - .assert_zero(s2.clone() * (s2.clone() - one.clone())); - }); - - // s3 is binary when s0 = s1 = s2 = 1 (ACE or kernel ROM could be active) - builder.tagged(CHIPLET_SELECTORS_BASE_ID + 3, CHIPLET_SELECTORS_NAMES[3], |builder| { - builder - .when(s0.clone()) - .when(s1.clone()) - .when(s2.clone()) - .assert_zero(s3.clone() * (s3.clone() - one.clone())); - }); - - // s4 is binary when s0 = s1 = s2 = s3 = 1 (kernel ROM could be active) - builder.tagged(CHIPLET_SELECTORS_BASE_ID + 4, CHIPLET_SELECTORS_NAMES[4], |builder| { - builder - .when(s0.clone()) - .when(s1.clone()) - .when(s2.clone()) - .when(s3.clone()) - .assert_zero(s4.clone() * (s4.clone() - one.clone())); - }); - - // ========================================================================== - // STABILITY CONSTRAINTS (transition only) - // ========================================================================== - // Once a selector becomes 1, it must stay 1 (forbids 1→0 transitions) - - // s0' = s0 when s0 = 1 - builder.tagged(CHIPLET_SELECTORS_BASE_ID + 5, CHIPLET_SELECTORS_NAMES[5], |builder| { - builder - .when_transition() - .when(s0.clone()) - .assert_zero(s0_next.clone() - s0.clone()); - }); - - // s1' = s1 when s0 = 1 and s1 = 1 - builder.tagged(CHIPLET_SELECTORS_BASE_ID + 6, CHIPLET_SELECTORS_NAMES[6], |builder| { - builder - .when_transition() - .when(s0.clone()) - .when(s1.clone()) - .assert_zero(s1_next.clone() - s1.clone()); - }); - - // s2' = s2 when s0 = s1 = s2 = 1 - builder.tagged(CHIPLET_SELECTORS_BASE_ID + 7, CHIPLET_SELECTORS_NAMES[7], |builder| { - builder - .when_transition() - .when(s0.clone()) - .when(s1.clone()) - .when(s2.clone()) - .assert_zero(s2_next.clone() - s2.clone()); - }); - - // s3' = s3 when s0 = s1 = s2 = s3 = 1 - builder.tagged(CHIPLET_SELECTORS_BASE_ID + 8, CHIPLET_SELECTORS_NAMES[8], |builder| { - builder - .when_transition() - .when(s0.clone()) - .when(s1.clone()) - .when(s2.clone()) - .when(s3.clone()) - .assert_zero(s3_next.clone() - s3.clone()); - }); - - // s4' = s4 when s0 = s1 = s2 = s3 = s4 = 1 - builder.tagged(CHIPLET_SELECTORS_BASE_ID + 9, CHIPLET_SELECTORS_NAMES[9], |builder| { - builder - .when_transition() - .when(s0) - .when(s1) - .when(s2) - .when(s3) - .when(s4.clone()) - .assert_zero(s4_next - s4); - }); -} + // ========================================================================= + // LOAD SELECTOR COLUMNS + // ========================================================================= -// INTERNAL HELPERS -// ================================================================================================ + // [s_ctrl, s_perm, s1, s2, s3, s4] + let sel = local.chiplet_selectors(); + let sel_next = next.chiplet_selectors(); -/// Bitwise chiplet active flag: `s0 * !s1`. -#[inline] -pub fn bitwise_chiplet_flag(s0: E, s1: E) -> E { - s0 * (E::ONE - s1) -} + // s_ctrl = chiplets[0]: 1 on controller rows, 0 on perm/non-hasher rows. + let s_ctrl: AB::Expr = sel[0].into(); + let s_ctrl_next: AB::Expr = sel_next[0].into(); -/// Memory chiplet active flag: `s0 * s1 * !s2`. -#[inline] -pub fn memory_chiplet_flag(s0: E, s1: E, s2: E) -> E { - s0 * s1 * (E::ONE - s2) -} + // s_perm: 1 on permutation rows, 0 elsewhere. + let s_perm: AB::Expr = sel[1].into(); + let s_perm_next: AB::Expr = sel_next[1].into(); -/// ACE chiplet active flag: `s0 * s1 * s2 * !s3`. -#[inline] -pub fn ace_chiplet_flag(s0: E, s1: E, s2: E, s3: E) -> E { - s0 * s1 * s2 * (E::ONE - s3) -} + // s_ctrl_or_s_perm: 1 on any hasher row (controller or permutation), 0 on s0 rows. + let s_ctrl_or_s_perm = s_ctrl.clone() + s_perm.clone(); + let s_ctrl_or_s_perm_next = s_ctrl_next.clone() + s_perm_next.clone(); + + // s1..s4: remaining chiplet selectors. + let s1: AB::Expr = sel[2].into(); + let s2: AB::Expr = sel[3].into(); + let s3: AB::Expr = sel[4].into(); + let s4: AB::Expr = sel[5].into(); + + let s1_next: AB::Expr = sel_next[2].into(); + let s2_next: AB::Expr = sel_next[3].into(); + let s3_next: AB::Expr = sel_next[4].into(); + let s4_next: AB::Expr = sel_next[5].into(); + + // Virtual s0 = 1 - (s_ctrl + s_perm): same semantics as old chiplets[0]. + // 0 on controller and perm rows, 1 on non-hasher rows. + let s0: AB::Expr = s_ctrl_or_s_perm.clone().not(); + + // ========================================================================= + // TRI-STATE SELECTOR CONSTRAINTS + // ========================================================================= + + // s_ctrl and s_perm are each boolean, and at most one can be active (their + // sum is also boolean, so they cannot both be 1 simultaneously). + builder.assert_bool(s_ctrl.clone()); + builder.assert_bool(s_perm.clone()); + builder.assert_bool(s_ctrl_or_s_perm.clone()); + + // Transition rules: enforce the trace ordering ctrl...ctrl, perm...perm, s0...s0. + { + let builder = &mut builder.when_transition(); + + // A controller row must be followed by another controller or permutation row. + // s_ctrl * (1 - (s_ctrl' + s_perm')) = 0. + builder.when(s_ctrl.clone()).assert_one(s_ctrl_or_s_perm_next.clone()); + + // A permutation row cannot be followed by a controller row. + // s_perm * s_ctrl' = 0. + builder.when(s_perm.clone()).assert_zero(s_ctrl_next.clone()); + + // Once in the s0 region, neither s_ctrl nor s_perm can appear again. + // s0 * s_ctrl' = 0, s0 * s_perm' = 0. + { + let builder = &mut builder.when(s0.clone()); + builder.assert_zero(s_ctrl_next.clone()); + builder.assert_zero(s_perm_next.clone()); + } + } + + // ========================================================================= + // REMAINING CHIPLET SELECTOR CONSTRAINTS (s1..s4 under virtual s0) + // ========================================================================= + + // Cumulative products gate each selector on its prefix being active. + let s01 = s0.clone() * s1.clone(); + let s012 = s01.clone() * s2.clone(); + let s0123 = s012.clone() * s3.clone(); + + // s1..s4 booleanity, gated by their prefix under s0. + builder.when(s0.clone()).assert_bool(s1.clone()); + builder.when(s01.clone()).assert_bool(s2.clone()); + builder.when(s012.clone()).assert_bool(s3.clone()); + builder.when(s0123.clone()).assert_bool(s4.clone()); + + // s1..s4 stability: once set to 1, they stay 1 (forbids 1→0 transitions). + // Gated by the cumulative product including the target selector, so the gate + // is only active when the selector is already 1 — permitting the 0→1 + // transition at section boundaries while forbidding 1→0. + let s01234 = s0123.clone() * s4.clone(); + { + let builder = &mut builder.when_transition(); + builder.when(s01.clone()).assert_eq(s1_next.clone(), s1.clone()); + builder.when(s012.clone()).assert_eq(s2_next.clone(), s2.clone()); + builder.when(s0123.clone()).assert_eq(s3_next.clone(), s3.clone()); + builder.when(s01234.clone()).assert_eq(s4_next.clone(), s4.clone()); + } + + // ========================================================================= + // LAST-ROW INVARIANT + // ========================================================================= + // On the last row: s_ctrl = s_perm = 0 and s1 = s2 = s3 = s4 = 1 (kernel_rom + // section). Virtual s0 = 1 follows from s_ctrl = s_perm = 0. + // This ensures every chiplet's is_active flag is zero on the last row. + // Combined with the (1 - s_n') factor in precomputed flags, chiplet-gated + // constraints automatically vanish without explicit when_transition() guards. + { + let builder = &mut builder.when_last_row(); + builder.assert_zero(s_ctrl.clone()); + builder.assert_zero(s_perm.clone()); + builder.assert_one(s1.clone()); + builder.assert_one(s2.clone()); + builder.assert_one(s3.clone()); + builder.assert_one(s4.clone()); + } + + // ========================================================================= + // PRECOMPUTE FLAGS + // ========================================================================= + + let not_s1_next = s1_next.not(); + let not_s2_next = s2_next.not(); + let not_s3_next = s3_next.not(); + let not_s4_next = s4_next.not(); + + let is_transition_flag: AB::Expr = builder.is_transition(); + + // --- Controller flags (direct physical selector s_ctrl) --- + // is_active = s_ctrl (deg 1) + // is_transition = is_transition_flag * s_ctrl * s_ctrl' (deg 3) + // is_last = s_ctrl * (1 - s_ctrl') (deg 2) + let ctrl_is_active = s_ctrl.clone(); + let ctrl_is_transition = is_transition_flag.clone() * s_ctrl.clone() * s_ctrl_next.clone(); + let ctrl_is_last = s_ctrl.clone() * s_ctrl_next.clone().not(); + let ctrl_next_is_first = AB::Expr::ZERO; // controller is first section + + // --- Permutation flags (direct physical selector s_perm) --- + // is_active = s_perm (deg 1) + // is_transition = is_transition_flag * s_perm * s_perm' (deg 3) + // is_last = s_perm * (1 - s_perm') (deg 2) + // next_is_first = ctrl_is_last * s_perm' (deg 3) + let perm_is_active = s_perm.clone(); + let perm_is_transition = is_transition_flag.clone() * s_perm.clone() * s_perm_next.clone(); + let perm_is_last = s_perm.clone() * s_perm_next.clone().not(); + let perm_next_is_first = ctrl_is_last.clone() * s_perm_next.clone(); + + // --- Remaining chiplet active flags (subtraction trick: prefix - prefix * s_n) --- + let is_bitwise = s0.clone() - s01.clone(); + let is_memory = s01.clone() - s012.clone(); + let is_ace = s012.clone() - s0123.clone(); + let is_kernel_rom = s0123.clone() - s01234; + + // --- Remaining chiplet last-row flags: is_active * s_n' --- + let is_bitwise_last = is_bitwise.clone() * s1_next; + let is_memory_last = is_memory.clone() * s2_next; + let is_ace_last = is_ace.clone() * s3_next; + let is_kernel_rom_last = is_kernel_rom.clone() * s4_next; + + // --- Remaining chiplet next-is-first flags: is_last[n-1] * (1 - s_n') --- + let next_is_bitwise_first = perm_is_last.clone() * not_s1_next.clone(); + let next_is_memory_first = is_bitwise_last.clone() * not_s2_next.clone(); + let next_is_ace_first = is_memory_last.clone() * not_s3_next.clone(); + let next_is_kernel_rom_first = is_ace_last.clone() * not_s4_next.clone(); + + // --- Remaining chiplet transition flags --- + // Each sub-s0 chiplet fires its transition flag when the current row is in that + // chiplet's section (the prefix product) and the next row hasn't yet advanced + // past it (the `1 - s_n'` factor). We don't need an explicit `(1 - s_ctrl' - + // s_perm')` factor because the tri-state transition rule already enforces + // `s0 = 1 → s_ctrl' = 0 ∧ s_perm' = 0`, so on valid traces that factor is + // always 1 whenever the prefix is active. + let bitwise_transition = is_transition_flag.clone() * s0.clone() * not_s1_next; + let memory_transition = is_transition_flag.clone() * s01.clone() * not_s2_next; + let ace_transition = is_transition_flag.clone() * s012.clone() * not_s3_next; + let kernel_rom_transition = is_transition_flag * s0123 * not_s4_next; -/// Kernel ROM chiplet active flag: `s0 * s1 * s2 * s3 * !s4`. -#[inline] -pub fn kernel_rom_chiplet_flag(s0: E, s1: E, s2: E, s3: E, s4: E) -> E { - s0 * s1 * s2 * s3 * (E::ONE - s4) + ChipletSelectors { + controller: ChipletFlags { + is_active: ctrl_is_active, + is_transition: ctrl_is_transition, + is_last: ctrl_is_last, + next_is_first: ctrl_next_is_first, + }, + permutation: ChipletFlags { + is_active: perm_is_active, + is_transition: perm_is_transition, + is_last: perm_is_last, + next_is_first: perm_next_is_first, + }, + bitwise: ChipletFlags { + is_active: is_bitwise, + is_transition: bitwise_transition, + is_last: is_bitwise_last, + next_is_first: next_is_bitwise_first, + }, + memory: ChipletFlags { + is_active: is_memory, + is_transition: memory_transition, + is_last: is_memory_last, + next_is_first: next_is_memory_first, + }, + ace: ChipletFlags { + is_active: is_ace, + is_transition: ace_transition, + is_last: is_ace_last, + next_is_first: next_is_ace_first, + }, + kernel_rom: ChipletFlags { + is_active: is_kernel_rom, + is_transition: kernel_rom_transition, + is_last: is_kernel_rom_last, + next_is_first: next_is_kernel_rom_first, + }, + } } diff --git a/air/src/constraints/columns.rs b/air/src/constraints/columns.rs new file mode 100644 index 0000000000..6f158e14cf --- /dev/null +++ b/air/src/constraints/columns.rs @@ -0,0 +1,297 @@ +//! Column layout types for the main and auxiliary execution traces. +//! +//! These `#[repr(C)]` structs provide typed, named access to trace columns. +//! They are borrowed zero-copy from raw `[T; WIDTH]` slices and are used +//! exclusively by constraint code. They are independent of trace storage +//! (`MainTrace`, `TraceStorage`, etc.). + +use core::{ + borrow::{Borrow, BorrowMut}, + mem::size_of, +}; + +use super::{ + chiplets::columns::{ + AceCols, AceEvalCols, AceReadCols, BitwiseCols, ControllerCols, KernelRomCols, MemoryCols, + PermutationCols, borrow_chiplet, + }, + decoder::columns::DecoderCols, + range::columns::RangeCols, + stack::columns::StackCols, + system::columns::SystemCols, +}; +use crate::trace::{AUX_TRACE_WIDTH, CHIPLETS_WIDTH, TRACE_WIDTH}; + +// MAIN TRACE COLUMN STRUCT +// ================================================================================================ + +/// Column layout of the main execution trace (71 columns). +/// +/// This `#[repr(C)]` struct provides typed, named access to every column. It can be +/// borrowed zero-copy from a raw `[T; TRACE_WIDTH]` slice via `Borrow>`. +/// +/// Chiplet columns are not public because the 20 columns are a union — their interpretation +/// depends on which chiplet is active. Access goes through typed accessors like +/// [`MainCols::permutation()`], [`MainCols::controller()`], [`MainCols::bitwise()`], etc. +/// +/// The `s_perm` column is separated from the chiplets array because it is consumed +/// exclusively by the chiplet selector system, not by any chiplet's constraint code. +#[repr(C)] +pub struct MainCols { + pub system: SystemCols, + pub decoder: DecoderCols, + pub stack: StackCols, + pub range: RangeCols, + pub(crate) chiplets: [T; CHIPLETS_WIDTH - 1], + /// Permutation segment selector: consumed by `build_chiplet_selectors`. + pub s_perm: T, +} + +impl MainCols { + /// Returns the 6 chiplet selector columns `[s_ctrl, s_perm, s1, s2, s3, s4]`. + /// + /// `s_ctrl = chiplets[0]` and `s_perm` are the two physical selectors + /// for the controller and permutation sub-chiplets. `s1..s4` subdivide the + /// remaining chiplets under the virtual `s0 = 1 - (s_ctrl + s_perm)`. + pub fn chiplet_selectors(&self) -> [T; 6] + where + T: Copy, + { + [ + self.chiplets[0], + self.s_perm, + self.chiplets[1], + self.chiplets[2], + self.chiplets[3], + self.chiplets[4], + ] + } + + /// Returns a typed borrow of the bitwise chiplet columns (chiplets\[2..15\]). + pub fn bitwise(&self) -> &BitwiseCols { + borrow_chiplet(&self.chiplets[2..15]) + } + + /// Returns a typed borrow of the memory chiplet columns (chiplets\[3..18\]). + pub fn memory(&self) -> &MemoryCols { + borrow_chiplet(&self.chiplets[3..18]) + } + + /// Returns a typed borrow of the ACE chiplet columns (chiplets\[4..20\]). + /// + /// Spans `chiplets[4..20]` (16 cols). Since `chiplets` has 20 elements (indices + /// 0..19), this is `chiplets[4..20]` = `chiplets[4..]` (all 16 remaining). + pub fn ace(&self) -> &AceCols { + borrow_chiplet(&self.chiplets[4..]) + } + + /// Returns a typed borrow of the kernel ROM chiplet columns (chiplets\[5..10\]). + pub fn kernel_rom(&self) -> &KernelRomCols { + borrow_chiplet(&self.chiplets[5..10]) + } + + /// Returns a typed borrow of the permutation sub-chiplet columns (chiplets\[1..20\]). + pub fn permutation(&self) -> &PermutationCols { + borrow_chiplet(&self.chiplets[1..]) + } + + /// Returns a typed borrow of the controller sub-chiplet columns (chiplets\[1..20\]). + pub fn controller(&self) -> &ControllerCols { + borrow_chiplet(&self.chiplets[1..]) + } +} + +impl Borrow> for [T] { + fn borrow(&self) -> &MainCols { + debug_assert_eq!(self.len(), TRACE_WIDTH); + let (prefix, shorts, suffix) = unsafe { self.align_to::>() }; + debug_assert!(prefix.is_empty() && suffix.is_empty() && shorts.len() == 1); + &shorts[0] + } +} + +impl BorrowMut> for [T] { + fn borrow_mut(&mut self) -> &mut MainCols { + debug_assert_eq!(self.len(), TRACE_WIDTH); + let (prefix, shorts, suffix) = unsafe { self.align_to_mut::>() }; + debug_assert!(prefix.is_empty() && suffix.is_empty() && shorts.len() == 1); + &mut shorts[0] + } +} + +// CONST INDEX MAP +// ================================================================================================ + +/// Generates an array `[0, 1, 2, ..., N-1]` at compile time. +pub const fn indices_arr() -> [usize; N] { + let mut arr = [0; N]; + let mut i = 0; + while i < N { + arr[i] = i; + i += 1; + } + arr +} + +/// Number of columns in the main trace (71), derived from the struct layout. +pub const NUM_MAIN_COLS: usize = size_of::>(); + +/// Compile-time index map: each field holds its column index. +/// +/// Example: `MAIN_COL_MAP.decoder.addr == 6`, `MAIN_COL_MAP.stack.top[0] == 30`. +#[allow(dead_code)] +pub const MAIN_COL_MAP: MainCols = { + assert!(NUM_MAIN_COLS == TRACE_WIDTH); + unsafe { core::mem::transmute(indices_arr::()) } +}; + +// AUXILIARY TRACE COLUMN STRUCT +// ================================================================================================ + +/// Column layout of the auxiliary execution trace (8 columns). +#[repr(C)] +pub struct AuxCols { + /// Decoder: block stack table running product. + pub p1_block_stack: T, + /// Decoder: block hash table running product. + pub p2_block_hash: T, + /// Decoder: op group table running product. + pub p3_op_group: T, + /// Stack overflow running product. + pub stack_overflow: T, + /// Range checker LogUp sum. + pub range_check: T, + /// Hash-kernel virtual table bus. + pub hash_kernel_vtable: T, + /// Chiplets bus running product. + pub chiplets_bus: T, + /// ACE wiring LogUp sum. + pub ace_wiring: T, +} + +/// Number of columns in the auxiliary trace (8), derived from the struct layout. +pub const NUM_AUX_COLS: usize = size_of::>(); + +/// Compile-time index map for auxiliary columns. +#[allow(dead_code)] +pub const AUX_COL_MAP: AuxCols = { + assert!(NUM_AUX_COLS == AUX_TRACE_WIDTH); + unsafe { core::mem::transmute(indices_arr::()) } +}; + +// COLUMN COUNTS +// ================================================================================================ + +pub const NUM_SYSTEM_COLS: usize = size_of::>(); +pub const NUM_DECODER_COLS: usize = size_of::>(); +pub const NUM_STACK_COLS: usize = size_of::>(); +pub const NUM_RANGE_COLS: usize = size_of::>(); +pub const NUM_BITWISE_COLS: usize = size_of::>(); +pub const NUM_MEMORY_COLS: usize = size_of::>(); +pub const NUM_ACE_COLS: usize = size_of::>(); +pub const NUM_ACE_READ_COLS: usize = size_of::>(); +pub const NUM_ACE_EVAL_COLS: usize = size_of::>(); +pub const NUM_KERNEL_ROM_COLS: usize = size_of::>(); + +const _: () = assert!(NUM_MAIN_COLS == TRACE_WIDTH); +const _: () = assert!(NUM_AUX_COLS == AUX_TRACE_WIDTH); +const _: () = assert!(NUM_SYSTEM_COLS == 6); +const _: () = assert!(NUM_DECODER_COLS == 24); +const _: () = assert!(NUM_STACK_COLS == 19); +const _: () = assert!(NUM_RANGE_COLS == 2); +const _: () = assert!(NUM_BITWISE_COLS == 13); +const _: () = assert!(NUM_MEMORY_COLS == 15); +const _: () = assert!(NUM_ACE_COLS == 16); +const _: () = assert!(NUM_ACE_READ_COLS == 4); +const _: () = assert!(NUM_ACE_EVAL_COLS == 4); +const _: () = assert!(NUM_KERNEL_ROM_COLS == 5); + +// TESTS +// ================================================================================================ + +#[cfg(test)] +mod tests { + use super::*; + use crate::trace::{ + ACE_CHIPLET_WIRING_BUS_OFFSET, CHIPLETS_BUS_AUX_TRACE_OFFSET, CHIPLETS_OFFSET, CLK_COL_IDX, + CTX_COL_IDX, DECODER_AUX_TRACE_OFFSET, DECODER_TRACE_OFFSET, FN_HASH_OFFSET, + HASH_KERNEL_VTABLE_AUX_TRACE_OFFSET, RANGE_CHECK_AUX_TRACE_OFFSET, STACK_AUX_TRACE_OFFSET, + STACK_TRACE_OFFSET, decoder, range, stack, + }; + + // --- Main trace column map vs legacy constants ----------------------------------------------- + + #[test] + fn col_map_system() { + assert_eq!(MAIN_COL_MAP.system.clk, CLK_COL_IDX); + assert_eq!(MAIN_COL_MAP.system.ctx, CTX_COL_IDX); + assert_eq!(MAIN_COL_MAP.system.fn_hash[0], FN_HASH_OFFSET); + assert_eq!(MAIN_COL_MAP.system.fn_hash[3], FN_HASH_OFFSET + 3); + } + + #[test] + fn col_map_decoder() { + assert_eq!(MAIN_COL_MAP.decoder.addr, DECODER_TRACE_OFFSET + decoder::ADDR_COL_IDX); + assert_eq!(MAIN_COL_MAP.decoder.op_bits[0], DECODER_TRACE_OFFSET + decoder::OP_BITS_OFFSET); + assert_eq!( + MAIN_COL_MAP.decoder.op_bits[6], + DECODER_TRACE_OFFSET + decoder::OP_BITS_OFFSET + 6 + ); + assert_eq!( + MAIN_COL_MAP.decoder.hasher_state[0], + DECODER_TRACE_OFFSET + decoder::HASHER_STATE_OFFSET + ); + assert_eq!(MAIN_COL_MAP.decoder.in_span, DECODER_TRACE_OFFSET + decoder::IN_SPAN_COL_IDX); + assert_eq!( + MAIN_COL_MAP.decoder.group_count, + DECODER_TRACE_OFFSET + decoder::GROUP_COUNT_COL_IDX + ); + assert_eq!(MAIN_COL_MAP.decoder.op_index, DECODER_TRACE_OFFSET + decoder::OP_INDEX_COL_IDX); + assert_eq!( + MAIN_COL_MAP.decoder.batch_flags[0], + DECODER_TRACE_OFFSET + decoder::OP_BATCH_FLAGS_OFFSET + ); + assert_eq!( + MAIN_COL_MAP.decoder.extra[0], + DECODER_TRACE_OFFSET + decoder::OP_BITS_EXTRA_COLS_OFFSET + ); + } + + #[test] + fn col_map_stack() { + assert_eq!(MAIN_COL_MAP.stack.top[0], STACK_TRACE_OFFSET + stack::STACK_TOP_OFFSET); + assert_eq!(MAIN_COL_MAP.stack.top[15], STACK_TRACE_OFFSET + 15); + assert_eq!(MAIN_COL_MAP.stack.b0, STACK_TRACE_OFFSET + stack::B0_COL_IDX); + assert_eq!(MAIN_COL_MAP.stack.b1, STACK_TRACE_OFFSET + stack::B1_COL_IDX); + assert_eq!(MAIN_COL_MAP.stack.h0, STACK_TRACE_OFFSET + stack::H0_COL_IDX); + } + + #[test] + fn col_map_range() { + assert_eq!(MAIN_COL_MAP.range.multiplicity, range::M_COL_IDX); + assert_eq!(MAIN_COL_MAP.range.value, range::V_COL_IDX); + } + + #[test] + fn col_map_chiplets() { + assert_eq!(MAIN_COL_MAP.chiplets[0], CHIPLETS_OFFSET); + assert_eq!(MAIN_COL_MAP.chiplets[19], CHIPLETS_OFFSET + 19); + // s_perm is a separate field after chiplets[0..20] + assert_eq!(MAIN_COL_MAP.s_perm, CHIPLETS_OFFSET + 20); + } + + // --- Auxiliary trace column map vs legacy constants + // ------------------------------------------- + + #[test] + fn aux_col_map() { + assert_eq!(AUX_COL_MAP.p1_block_stack, DECODER_AUX_TRACE_OFFSET); + assert_eq!(AUX_COL_MAP.p2_block_hash, DECODER_AUX_TRACE_OFFSET + 1); + assert_eq!(AUX_COL_MAP.p3_op_group, DECODER_AUX_TRACE_OFFSET + 2); + assert_eq!(AUX_COL_MAP.stack_overflow, STACK_AUX_TRACE_OFFSET); + assert_eq!(AUX_COL_MAP.range_check, RANGE_CHECK_AUX_TRACE_OFFSET); + assert_eq!(AUX_COL_MAP.hash_kernel_vtable, HASH_KERNEL_VTABLE_AUX_TRACE_OFFSET); + assert_eq!(AUX_COL_MAP.chiplets_bus, CHIPLETS_BUS_AUX_TRACE_OFFSET); + assert_eq!(AUX_COL_MAP.ace_wiring, ACE_CHIPLET_WIRING_BUS_OFFSET); + } +} diff --git a/air/src/constraints/constants.rs b/air/src/constraints/constants.rs new file mode 100644 index 0000000000..3a0cebef76 --- /dev/null +++ b/air/src/constraints/constants.rs @@ -0,0 +1,29 @@ +//! Shared field constants for constraint code. + +use miden_core::field::PrimeCharacteristicRing; + +use crate::Felt; + +pub const F_1: Felt = Felt::ONE; +#[allow(dead_code)] +pub const F_NEG_1: Felt = Felt::NEG_ONE; +pub const F_2: Felt = Felt::TWO; +pub const F_3: Felt = Felt::new(3); +pub const F_4: Felt = Felt::new(4); +pub const F_5: Felt = Felt::new(5); +pub const F_6: Felt = Felt::new(6); +pub const F_7: Felt = Felt::new(7); +pub const F_8: Felt = Felt::new(8); +pub const F_9: Felt = Felt::new(9); +pub const F_16: Felt = Felt::new(16); +pub const F_27: Felt = Felt::new(27); +pub const F_81: Felt = Felt::new(81); +pub const F_128: Felt = Felt::new(128); +pub const F_243: Felt = Felt::new(243); +pub const F_729: Felt = Felt::new(729); +pub const F_2187: Felt = Felt::new(2187); +pub const TWO_POW_16: Felt = Felt::new(1 << 16); +pub const TWO_POW_16_MINUS_1: Felt = Felt::new(65535); +pub const TWO_POW_32: Felt = Felt::new(1 << 32); +pub const TWO_POW_32_MINUS_1: Felt = Felt::new((1u64 << 32) - 1); +pub const TWO_POW_48: Felt = Felt::new(1 << 48); diff --git a/air/src/constraints/decoder/bus.rs b/air/src/constraints/decoder/bus.rs index 84806c08e9..b51cf3d86b 100644 --- a/air/src/constraints/decoder/bus.rs +++ b/air/src/constraints/decoder/bus.rs @@ -23,50 +23,39 @@ //! - Processor tables: `processor/src/decoder/aux_trace/block_stack_table.rs` (p1), //! `processor/src/decoder/aux_trace/block_hash_table.rs` (p2), //! `processor/src/decoder/aux_trace/op_group_table.rs` (p3). -//! - air‑script constraints: `constraints/decoder.air`. use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::{ExtensionBuilder, LiftedAirBuilder, WindowAccess}; +use miden_crypto::stark::air::{ExtensionBuilder, WindowAccess}; use crate::{ - MainTraceRow, - constraints::{ - bus::indices::P1_BLOCK_STACK, - op_flags::OpFlags, - tagging::{TaggingAirBuilderExt, ids::TAG_DECODER_BUS_BASE}, + Felt, MainCols, MidenAirBuilder, + constraints::{bus::indices::P1_BLOCK_STACK, constants::*, op_flags::OpFlags, utils::BoolNot}, + trace::{ + Challenges, + bus_types::{BLOCK_HASH_TABLE, BLOCK_STACK_TABLE, OP_GROUP_TABLE}, }, - trace::Challenges, }; // CONSTANTS // ================================================================================================ -/// Base ID for decoder bus constraints. -const DECODER_BUS_BASE_ID: usize = TAG_DECODER_BUS_BASE; - -/// Decoder bus constraint namespaces in assertion order. -const DECODER_BUS_NAMES: [&str; 3] = [ - "decoder.bus.p1.transition", - "decoder.bus.p2.transition", - "decoder.bus.p3.transition", -]; - /// Weights for opcode bit decoding: b0 + 2*b1 + ... + 64*b6. const OP_BIT_WEIGHTS: [u16; 7] = [1, 2, 4, 8, 16, 32, 64]; /// Encoders for block stack table (p1) messages. -struct BlockStackEncoders<'a, AB: LiftedAirBuilder> { +struct BlockStackEncoders<'a, AB: MidenAirBuilder> { challenges: &'a Challenges, } -impl<'a, AB: LiftedAirBuilder> BlockStackEncoders<'a, AB> { +impl<'a, AB: MidenAirBuilder> BlockStackEncoders<'a, AB> { fn new(challenges: &'a Challenges) -> Self { Self { challenges } } /// Encodes `[block_id, parent_id, is_loop]`. fn simple(&self, block_id: &AB::Expr, parent_id: &AB::Expr, is_loop: &AB::Expr) -> AB::ExprEF { - self.challenges.encode([block_id.clone(), parent_id.clone(), is_loop.clone()]) + self.challenges + .encode(BLOCK_STACK_TABLE, [block_id.clone(), parent_id.clone(), is_loop.clone()]) } /// Encodes `[block_id, parent_id, is_loop, ctx, depth, overflow, fn_hash[0..4]]`. @@ -80,27 +69,30 @@ impl<'a, AB: LiftedAirBuilder> BlockStackEncoders<'a, AB> { overflow: &AB::Expr, fh: &[AB::Expr; 4], ) -> AB::ExprEF { - self.challenges.encode([ - block_id.clone(), - parent_id.clone(), - is_loop.clone(), - ctx.clone(), - depth.clone(), - overflow.clone(), - fh[0].clone(), - fh[1].clone(), - fh[2].clone(), - fh[3].clone(), - ]) + self.challenges.encode( + BLOCK_STACK_TABLE, + [ + block_id.clone(), + parent_id.clone(), + is_loop.clone(), + ctx.clone(), + depth.clone(), + overflow.clone(), + fh[0].clone(), + fh[1].clone(), + fh[2].clone(), + fh[3].clone(), + ], + ) } } /// Encoder for block hash table (p2) messages. -struct BlockHashEncoder<'a, AB: LiftedAirBuilder> { +struct BlockHashEncoder<'a, AB: MidenAirBuilder> { challenges: &'a Challenges, } -impl<'a, AB: LiftedAirBuilder> BlockHashEncoder<'a, AB> { +impl<'a, AB: MidenAirBuilder> BlockHashEncoder<'a, AB> { fn new(challenges: &'a Challenges) -> Self { Self { challenges } } @@ -113,112 +105,56 @@ impl<'a, AB: LiftedAirBuilder> BlockHashEncoder<'a, AB> { first_child: &AB::Expr, loop_body: &AB::Expr, ) -> AB::ExprEF { - self.challenges.encode([ - parent.clone(), - hash[0].clone(), - hash[1].clone(), - hash[2].clone(), - hash[3].clone(), - first_child.clone(), - loop_body.clone(), - ]) + self.challenges.encode( + BLOCK_HASH_TABLE, + [ + parent.clone(), + hash[0].clone(), + hash[1].clone(), + hash[2].clone(), + hash[3].clone(), + first_child.clone(), + loop_body.clone(), + ], + ) } } /// Encoder for op group table (p3) messages. -struct OpGroupEncoder<'a, AB: LiftedAirBuilder> { +struct OpGroupEncoder<'a, AB: MidenAirBuilder> { challenges: &'a Challenges, } -impl<'a, AB: LiftedAirBuilder> OpGroupEncoder<'a, AB> { +impl<'a, AB: MidenAirBuilder> OpGroupEncoder<'a, AB> { fn new(challenges: &'a Challenges) -> Self { Self { challenges } } /// Encodes `[block_id, group_count, op_value]`. fn encode(&self, block_id: &AB::Expr, group_count: &AB::Expr, value: &AB::Expr) -> AB::ExprEF { - self.challenges.encode([block_id.clone(), group_count.clone(), value.clone()]) + self.challenges + .encode(OP_GROUP_TABLE, [block_id.clone(), group_count.clone(), value.clone()]) } } -/// Decoder column indices (relative to decoder trace). -mod decoder_cols { - /// Block address column. - pub const ADDR: usize = 0; - /// Hasher state offset within decoder trace. - pub const HASHER_STATE_OFFSET: usize = 8; - /// is_loop_flag column (hasher_state[5]). - pub const IS_LOOP_FLAG: usize = HASHER_STATE_OFFSET + 5; - /// is_call_flag column (hasher_state[6]). - pub const IS_CALL_FLAG: usize = HASHER_STATE_OFFSET + 6; - /// is_syscall_flag column (hasher_state[7]). - pub const IS_SYSCALL_FLAG: usize = HASHER_STATE_OFFSET + 7; -} - -/// Stack column indices (relative to stack trace). -mod stack_cols { - /// B0 column - stack depth. - pub const B0: usize = 16; - /// B1 column - overflow address. - pub const B1: usize = 17; -} - -/// Op group table column indices (relative to decoder trace). -mod op_group_cols { - /// HASHER_STATE_RANGE.end (hasher state is 8 columns starting at offset 8). - const HASHER_STATE_END: usize = super::decoder_cols::HASHER_STATE_OFFSET + 8; - - /// is_in_span flag column. - pub const IS_IN_SPAN: usize = HASHER_STATE_END; - - /// Group count column. - pub const GROUP_COUNT: usize = IS_IN_SPAN + 1; - - /// Op index column (not used directly here but defines layout). - const OP_INDEX: usize = GROUP_COUNT + 1; - - /// Batch flag columns (c0, c1, c2). - const BATCH_FLAGS_OFFSET: usize = OP_INDEX + 1; - pub const BATCH_FLAG_0: usize = BATCH_FLAGS_OFFSET; - pub const BATCH_FLAG_1: usize = BATCH_FLAGS_OFFSET + 1; - pub const BATCH_FLAG_2: usize = BATCH_FLAGS_OFFSET + 2; -} - -// HELPERS -// ================================================================================================ - -/// Decodes opcode bits from a trace row into an opcode value. -fn opcode_from_row(row: &MainTraceRow) -> AB::Expr -where - AB: LiftedAirBuilder, -{ - OP_BIT_WEIGHTS.iter().enumerate().fold(AB::Expr::ZERO, |acc, (i, weight)| { - let bit: AB::Expr = row.decoder[1 + i].clone().into(); - acc + bit * AB::Expr::from_u16(*weight) - }) -} - // ENTRY POINTS // ================================================================================================ /// Enforces all decoder bus constraints (p1, p2, p3). pub fn enforce_bus( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, challenges: &Challenges, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { enforce_block_stack_table_constraint(builder, local, next, op_flags, challenges); enforce_block_hash_table_constraint(builder, local, next, op_flags, challenges); enforce_op_group_table_constraint(builder, local, next, op_flags, challenges); } -// CONSTRAINT HELPERS -// ================================================================================================ - // BLOCK STACK TABLE (p1) // ================================================================================================ @@ -253,12 +189,12 @@ pub fn enforce_bus( /// - CALL/SYSCALL/DYNCALL: 11 elements with context `[..., ctx, fmp, b0, b1, fn_hash[0..4]]` pub fn enforce_block_stack_table_constraint( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, challenges: &Challenges, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { // Auxiliary trace must be present @@ -270,58 +206,50 @@ pub fn enforce_block_stack_table_constraint( (aux_local[P1_BLOCK_STACK], aux_next[P1_BLOCK_STACK]) }; - let one = AB::Expr::ONE; - let zero = AB::Expr::ZERO; - let one_ef = AB::ExprEF::ONE; - - // Helper to convert trace value to base field expression - let to_expr = |v: AB::Var| -> AB::Expr { v.into() }; - // ========================================================================= // TRACE VALUE EXTRACTION // ========================================================================= // Block addresses - let addr_local = to_expr(local.decoder[decoder_cols::ADDR].clone()); - let addr_next = to_expr(next.decoder[decoder_cols::ADDR].clone()); + let addr_local: AB::Expr = local.decoder.addr.into(); + let addr_next: AB::Expr = next.decoder.addr.into(); // Hasher state element 1 (for RESPAN parent_id) - let h1_next = to_expr(next.decoder[decoder_cols::HASHER_STATE_OFFSET + 1].clone()); + let h1_next: AB::Expr = next.decoder.hasher_state[1].into(); // Stack top (for LOOP is_loop condition) - let s0 = to_expr(local.stack[0].clone()); + let s0: AB::Expr = local.stack.get(0).into(); // Context info for CALL/SYSCALL/DYNCALL insertions (from current row) - let ctx_local = to_expr(local.ctx.clone()); - let b0_local = to_expr(local.stack[stack_cols::B0].clone()); - let b1_local = to_expr(local.stack[stack_cols::B1].clone()); + let ctx_local: AB::Expr = local.system.ctx.into(); + let b0_local: AB::Expr = local.stack.b0.into(); + let b1_local: AB::Expr = local.stack.b1.into(); let fn_hash_local: [AB::Expr; 4] = [ - to_expr(local.fn_hash[0].clone()), - to_expr(local.fn_hash[1].clone()), - to_expr(local.fn_hash[2].clone()), - to_expr(local.fn_hash[3].clone()), + local.system.fn_hash[0].into(), + local.system.fn_hash[1].into(), + local.system.fn_hash[2].into(), + local.system.fn_hash[3].into(), ]; // Hasher state for DYNCALL (h4, h5 contain post-shift stack state) - let h4_local = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 4].clone()); - let h5_local = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 5].clone()); + let h4_local: AB::Expr = local.decoder.hasher_state[4].into(); + let h5_local: AB::Expr = local.decoder.hasher_state[5].into(); // Flags for END context detection - let is_loop_flag = to_expr(local.decoder[decoder_cols::IS_LOOP_FLAG].clone()); - let is_call_flag = to_expr(local.decoder[decoder_cols::IS_CALL_FLAG].clone()); - let is_syscall_flag = to_expr(local.decoder[decoder_cols::IS_SYSCALL_FLAG].clone()); + let is_loop_flag: AB::Expr = local.decoder.hasher_state[5].into(); + let is_call_flag: AB::Expr = local.decoder.hasher_state[6].into(); + let is_syscall_flag: AB::Expr = local.decoder.hasher_state[7].into(); // Context info for END after CALL/SYSCALL (from next row) - let ctx_next = to_expr(next.ctx.clone()); - let b0_next = to_expr(next.stack[stack_cols::B0].clone()); - let b1_next = to_expr(next.stack[stack_cols::B1].clone()); + let ctx_next: AB::Expr = next.system.ctx.into(); + let b0_next: AB::Expr = next.stack.b0.into(); + let b1_next: AB::Expr = next.stack.b1.into(); let fn_hash_next: [AB::Expr; 4] = [ - to_expr(next.fn_hash[0].clone()), - to_expr(next.fn_hash[1].clone()), - to_expr(next.fn_hash[2].clone()), - to_expr(next.fn_hash[3].clone()), + next.system.fn_hash[0].into(), + next.system.fn_hash[1].into(), + next.system.fn_hash[2].into(), + next.system.fn_hash[3].into(), ]; - // ========================================================================= // MESSAGE BUILDERS // ========================================================================= @@ -345,7 +273,7 @@ pub fn enforce_block_stack_table_constraint( let is_end = op_flags.end(); // JOIN/SPLIT/SPAN/DYN: insert(addr', addr, 0, 0, 0, 0, 0, 0, 0, 0) - let msg_simple = encoders.simple(&addr_next, &addr_local, &zero); + let msg_simple = encoders.simple(&addr_next, &addr_local, &AB::Expr::ZERO); let v_join = msg_simple.clone() * is_join.clone(); let v_split = msg_simple.clone() * is_split.clone(); let v_span = msg_simple.clone() * is_span.clone(); @@ -356,14 +284,14 @@ pub fn enforce_block_stack_table_constraint( let v_loop = msg_loop * is_loop.clone(); // RESPAN: insert(addr', h1', 0, 0, 0, 0, 0, 0, 0, 0) - let msg_respan_insert = encoders.simple(&addr_next, &h1_next, &zero); + let msg_respan_insert = encoders.simple(&addr_next, &h1_next, &AB::Expr::ZERO); let v_respan = msg_respan_insert * is_respan.clone(); // CALL/SYSCALL: insert(addr', addr, 0, ctx, fmp, b0, b1, fn_hash[0..4]) let msg_call = encoders.full( &addr_next, &addr_local, - &zero, + &AB::Expr::ZERO, &ctx_local, &b0_local, &b1_local, @@ -376,7 +304,7 @@ pub fn enforce_block_stack_table_constraint( let msg_dyncall = encoders.full( &addr_next, &addr_local, - &zero, + &AB::Expr::ZERO, &ctx_local, &h4_local, &h5_local, @@ -400,18 +328,18 @@ pub fn enforce_block_stack_table_constraint( v_join + v_split + v_span + v_dyn + v_loop + v_respan + v_call + v_syscall + v_dyncall; // Response side: insertion_sum + (1 - insert_flag_sum) - let response = insertion_sum + (one_ef.clone() - insert_flag_sum); + let response = insertion_sum + insert_flag_sum.not(); // ========================================================================= // REMOVAL CONTRIBUTIONS (u_xxx = f_xxx * message) // ========================================================================= // RESPAN removal: remove(addr, h1', 0, 0, 0, 0, 0, 0, 0, 0) - let msg_respan_remove = encoders.simple(&addr_local, &h1_next, &zero); + let msg_respan_remove = encoders.simple(&addr_local, &h1_next, &AB::Expr::ZERO); let u_respan = msg_respan_remove * is_respan.clone(); // END for simple blocks: remove(addr, addr', is_loop_flag, 0, 0, 0, 0, 0, 0, 0) - let is_simple_end = one.clone() - is_call_flag.clone() - is_syscall_flag.clone(); + let is_simple_end = AB::Expr::ONE - is_call_flag.clone() - is_syscall_flag.clone(); let msg_end_simple = encoders.simple(&addr_local, &addr_next, &is_loop_flag); let end_simple_gate = is_end.clone() * is_simple_end; let u_end_simple = msg_end_simple * end_simple_gate; @@ -419,7 +347,7 @@ pub fn enforce_block_stack_table_constraint( // END for CALL/SYSCALL: remove(addr, addr', is_loop_flag, ctx', b0', b1', fn_hash'[0..4]) // Note: The is_loop value is the is_loop_flag from the current row (same as simple END) // Context values come from the next row's dedicated columns (not hasher state) - let is_call_or_syscall = is_call_flag.clone() + is_syscall_flag.clone(); + let is_call_or_syscall = is_call_flag + is_syscall_flag; let msg_end_call = encoders.full( &addr_local, &addr_next, @@ -442,7 +370,7 @@ pub fn enforce_block_stack_table_constraint( let removal_sum = u_end + u_respan; // Request side: removal_sum + (1 - remove_flag_sum) - let request = removal_sum + (one_ef.clone() - remove_flag_sum); + let request = removal_sum + remove_flag_sum.not(); // ========================================================================= // RUNNING PRODUCT CONSTRAINT @@ -452,9 +380,7 @@ pub fn enforce_block_stack_table_constraint( let lhs: AB::ExprEF = p1_next.into() * request; let rhs: AB::ExprEF = p1_local.into() * response; - builder.tagged(DECODER_BUS_BASE_ID, DECODER_BUS_NAMES[0], |builder| { - builder.when_transition().assert_zero_ext(lhs - rhs); - }); + builder.when_transition().assert_eq_ext(lhs, rhs); } // BLOCK HASH TABLE (p2) @@ -497,12 +423,12 @@ pub fn enforce_block_stack_table_constraint( /// ``` pub fn enforce_block_hash_table_constraint( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, challenges: &Challenges, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { // Auxiliary trace must be present @@ -517,44 +443,36 @@ pub fn enforce_block_hash_table_constraint( ) }; - let one = AB::Expr::ONE; - let zero = AB::Expr::ZERO; - let one_ef = AB::ExprEF::ONE; - - // Helper to convert trace value to base field expression - let to_expr = |v: AB::Var| -> AB::Expr { v.into() }; - // ========================================================================= // TRACE VALUE EXTRACTION // ========================================================================= // Parent block ID (next row's address for all insertions) - let parent_id = to_expr(next.decoder[decoder_cols::ADDR].clone()); - + let parent_id: AB::Expr = next.decoder.addr.into(); // Hasher state for child hashes // First half: h[0..4] - let h0 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET].clone()); - let h1 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 1].clone()); - let h2 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 2].clone()); - let h3 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 3].clone()); + let h0: AB::Expr = local.decoder.hasher_state[0].into(); + let h1: AB::Expr = local.decoder.hasher_state[1].into(); + let h2: AB::Expr = local.decoder.hasher_state[2].into(); + let h3: AB::Expr = local.decoder.hasher_state[3].into(); // Second half: h[4..8] - let h4 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 4].clone()); - let h5 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 5].clone()); - let h6 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 6].clone()); - let h7 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 7].clone()); + let h4: AB::Expr = local.decoder.hasher_state[4].into(); + let h5: AB::Expr = local.decoder.hasher_state[5].into(); + let h6: AB::Expr = local.decoder.hasher_state[6].into(); + let h7: AB::Expr = local.decoder.hasher_state[7].into(); // Stack top (for SPLIT and LOOP conditions) - let s0: AB::Expr = to_expr(local.stack[0].clone()); + let s0: AB::Expr = local.stack.get(0).into(); // For END: block hash comes from current row's hasher state first half - let end_parent_id = to_expr(next.decoder[decoder_cols::ADDR].clone()); + let end_parent_id = parent_id.clone(); let end_hash_0 = h0.clone(); let end_hash_1 = h1.clone(); let end_hash_2 = h2.clone(); let end_hash_3 = h3.clone(); // is_loop_body flag for END (stored at hasher_state[4] = IS_LOOP_BODY_FLAG) - let is_loop_body_flag = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 4].clone()); + let is_loop_body_flag: AB::Expr = local.decoder.hasher_state[4].into(); // is_first_child detection for END: // A block is first_child if the NEXT row's opcode is NOT (END, REPEAT, or HALT). @@ -563,17 +481,13 @@ pub fn enforce_block_hash_table_constraint( // // Note: END (112), REPEAT (116), HALT (124) are all degree-4 operations, // so is_first_child has degree 4. - let accessor_next = - crate::constraints::op_flags::ExprDecoderAccess::::new(next); - let op_flags_next = OpFlags::new(accessor_next); - - let is_end_next = op_flags_next.end(); - let is_repeat_next = op_flags_next.repeat(); - let is_halt_next = op_flags_next.halt(); + let is_end_next = op_flags.end_next(); + let is_repeat_next = op_flags.repeat_next(); + let is_halt_next = op_flags.halt_next(); // is_first_child = 1 when next op is NOT end/repeat/halt let is_not_first_child = is_end_next + is_repeat_next + is_halt_next; - let is_first_child = one.clone() - is_not_first_child; + let is_first_child = is_not_first_child.not(); // ========================================================================= // MESSAGE BUILDERS @@ -601,32 +515,42 @@ pub fn enforce_block_hash_table_constraint( // JOIN: Insert both children // Left child (is_first_child=1): hash from first half - let msg_join_left = encoder.encode(&parent_id, [&h0, &h1, &h2, &h3], &one, &zero); + let msg_join_left = + encoder.encode(&parent_id, [&h0, &h1, &h2, &h3], &AB::Expr::ONE, &AB::Expr::ZERO); // Right child (is_first_child=0): hash from second half - let msg_join_right = encoder.encode(&parent_id, [&h4, &h5, &h6, &h7], &zero, &zero); + let msg_join_right = + encoder.encode(&parent_id, [&h4, &h5, &h6, &h7], &AB::Expr::ZERO, &AB::Expr::ZERO); let v_join = (msg_join_left * msg_join_right) * is_join.clone(); // SPLIT: Insert selected child based on s0 // If s0=1: left child (h0-h3), else right child (h4-h7) - let split_h0 = s0.clone() * h0.clone() + (one.clone() - s0.clone()) * h4.clone(); - let split_h1 = s0.clone() * h1.clone() + (one.clone() - s0.clone()) * h5.clone(); - let split_h2 = s0.clone() * h2.clone() + (one.clone() - s0.clone()) * h6.clone(); - let split_h3 = s0.clone() * h3.clone() + (one.clone() - s0.clone()) * h7.clone(); - let msg_split = - encoder.encode(&parent_id, [&split_h0, &split_h1, &split_h2, &split_h3], &zero, &zero); + let not_s0 = s0.not(); + let split_h0 = s0.clone() * h0.clone() + not_s0.clone() * h4.clone(); + let split_h1 = s0.clone() * h1.clone() + not_s0.clone() * h5.clone(); + let split_h2 = s0.clone() * h2.clone() + not_s0.clone() * h6.clone(); + let split_h3 = s0.clone() * h3.clone() + not_s0 * h7.clone(); + let msg_split = encoder.encode( + &parent_id, + [&split_h0, &split_h1, &split_h2, &split_h3], + &AB::Expr::ZERO, + &AB::Expr::ZERO, + ); let v_split = msg_split * is_split.clone(); // LOOP: Conditionally insert body if s0=1 - let msg_loop = encoder.encode(&parent_id, [&h0, &h1, &h2, &h3], &zero, &one); + let msg_loop = + encoder.encode(&parent_id, [&h0, &h1, &h2, &h3], &AB::Expr::ZERO, &AB::Expr::ONE); // When s0=1: insert msg_loop; when s0=0: multiply by 1 (no insertion) - let v_loop = (msg_loop * s0.clone() + (one_ef.clone() - s0.clone())) * is_loop.clone(); + let v_loop = (msg_loop * s0.clone() + (AB::ExprEF::ONE - s0.clone())) * is_loop.clone(); // REPEAT: Insert loop body - let msg_repeat = encoder.encode(&parent_id, [&h0, &h1, &h2, &h3], &zero, &one); + let msg_repeat = + encoder.encode(&parent_id, [&h0, &h1, &h2, &h3], &AB::Expr::ZERO, &AB::Expr::ONE); let v_repeat = msg_repeat * is_repeat.clone(); // DYN/DYNCALL/CALL/SYSCALL: Insert child hash from first half - let msg_call_like = encoder.encode(&parent_id, [&h0, &h1, &h2, &h3], &zero, &zero); + let msg_call_like = + encoder.encode(&parent_id, [&h0, &h1, &h2, &h3], &AB::Expr::ZERO, &AB::Expr::ZERO); let v_dyn = msg_call_like.clone() * is_dyn.clone(); let v_dyncall = msg_call_like.clone() * is_dyncall.clone(); let v_call = msg_call_like.clone() * is_call.clone(); @@ -651,7 +575,7 @@ pub fn enforce_block_hash_table_constraint( + v_dyncall + v_call + v_syscall - + (one_ef.clone() - insert_flag_sum); + + insert_flag_sum.not(); // ========================================================================= // REQUEST CONTRIBUTIONS (removals) @@ -668,7 +592,7 @@ pub fn enforce_block_hash_table_constraint( let u_end = msg_end * is_end.clone(); // Request side - let request = u_end + (one_ef.clone() - is_end); + let request = u_end + is_end.not(); // ========================================================================= // RUNNING PRODUCT CONSTRAINT @@ -678,9 +602,7 @@ pub fn enforce_block_hash_table_constraint( let lhs: AB::ExprEF = p2_next.into() * request; let rhs: AB::ExprEF = p2_local.into() * response; - builder.tagged(DECODER_BUS_BASE_ID + 1, DECODER_BUS_NAMES[1], |builder| { - builder.when_transition().assert_zero_ext(lhs - rhs); - }); + builder.when_transition().assert_eq_ext(lhs, rhs); } // OP GROUP TABLE (p3) @@ -732,12 +654,12 @@ pub fn enforce_block_hash_table_constraint( /// - Total constraint: degree 9 pub fn enforce_op_group_table_constraint( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, challenges: &Challenges, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { // Auxiliary trace must be present @@ -752,44 +674,38 @@ pub fn enforce_op_group_table_constraint( ) }; - let one = AB::Expr::ONE; - let one_ef = AB::ExprEF::ONE; - - // Helper to convert trace value to base field expression - let to_expr = |v: AB::Var| -> AB::Expr { v.into() }; - // ========================================================================= // TRACE VALUE EXTRACTION // ========================================================================= // Block ID (next row's address for insertions, current for removals) - let block_id_insert = to_expr(next.decoder[decoder_cols::ADDR].clone()); - let block_id_remove = to_expr(local.decoder[decoder_cols::ADDR].clone()); + let block_id_insert: AB::Expr = next.decoder.addr.into(); + let block_id_remove: AB::Expr = local.decoder.addr.into(); // Group count - let gc = to_expr(local.decoder[op_group_cols::GROUP_COUNT].clone()); - let gc_next = to_expr(next.decoder[op_group_cols::GROUP_COUNT].clone()); + let gc: AB::Expr = local.decoder.group_count.into(); + let gc_next: AB::Expr = next.decoder.group_count.into(); // Hasher state for group values (h1-h7, h0 is decoded immediately) - let h1 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 1].clone()); - let h2 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 2].clone()); - let h3 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 3].clone()); - let h4 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 4].clone()); - let h5 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 5].clone()); - let h6 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 6].clone()); - let h7 = to_expr(local.decoder[decoder_cols::HASHER_STATE_OFFSET + 7].clone()); + let h1: AB::Expr = local.decoder.hasher_state[1].into(); + let h2: AB::Expr = local.decoder.hasher_state[2].into(); + let h3: AB::Expr = local.decoder.hasher_state[3].into(); + let h4: AB::Expr = local.decoder.hasher_state[4].into(); + let h5: AB::Expr = local.decoder.hasher_state[5].into(); + let h6: AB::Expr = local.decoder.hasher_state[6].into(); + let h7: AB::Expr = local.decoder.hasher_state[7].into(); // Batch flag columns (c0, c1, c2) - let c0 = to_expr(local.decoder[op_group_cols::BATCH_FLAG_0].clone()); - let c1 = to_expr(local.decoder[op_group_cols::BATCH_FLAG_1].clone()); - let c2 = to_expr(local.decoder[op_group_cols::BATCH_FLAG_2].clone()); + let c0: AB::Expr = local.decoder.batch_flags[0].into(); + let c1: AB::Expr = local.decoder.batch_flags[1].into(); + let c2: AB::Expr = local.decoder.batch_flags[2].into(); // For removal: h0' and s0' from next row - let h0_next = to_expr(next.decoder[decoder_cols::HASHER_STATE_OFFSET].clone()); - let s0_next = to_expr(next.stack[0].clone()); + let h0_next: AB::Expr = next.decoder.hasher_state[0].into(); + let s0_next: AB::Expr = next.stack.get(0).into(); // is_in_span flag (sp) - let sp = to_expr(local.decoder[op_group_cols::IS_IN_SPAN].clone()); + let sp = local.decoder.in_span; // ========================================================================= // MESSAGE BUILDER @@ -813,34 +729,22 @@ pub fn enforce_op_group_table_constraint( // OP_BATCH_2_GROUPS = [0, 0, 1] -> f_g2 = (1-c0) * (1-c1) * c2 // OP_BATCH_1_GROUPS = [0, 1, 1] -> f_g1 = (1-c0) * c1 * c2 let f_g8 = c0.clone(); - let f_g4 = (one.clone() - c0.clone()) * c1.clone() * (one.clone() - c2.clone()); - let f_g2 = (one.clone() - c0.clone()) * (one.clone() - c1.clone()) * c2.clone(); - - // ========================================================================= - // CONSTANTS - // ========================================================================= - - // Build base field constants. - let two = AB::Expr::from_u16(2); - let three = AB::Expr::from_u16(3); - let four = AB::Expr::from_u16(4); - let five = AB::Expr::from_u16(5); - let six = AB::Expr::from_u16(6); - let seven = AB::Expr::from_u16(7); - let onetwentyeight = AB::Expr::from_u16(128); + let not_c0 = c0.not(); + let f_g4 = not_c0.clone() * c1.clone() * c2.not(); + let f_g2 = not_c0 * c1.not() * c2.clone(); // ========================================================================= // RESPONSE (insertions during SPAN/RESPAN) // ========================================================================= // Build messages for each group: v_i = msg(block_id', gc - i, h_i) - let v_1 = encoder.encode(&block_id_insert, &(gc.clone() - one.clone()), &h1); - let v_2 = encoder.encode(&block_id_insert, &(gc.clone() - two.clone()), &h2); - let v_3 = encoder.encode(&block_id_insert, &(gc.clone() - three.clone()), &h3); - let v_4 = encoder.encode(&block_id_insert, &(gc.clone() - four.clone()), &h4); - let v_5 = encoder.encode(&block_id_insert, &(gc.clone() - five.clone()), &h5); - let v_6 = encoder.encode(&block_id_insert, &(gc.clone() - six.clone()), &h6); - let v_7 = encoder.encode(&block_id_insert, &(gc.clone() - seven.clone()), &h7); + let v_1 = encoder.encode(&block_id_insert, &(gc.clone() - F_1), &h1); + let v_2 = encoder.encode(&block_id_insert, &(gc.clone() - F_2), &h2); + let v_3 = encoder.encode(&block_id_insert, &(gc.clone() - F_3), &h3); + let v_4 = encoder.encode(&block_id_insert, &(gc.clone() - F_4), &h4); + let v_5 = encoder.encode(&block_id_insert, &(gc.clone() - F_5), &h5); + let v_6 = encoder.encode(&block_id_insert, &(gc.clone() - F_6), &h6); + let v_7 = encoder.encode(&block_id_insert, &(gc.clone() - F_7), &h7); // Compute products for each batch size let prod_3 = v_1.clone() * v_2.clone() * v_3.clone(); @@ -856,7 +760,7 @@ pub fn enforce_op_group_table_constraint( let response = (v_1.clone() * f_g2.clone()) + (prod_3 * f_g4.clone()) + (prod_7 * f_g8.clone()) - + (one_ef.clone() - (f_g2 + f_g4 + f_g8)); + + (AB::ExprEF::ONE - (f_g2 + f_g4 + f_g8)); // ========================================================================= // REQUEST (removals when group count decrements inside span) @@ -868,21 +772,25 @@ pub fn enforce_op_group_table_constraint( let f_dg = sp * delta_gc; // Compute op_code' from next row's opcode bits (b0' + 2*b1' + ... + 64*b6'). - let op_code_next = opcode_from_row::(next); + let op_code_next = + OP_BIT_WEIGHTS.iter().enumerate().fold(AB::Expr::ZERO, |acc, (i, weight)| { + let bit = next.decoder.op_bits[i]; + acc + bit * Felt::new(*weight as u64) + }); // Removal value formula: // u = (h0' * 128 + op_code') * (1 - is_push) + s0' * is_push // // When PUSH: the immediate value is on the stack (s0') // Otherwise: the group value is h0' * 128 + op_code' - let group_value_non_push = h0_next * onetwentyeight + op_code_next; - let group_value = is_push.clone() * s0_next + (one.clone() - is_push) * group_value_non_push; + let group_value_non_push = h0_next * F_128 + op_code_next; + let group_value = is_push.clone() * s0_next + is_push.not() * group_value_non_push; // Removal message: u = msg(block_id, gc, group_value) let u = encoder.encode(&block_id_remove, &gc, &group_value); // Request formula: f_dg * u + (1 - f_dg) - let request = u * f_dg.clone() + (one_ef.clone() - f_dg); + let request = u * f_dg.clone() + f_dg.not(); // ========================================================================= // RUNNING PRODUCT CONSTRAINT @@ -892,7 +800,5 @@ pub fn enforce_op_group_table_constraint( let lhs: AB::ExprEF = p3_next.into() * request; let rhs: AB::ExprEF = p3_local.into() * response; - builder.tagged(DECODER_BUS_BASE_ID + 2, DECODER_BUS_NAMES[2], |builder| { - builder.when_transition().assert_zero_ext(lhs - rhs); - }); + builder.when_transition().assert_eq_ext(lhs, rhs); } diff --git a/air/src/constraints/decoder/columns.rs b/air/src/constraints/decoder/columns.rs new file mode 100644 index 0000000000..3bb607a577 --- /dev/null +++ b/air/src/constraints/decoder/columns.rs @@ -0,0 +1,58 @@ +use crate::trace::decoder::{ + NUM_HASHER_COLUMNS, NUM_OP_BATCH_FLAGS, NUM_OP_BITS, NUM_OP_BITS_EXTRA_COLS, + NUM_USER_OP_HELPERS, +}; + +/// Decoder columns in the main execution trace (24 columns). +#[repr(C)] +pub struct DecoderCols { + /// Block address (hasher table row pointer). + pub addr: T, + /// Opcode bits b0-b6. + pub op_bits: [T; NUM_OP_BITS], + /// Hasher state h0-h7 (shared between decoding and MAST node hashing). + pub hasher_state: [T; NUM_HASHER_COLUMNS], + /// In-span flag (1 inside a basic block). + pub in_span: T, + /// Remaining operation group count. + pub group_count: T, + /// Position within operation group (0-8). + pub op_index: T, + /// Operation batch flags c0, c1, c2. + pub batch_flags: [T; NUM_OP_BATCH_FLAGS], + /// Degree-reduction extra columns e0, e1. + pub extra: [T; NUM_OP_BITS_EXTRA_COLS], +} + +impl DecoderCols { + /// Returns the 6 user-op helper registers (hasher_state[2..8]). + pub fn user_op_helpers(&self) -> [T; NUM_USER_OP_HELPERS] { + [ + self.hasher_state[2], + self.hasher_state[3], + self.hasher_state[4], + self.hasher_state[5], + self.hasher_state[6], + self.hasher_state[7], + ] + } + + /// Returns the 4 end-block flags (hasher_state[4..8]). + pub fn end_block_flags(&self) -> EndBlockFlags { + EndBlockFlags { + is_loop_body: self.hasher_state[4], + is_loop: self.hasher_state[5], + is_call: self.hasher_state[6], + is_syscall: self.hasher_state[7], + } + } +} + +/// Named end-block flag overlay for `hasher_state[4..8]`. +#[repr(C)] +pub struct EndBlockFlags { + pub is_loop_body: T, + pub is_loop: T, + pub is_call: T, + pub is_syscall: T, +} diff --git a/air/src/constraints/decoder/mod.rs b/air/src/constraints/decoder/mod.rs index 010e1b6b71..be42adb6d5 100644 --- a/air/src/constraints/decoder/mod.rs +++ b/air/src/constraints/decoder/mod.rs @@ -5,21 +5,29 @@ //! //! ## Constraint Categories //! -//! 1. **Op Bit Constraints**: Ensure operation bits are binary -//! 2. **Op Bits Extra Columns**: Ensure degree reduction columns are correctly computed -//! 3. **Batch Flag Constraints**: Ensure batch flags are binary and properly set -//! 4. **In-Span Constraints**: Ensure in-span flag transitions correctly -//! 5. **Group Count Constraints**: Ensure group count transitions correctly +//! 1. **In-span constraints**: Ensure the in-span flag transitions correctly. +//! 2. **Op-bit binary constraints**: Ensure operation bits are binary. +//! 3. **Extra columns (e0, e1)**: Degree-reduction columns for operation flag computation. +//! 4. **Opcode-bit group constraints**: Eliminate unused opcode prefixes. +//! 5. **General opcode-semantic constraints**: Per-operation invariants (SPLIT/LOOP, DYN, REPEAT, +//! END, HALT). +//! 6. **Group count constraints**: Group-count transitions inside basic blocks. +//! 7. **Op group decoding (h0) constraints**: Base-128 opcode packing in h0. +//! 8. **Op index constraints**: Position tracking within an operation group. +//! 9. **Batch flag constraints**: Batch size encoding and unused-lane zeroing. +//! 10. **Block address (addr) constraints**: Hasher-table address management. +//! 11. **Control flow constraint**: Mutual exclusivity of `in_span` and `f_ctrl`. //! //! ## Mental Model //! //! The decoder trace is the control-flow spine of the VM. Each row is either: -//! - **inside a basic block** (sp = 1) where ops execute and counters advance, or -//! - **a control-flow row** (sp = 0) that starts/ends/reshapes a block. +//! - **inside a basic block** (`in_span` = 1) where ops execute and counters advance, or +//! - **a control-flow row** (`in_span` = 0) that starts/ends/reshapes a block. //! //! The constraints below enforce three linked ideas: //! 1. **Opcode decoding is well-formed** (op bits and degree-reduction columns are consistent). -//! 2. **Span state is coherent** (sp, group_count, op_index evolve exactly as control-flow allows). +//! 2. **Span state is coherent** (`in_span`, `group_count`, `op_index` evolve exactly as +//! control-flow allows). //! 3. **Hasher lanes match batch semantics** (batch flags and h0..h7 encode the pending groups). //! //! Read the sections in that order: first the binary/format checks, then the span state machine, @@ -27,240 +35,53 @@ //! //! ## Decoder Trace Layout //! -//! The decoder trace consists of the following columns: -//! - `addr`: Block address (row address in hasher table) -//! - `b0-b6`: 7 operation bits encoding the opcode -//! - `h0-h7`: 8 hasher state columns (shared between decoding and program hashing) -//! - `sp`: In-span flag (1 when inside basic block, 0 otherwise) -//! - `gc`: Group count (remaining operation groups in current span) -//! - `ox`: Operation index (position within current operation group, 0-8) -//! - `c0, c1, c2`: Batch flags (encode number of groups in current batch) -//! - `e0, e1`: Extra columns for degree reduction - -use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::{AirBuilder, LiftedAirBuilder}; +//! ```text +//! addr | b0 b1 b2 b3 b4 b5 b6 | h0 h1 h2 h3 h4 h5 h6 h7 | sp | gc | ox | c0 c1 c2 | e0 e1 +//! (1) (7 op bits) (8 hasher state) (1) (1) (1) (3) (2) +//! ``` +//! +//! ### Hasher state dual-purpose (`h0`–`h7`) +//! +//! The 8 hasher-state columns serve different roles depending on the current operation: +//! +//! | Context | h0 | h1..h3 | h4 | h5 | h6 | h7 | +//! |-------------|------------|-----------|----------------|---------|---------|------------| +//! | SPAN/RESPAN | packed ops | op groups | op group | op group| op group| op group | +//! | END | block hash₀| hash₁..₃ | is_loop_body | is_loop | is_call | is_syscall | +//! | User ops | packed ops | op groups | user_op_helper | ... | ... | ... | +//! +//! ## Operation Flag Degrees +//! +//! | Operation | Flag | Degree | +//! |-----------|:------------:|:------:| +//! | JOIN | f_join | 5 | +//! | SPLIT | f_split | 5 | +//! | LOOP | f_loop | 5 | +//! | REPEAT | f_repeat | 4 | +//! | SPAN | f_span | 5 | +//! | RESPAN | f_respan | 4 | +//! | DYN | f_dyn | 5 | +//! | END | f_end | 4 | +//! | HALT | f_halt | 4 | +//! | PUSH | f_push | 5 | +//! | f_ctrl | (composite) | 5 | + +pub mod columns; + +use miden_crypto::stark::air::AirBuilder; use crate::{ - MainTraceRow, + Felt, MainCols, MidenAirBuilder, constraints::{ - op_flags::{ExprDecoderAccess, OpFlags}, - tagging::{ - TagGroup, TaggingAirBuilderExt, ids::TAG_DECODER_BASE, tagged_assert_zero, - tagged_assert_zero_integrity, - }, + constants::{F_1, F_128}, + decoder::columns::DecoderCols, + op_flags::OpFlags, + utils::{BoolNot, horner_eval_bits}, }, - trace::decoder as decoder_cols, + trace::chiplets::hasher::CONTROLLER_ROWS_PER_PERM_FELT, }; pub mod bus; -#[cfg(test)] -pub mod tests; - -// CONSTANTS -// ================================================================================================ - -/// Index offset for block address column within decoder (column 0). -const ADDR_OFFSET: usize = 0; - -/// Index offsets within the decoder array for op bits (b0-b6). -/// Op bits start at index 1 in the decoder (after addr at index 0). -const OP_BITS_OFFSET: usize = 1; - -/// Hash cycle length for Poseidon2 (32 rows per permutation). -const HASH_CYCLE_LEN: u64 = 32; - -/// Number of operation bits. -const NUM_OP_BITS: usize = 7; - -/// Index offset for in-span column within decoder. -const IN_SPAN_OFFSET: usize = 16; - -/// Index offset for group count column within decoder. -const GROUP_COUNT_OFFSET: usize = 17; - -/// Index offset for operation index column within decoder. -const OP_INDEX_OFFSET: usize = 18; - -/// Index offset for batch flags within decoder. -const BATCH_FLAGS_OFFSET: usize = 19; - -/// Number of batch flag columns. -const NUM_BATCH_FLAGS: usize = 3; - -/// Index offset for extra columns (e0, e1) within decoder. -const EXTRA_COLS_OFFSET: usize = 22; - -/// Number of decoder constraints, in the order of `DECODER_NAMES`. -/// - 7 op bits binary constraints -/// - 2 extra columns constraints (e0, e1) -/// - 3 op-bit group constraints (u32 b0, very-high b0/b1) -/// - 3 batch flags binary constraints -/// - 14 general constraints -/// - 1 in-span boundary constraint (first row sp = 0) -/// - 1 in-span binary constraint -/// - 2 in-span transition constraints (after SPAN/RESPAN, sp' = 1) -/// - 5 group count constraints -/// - 2 op group decoding constraints -/// - 4 op index constraints -/// - 9 op batch flag constraints -/// - 3 block address constraints -/// - 1 control flow constraint (1 - sp - f_ctrl = 0) -#[allow(dead_code)] -pub const NUM_CONSTRAINTS: usize = 57; - -/// Base ID for decoder constraints (inclusive). -const DECODER_BASE_ID: usize = TAG_DECODER_BASE; - -/// Decoder constraint namespaces in assertion order. -const DECODER_NAMES: [&str; NUM_CONSTRAINTS] = [ - // in-span constraints (boundary first, then transition rules) - "decoder.in_span.first_row", - "decoder.in_span.binary", - "decoder.in_span.span", - "decoder.in_span.respan", - // op bits binary (b0..b6) - "decoder.op_bits.b0.binary", - "decoder.op_bits.b1.binary", - "decoder.op_bits.b2.binary", - "decoder.op_bits.b3.binary", - "decoder.op_bits.b4.binary", - "decoder.op_bits.b5.binary", - "decoder.op_bits.b6.binary", - // extra columns (e0, e1) - "decoder.extra.e0", - "decoder.extra.e1", - // op-bit group constraints - "decoder.op_bits.u32_prefix.b0", - "decoder.op_bits.very_high.b0", - "decoder.op_bits.very_high.b1", - // batch flags binary (c0..c2) - "decoder.batch_flags.c0.binary", - "decoder.batch_flags.c1.binary", - "decoder.batch_flags.c2.binary", - // general constraints - "decoder.general.split_loop.s0.binary", - "decoder.general.dyn.h4.zero", - "decoder.general.dyn.h5.zero", - "decoder.general.dyn.h6.zero", - "decoder.general.dyn.h7.zero", - "decoder.general.repeat.s0.one", - "decoder.general.repeat.h4.one", - "decoder.general.end.loop.s0.zero", - "decoder.general.end_repeat.h0.carry", - "decoder.general.end_repeat.h1.carry", - "decoder.general.end_repeat.h2.carry", - "decoder.general.end_repeat.h3.carry", - "decoder.general.end_repeat.h4.carry", - "decoder.general.halt.next", - // group count constraints - "decoder.group_count.delta.binary", - "decoder.group_count.decrement.h0_or_imm", - "decoder.group_count.span_decrement", - "decoder.group_count.end_or_respan.hold", - "decoder.group_count.end.zero", - // op group decoding constraints - "decoder.op_group.shift", - "decoder.op_group.end_or_respan.h0.zero", - // op index constraints - "decoder.op_index.span_respan.reset", - "decoder.op_index.new_group.reset", - "decoder.op_index.increment", - "decoder.op_index.range", - // batch flag constraints and zeroing rules - "decoder.batch_flags.span_sum", - "decoder.batch_flags.zero_when_not_span", - "decoder.batch_flags.h4.zero", - "decoder.batch_flags.h5.zero", - "decoder.batch_flags.h6.zero", - "decoder.batch_flags.h7.zero", - "decoder.batch_flags.h2.zero", - "decoder.batch_flags.h3.zero", - "decoder.batch_flags.h1.zero", - // block address constraints - "decoder.addr.hold_in_span", - "decoder.addr.respan.increment", - "decoder.addr.halt.zero", - // control flow constraint - "decoder.control_flow.sp_complement", -]; - -/// Tag metadata for this constraint group. -const DECODER_TAGS: TagGroup = TagGroup { - base: DECODER_BASE_ID, - names: &DECODER_NAMES, -}; - -// Relative offsets into DECODER_NAMES by constraint group. -const IN_SPAN_BASE: usize = 0; -const OP_BITS_BASE: usize = IN_SPAN_BASE + 4; -const EXTRA_BASE: usize = OP_BITS_BASE + NUM_OP_BITS; -const OP_BIT_GROUP_BASE: usize = EXTRA_BASE + 2; -const BATCH_FLAGS_BINARY_BASE: usize = OP_BIT_GROUP_BASE + 3; -const GENERAL_BASE: usize = BATCH_FLAGS_BINARY_BASE + NUM_BATCH_FLAGS; -const GROUP_COUNT_BASE: usize = GENERAL_BASE + 14; -const OP_GROUP_DECODING_BASE: usize = GROUP_COUNT_BASE + 5; -const OP_INDEX_BASE: usize = OP_GROUP_DECODING_BASE + 2; -const BATCH_FLAGS_BASE: usize = OP_INDEX_BASE + 4; -const ADDR_BASE: usize = BATCH_FLAGS_BASE + 9; -const CONTROL_FLOW_BASE: usize = ADDR_BASE + 3; - -/// The degrees of the decoder constraints. -#[allow(dead_code)] -pub const CONSTRAINT_DEGREES: [usize; NUM_CONSTRAINTS] = [ - 2, 2, 2, 2, 2, 2, 2, // op bits binary (degree 2) - 4, 3, // e0 (degree 4), e1 (degree 3) - 4, 3, 3, // u32 b0, very-high b0/b1 - 2, 2, 2, // batch flags binary (degree 2) - 7, 6, 6, 6, 6, // general: split/loop top binary, dyn h4..h7 = 0 - 5, 5, // general: repeat top=1, repeat in-loop - 6, // general: end + is_loop + s0 - 9, 9, 9, 9, 9, // general: end + repeat' copies h0..h4 - 8, // general: halt -> halt' - 1, // sp first row (degree 1) - 2, // sp binary (degree 2) - 6, 5, // sp transition for SPAN (deg 5+1=6), RESPAN (deg 4+1=5) - 3, // gc delta bounded (degree 3: sp * delta * (delta - 1)) - 8, // gc decrement implies (h0=0 or is_push=1) - 6, // gc decrement on SPAN/RESPAN/PUSH - 5, // gc stays when next is END or RESPAN - 5, // gc zero at END - 6, // op group decoding: h0 shift by op' - 6, // op group decoding: h0 must be 0 before END/RESPAN - 6, // ox reset on SPAN/RESPAN (degree 6) - 6, // ox reset on new group (degree 6: sp * ng * ox') - 7, // ox increment inside basic block (degree 7) - 9, // ox range [0,8] (degree 9) - 5, // batch flags sum (span/respan -> one of g1/g2/g4/g8) - 6, // batch flags zero when not span/respan - 4, 4, 4, 4, // h4..h7 zero when <=4 groups - 4, 4, // h2..h3 zero when <=2 groups - 4, // h1 zero when <=1 group - 2, // addr unchanged inside basic block (degree 2) - 5, // addr increment on RESPAN (degree 5) - 5, // addr zero at HALT (degree 5) - 5, // control flow: 1 - sp - f_ctrl = 0 -]; - -// SMALL HELPERS -// ================================================================================================ - -/// Asserts a value is binary (0 or 1): `x * (x - 1) = 0`. -fn assert_binary(builder: &mut AB, idx: usize, value: AB::Expr) -where - AB: TaggingAirBuilderExt, -{ - assert_zero_integrity(builder, idx, value.clone() * (value - AB::Expr::ONE)); -} - -/// Computes the opcode value from op bits: `b0 + 2*b1 + ... + 64*b6`. -fn op_bits_to_value(bits: &[AB::Expr; NUM_OP_BITS]) -> AB::Expr -where - AB: LiftedAirBuilder, -{ - bits.iter().enumerate().fold(AB::Expr::ZERO, |acc, (i, bit)| { - acc + bit.clone() * AB::Expr::from_u16(1u16 << i) - }) -} // ENTRY POINTS // ================================================================================================ @@ -268,648 +89,429 @@ where /// Enforces decoder main-trace constraints (entry point). pub fn enforce_main( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, ) where - AB: TaggingAirBuilderExt, + AB: MidenAirBuilder, { - // Load decoder columns using typed struct - let cols: DecoderColumns = DecoderColumns::from_row::(local); - let cols_next: DecoderColumns = DecoderColumns::from_row::(next); - let op_flags_next = OpFlags::new(ExprDecoderAccess::::new(next)); - - enforce_in_span_constraints(builder, &cols, &cols_next, op_flags); - enforce_op_bits_binary(builder, &cols); - enforce_extra_columns(builder, &cols); - enforce_op_bit_group_constraints(builder, &cols); - enforce_batch_flags_binary(builder, &cols); - enforce_general_constraints(builder, local, next, op_flags, &op_flags_next); - enforce_group_count_constraints(builder, &cols, &cols_next, local, op_flags, &op_flags_next); - enforce_op_group_decoding_constraints( - builder, - &cols, - &cols_next, - local, - next, - op_flags, - &op_flags_next, - ); - enforce_op_index_constraints(builder, &cols, &cols_next, op_flags); - enforce_batch_flags_constraints(builder, &cols, local, op_flags); - enforce_block_address_constraints(builder, &cols, &cols_next, op_flags); - enforce_control_flow_constraints(builder, &cols, op_flags); -} - -// INTERNAL HELPERS -// ================================================================================================ - -/// Typed access to decoder columns. -/// -/// This struct provides named access to decoder columns, eliminating error-prone -/// index arithmetic. Created from a `MainTraceRow` reference. -/// -/// ## Layout -/// - `addr`: Block address (row address in hasher table) -/// - `op_bits[0..7]`: Operation bits b0-b6 encoding the opcode -/// - `in_span`: In-span flag (sp) - 1 when inside basic block -/// - `group_count`: Group count (gc) - remaining operation groups -/// - `op_index`: Operation index (ox) - position within group (0-8) -/// - `batch_flags[0..3]`: Batch flags c0, c1, c2 -/// - `extra[0..2]`: Extra columns e0, e1 for degree reduction -/// -/// Note: the 8 decoder hasher-state lanes live in the decoder trace but are not included here. -/// Constraints which depend on these lanes access them directly via `MainTraceRow` accessors. -pub struct DecoderColumns { - /// Block address (row address in hasher table) - pub addr: E, - /// Operation bits b0-b6 (7 bits encoding the opcode) - pub op_bits: [E; NUM_OP_BITS], - /// In-span flag (1 when inside basic block, 0 otherwise) - pub in_span: E, - /// Group count (remaining operation groups in current span) - pub group_count: E, - /// Operation index (position within current operation group, 0-8) - pub op_index: E, - /// Batch flags c0, c1, c2 (encode number of groups in current batch) - pub batch_flags: [E; NUM_BATCH_FLAGS], - /// Extra columns e0, e1 for degree reduction - pub extra: [E; 2], -} + // --- Destructure current-row decoder columns ------------------------------------------------ + let DecoderCols { + addr, + op_bits, + hasher_state, + in_span, + group_count, + op_index, + batch_flags, + extra, + } = local.decoder; + // b2 and b3 are not used directly in decoder constraints — they are consumed only + // by the op_flags module for individual opcode discrimination. + let [b0, b1, _, _, b4, b5, b6] = op_bits; + let [bc0, bc1, bc2] = batch_flags; + let [e0, e1] = extra; + let h0 = hasher_state[0]; + + // End-block flags occupy hasher_state[4..8] during END operations. + let end_flags = local.decoder.end_block_flags(); + let is_loop_body = end_flags.is_loop_body; + let is_loop = end_flags.is_loop; + + // --- Destructure next-row decoder columns --------------------------------------------------- + let DecoderCols { + addr: addr_next, + op_bits: op_bits_next, + hasher_state: hasher_state_next, + in_span: in_span_next, + group_count: group_count_next, + op_index: op_index_next, + .. + } = next.decoder; + let h0_next = hasher_state_next[0]; + + // --- Cached derived expressions ------------------------------------------------------------- + // These values appear in multiple constraint sections below. + + // The change in group count across one row. + // Inside a span, delta_group_count is constrained to be boolean (0 or 1). + // When delta_group_count = 1, a group has been consumed (either a completed op group or a PUSH + // immediate). When delta_group_count = 0, the current group is still being decoded. + let delta_group_count: AB::Expr = group_count - group_count_next; + + // PUSH is the only operation with an immediate value. When PUSH executes, it consumes + // an op group from h0 to read the immediate value pushed onto the stack, causing + // delta_group_count = 1. However, this is NOT a "new group start" for decoding purposes — the + // distinction matters for the new_group flag: new_group = delta_group_count - is_push. + let is_push = op_flags.push(); -impl DecoderColumns { - /// Extract decoder columns from a main trace row. - pub fn from_row(row: &MainTraceRow) -> Self - where - AB: LiftedAirBuilder, - AB::Var: Into + Clone, + // ============================================= + // In-span constraints + // ============================================= + // The in_span flag indicates whether we are inside a basic block: + // in_span = 1 when executing user operations, + // in_span = 0 on control-flow rows (SPAN, RESPAN, END, JOIN, SPLIT, LOOP, etc.). + // + // in_span is pinned to 1 - f_ctrl on every row by the control-flow constraint at + // the end of this function (in_span + f_ctrl = 1), so in_span cannot become 1 + // without a preceding SPAN or RESPAN that sets in_span' = 1 on the next row. + + // Execution starts outside any basic block. + builder.when_first_row().assert_zero(in_span); + + // The in-span flag is binary. + builder.assert_bool(in_span); + + // After SPAN, next row enters a basic block. + builder.when_transition().when(op_flags.span()).assert_one(in_span_next); + + // After RESPAN, next row stays in a basic block. + builder.when_transition().when(op_flags.respan()).assert_one(in_span_next); + + // ============================================= + // Op-bit binary constraints + // ============================================= + // Each opcode bit must be 0 or 1. + builder.assert_bools(op_bits); + + // ============================================= + // Extra columns (e0, e1) — degree reduction + // ============================================= + // Without these columns, operation flags for the upper opcode groups (U32, VeryHigh) + // would require products of up to 7 bits (degree 7), exceeding the constraint system's + // degree budget. By precomputing e0 and e1 in the trace and constraining them here, + // the op_flags module can reference these degree-1 columns instead. + // + // e0 = b6 · (1 - b5) · b4 selects the "101" prefix (degree-5 ops) + // e1 = b6 · b5 selects the "11" prefix (degree-4 ops) + + // e0 must equal b6 · (1 - b5) · b4. + let e0_expected = b6 * b5.into().not() * b4; + builder.assert_eq(e0, e0_expected); + + // e1 must equal b6 · b5. + let e1_expected = b6 * b5; + builder.assert_eq(e1, e1_expected); + + // ============================================= + // Opcode-bit group constraints + // ============================================= + // Certain opcode prefixes have unused bit positions that must be zero to prevent + // invalid opcodes from being encoded. Both opcode groups use e0/e1 for degree reduction: + // + // Prefix | b6 b5 b4 | Meaning | Constraint + // --------+----------+------------+------------ + // U32 | 1 0 0 | 8 U32 ops | b0 = 0 + // VeryHi | 1 1 * | 8 hi ops | b0 = b1 = 0 + // + // The U32 prefix is computed as b6·(1-b5)·(1-b4) = b6 - e1 - e0 (degree 1). + // The VeryHi prefix is b6·b5 = e1 (degree 1). + + // When U32 prefix is active, b0 must be zero. + builder.when(b6 - e1 - e0).assert_zero(b0); + + // When VeryHi prefix is active, both b0 and b1 must be zero. { - DecoderColumns { - addr: row.decoder[ADDR_OFFSET].clone().into(), - op_bits: core::array::from_fn(|i| row.decoder[OP_BITS_OFFSET + i].clone().into()), - in_span: row.decoder[IN_SPAN_OFFSET].clone().into(), - group_count: row.decoder[GROUP_COUNT_OFFSET].clone().into(), - op_index: row.decoder[OP_INDEX_OFFSET].clone().into(), - batch_flags: core::array::from_fn(|i| { - row.decoder[BATCH_FLAGS_OFFSET + i].clone().into() - }), - extra: core::array::from_fn(|i| row.decoder[EXTRA_COLS_OFFSET + i].clone().into()), - } + let builder = &mut builder.when(e1); + builder.assert_zero(b0); + builder.assert_zero(b1); } -} -// CONSTRAINT HELPERS -// ================================================================================================ - -/// Enforces in-span (sp) constraints. -/// -/// The in-span flag indicates whether we're inside a basic block: -/// - sp = 1 when executing operations inside a basic block -/// - sp = 0 for SPAN, RESPAN, END, and control-flow operations -/// -/// This is the entry point to the decoder state machine. Once sp is set by SPAN/RESPAN, -/// the rest of the decoder constraints (gc, ox, batch flags) are interpreted relative to -/// being inside that span. -/// -/// Constraints: -/// 1. sp is binary: sp * (sp - 1) = 0 -/// 2. After SPAN operation, sp' = 1: span_flag * (1 - sp') = 0 -/// 3. After RESPAN operation, sp' = 1: respan_flag * (1 - sp') = 0 -fn enforce_in_span_constraints( - builder: &mut AB, - cols: &DecoderColumns, - cols_next: &DecoderColumns, - op_flags: &OpFlags, -) where - AB: TaggingAirBuilderExt, -{ - let sp = cols.in_span.clone(); - let sp_next = cols_next.in_span.clone(); - - // Boundary: execution starts outside any basic block. - assert_zero_first_row(builder, IN_SPAN_BASE, sp.clone()); - - // Constraint 1: sp is binary, so span state is well-formed. - let sp_binary = sp.clone() * (sp - AB::Expr::ONE); - assert_zero_integrity(builder, IN_SPAN_BASE + 1, sp_binary); - - // Constraint 2: After SPAN, the next row must be inside a span. - // span_flag * (1 - sp') = 0 - let span_flag = op_flags.span(); - assert_zero_transition( - builder, - IN_SPAN_BASE + 2, - span_flag * (AB::Expr::ONE - sp_next.clone()), - ); - - // Constraint 3: After RESPAN, the next row must be inside a span. - // respan_flag * (1 - sp') = 0 - let respan_flag = op_flags.respan(); - assert_zero_transition(builder, IN_SPAN_BASE + 3, respan_flag * (AB::Expr::ONE - sp_next)); -} - -/// Enforces that all operation bits (b0-b6) are binary (0 or 1). -/// -/// For each bit bi: bi * (bi - 1) = 0 -fn enforce_op_bits_binary(builder: &mut AB, cols: &DecoderColumns) -where - AB: TaggingAirBuilderExt, -{ - for i in 0..NUM_OP_BITS { - // Each opcode bit must be 0 or 1 to make decoding deterministic. - assert_binary(builder, OP_BITS_BASE + i, cols.op_bits[i].clone()); + // ============================================= + // General opcode-semantic constraints + // ============================================= + // Per-operation invariants that don't fit into the generic counter/decoding sections. + // + // Operation | Constraint | Why + // ----------+-------------------------------------+------------------------------------ + // SPLIT | s0 in {0, 1} | s0 selects true/false branch + // LOOP | s0 in {0, 1} | s0 determines enter (1) / skip (0) + // DYN | h4 = h5 = h6 = h7 = 0 | callee digest lives in h0..h3 only + // REPEAT | s0 = 1 | loop condition must be true + // REPEAT | is_loop_body (h4) = 1 | must be inside an active loop body + // END+loop | is_loop (h5) => s0 = 0 | exiting loop: condition became false + // END+REP' | h0'..h4' = h0..h4 | carry block hash + loop flag for re-entry + // HALT | f_halt => f_halt' | absorbing / terminal state + + // SPLIT/LOOP: branch selector must be binary. + let branch_condition = local.stack.get(0); + builder + .when(op_flags.split() + op_flags.loop_op()) + .assert_bool(branch_condition); + + // DYN: the upper hasher lanes must be zero so the callee digest in h0..h3 is the + // only input to the hash chiplet. + { + let builder = &mut builder.when(op_flags.dyn_op()); + let hasher_zeros = [hasher_state[4], hasher_state[5], hasher_state[6], hasher_state[7]]; + builder.assert_zeros(hasher_zeros) } -} - -/// Enforces that the extra columns (e0, e1) are correctly computed from op bits. -/// -/// These columns are used for degree reduction in operation flag computation: -/// - e0 = b6 * (1 - b5) * b4 -/// - e1 = b6 * b5 -fn enforce_extra_columns(builder: &mut AB, cols: &DecoderColumns) -where - AB: TaggingAirBuilderExt, -{ - let b4 = cols.op_bits[4].clone(); - let b5 = cols.op_bits[5].clone(); - let b6 = cols.op_bits[6].clone(); - - let e0 = cols.extra[0].clone(); - let e1 = cols.extra[1].clone(); - - // e0 = b6 * (1 - b5) * b4. - // This extra register exists to reduce the degree of op-flag selectors for the - // `101...` opcode group (see docs/src/design/stack/op_constraints.md). - let expected_e0 = b6.clone() * (AB::Expr::ONE - b5.clone()) * b4; - assert_zero_integrity(builder, EXTRA_BASE, e0 - expected_e0); - - // e1 = b6 * b5. - // This extra register exists to reduce the degree of op-flag selectors for the - // `11...` opcode group (see docs/src/design/stack/op_constraints.md). - let expected_e1 = b6 * b5; - assert_zero_integrity(builder, EXTRA_BASE + 1, e1 - expected_e1); -} - -/// Enforces opcode-bit constraints for grouped opcode families. -/// -/// - U32 ops (prefix `100`) must have b0 = 0. -/// - Very-high-degree ops (prefix `11`) must have b0 = b1 = 0. -fn enforce_op_bit_group_constraints(builder: &mut AB, cols: &DecoderColumns) -where - AB: TaggingAirBuilderExt, -{ - let b0 = cols.op_bits[0].clone(); - let b1 = cols.op_bits[1].clone(); - let b4 = cols.op_bits[4].clone(); - let b5 = cols.op_bits[5].clone(); - let b6 = cols.op_bits[6].clone(); - - // U32 prefix pattern: b6=1, b5=0, b4=0. Under this prefix, b0 must be 0 to - // eliminate invalid opcodes in the U32 opcode subset. - let u32_prefix = b6.clone() * (AB::Expr::ONE - b5.clone()) * (AB::Expr::ONE - b4); - assert_zero_integrity(builder, OP_BIT_GROUP_BASE, u32_prefix * b0.clone()); - - // Very-high prefix pattern: b6=1, b5=1. Under this prefix, b0 and b1 must be 0 - // to eliminate invalid opcodes in the very-high opcode subset. - let very_high_prefix = b6 * b5; - assert_zero_integrity(builder, OP_BIT_GROUP_BASE + 1, very_high_prefix.clone() * b0); - assert_zero_integrity(builder, OP_BIT_GROUP_BASE + 2, very_high_prefix * b1); -} -/// Enforces that batch flags (c0, c1, c2) are binary. -/// -/// For each flag ci: ci * (ci - 1) = 0 -fn enforce_batch_flags_binary(builder: &mut AB, cols: &DecoderColumns) -where - AB: TaggingAirBuilderExt, -{ - for i in 0..NUM_BATCH_FLAGS { - // Batch flags are selectors; they must be boolean. - assert_binary(builder, BATCH_FLAGS_BINARY_BASE + i, cols.batch_flags[i].clone()); + // REPEAT: top-of-stack must be 1 (loop condition true) and we must be inside an + // active loop body (is_loop_body = h4 = 1). + { + let loop_condition = local.stack.get(0); + let builder = &mut builder.when(op_flags.repeat()); + builder.assert_one(loop_condition); + builder.assert_one(is_loop_body); } -} -/// Enforces general decoder constraints derived from opcode semantics. -/// -/// These are the opcode-specific rules that aren't captured by the generic counters: -/// - SPLIT/LOOP: s0 must be binary (branch selector) -/// - DYN: upper hasher lanes are zero (callee hash lives in lower half) -/// - REPEAT: must be inside loop body and s0 = 1 -/// - END + REPEAT': carry hasher state forward -/// - HALT: absorbing -fn enforce_general_constraints( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, - op_flags: &OpFlags, - op_flags_next: &OpFlags, -) where - AB: TaggingAirBuilderExt, -{ - let s0: AB::Expr = local.stack[0].clone().into(); - - // SPLIT/LOOP: top stack value must be binary (branch selector). - let split_or_loop = op_flags.split() + op_flags.loop_op(); - let s0_binary = s0.clone() * (s0.clone() - AB::Expr::ONE); - assert_zero_integrity(builder, GENERAL_BASE, split_or_loop * s0_binary); - - // DYN: the first half holds the callee digest; the second half must be zero. - let f_dyn = op_flags.dyn_op(); - for i in 0..4 { - let hi: AB::Expr = local.decoder[decoder_cols::HASHER_STATE_OFFSET + 4 + i].clone().into(); - assert_zero_integrity(builder, GENERAL_BASE + 1 + i, f_dyn.clone() * hi); - } + // END inside a loop: when ending a loop block (is_loop = h5 = 1), top-of-stack must + // be 0 — the loop exits because the condition became false. + let loop_condition = local.stack.get(0); + builder.when(op_flags.end()).when(is_loop).assert_zero(loop_condition); - // REPEAT: top stack must be 1 and we must be in a loop body (h4=1). - let f_repeat = op_flags.repeat(); - let h4: AB::Expr = local.decoder[decoder_cols::IS_LOOP_BODY_FLAG_COL_IDX].clone().into(); - assert_zero_integrity( - builder, - GENERAL_BASE + 5, - f_repeat.clone() * (AB::Expr::ONE - s0.clone()), - ); - assert_zero_integrity(builder, GENERAL_BASE + 6, f_repeat * (AB::Expr::ONE - h4)); - - // END inside a loop: if is_loop flag is set, top stack must be 0. - let f_end = op_flags.end(); - let h5: AB::Expr = local.decoder[decoder_cols::IS_LOOP_FLAG_COL_IDX].clone().into(); - assert_zero_integrity(builder, GENERAL_BASE + 7, f_end.clone() * h5 * s0); - - // END followed by REPEAT: carry h0..h4 into the next row. - let f_repeat_next = op_flags_next.repeat(); - for i in 0..5 { - let hi: AB::Expr = local.decoder[decoder_cols::HASHER_STATE_OFFSET + i].clone().into(); - let hi_next: AB::Expr = next.decoder[decoder_cols::HASHER_STATE_OFFSET + i].clone().into(); - assert_zero_transition( - builder, - GENERAL_BASE + 8 + i, - f_end.clone() * f_repeat_next.clone() * (hi_next - hi), - ); + // END followed by REPEAT: carry the block hash (h0..h3) and the is_loop_body flag + // (h4) into the next row so the loop body can be re-entered. + { + let gate = builder.is_transition() * op_flags.end() * op_flags.repeat_next(); + let builder = &mut builder.when(gate); + for i in 0..5 { + builder.assert_eq(hasher_state_next[i], hasher_state[i]); + } } - // HALT is absorbing: it can only be followed by HALT. - let f_halt = op_flags.halt(); - let f_halt_next = op_flags_next.halt(); - assert_zero_transition(builder, GENERAL_BASE + 13, f_halt * (AB::Expr::ONE - f_halt_next)); -} - -/// Enforces group count (gc) constraints. -/// -/// The group count tracks remaining operation groups in the current basic block: -/// - gc starts at the total number of groups when SPAN/RESPAN is executed -/// - gc decrements by 1 when processing SPAN, RESPAN, or completing a group -/// - gc must be 0 when END is executed -/// -/// Intuition: -/// - `delta_gc = gc - gc'` is the number of groups consumed on this row. -/// - Inside a span, delta_gc can only be 0 or 1. -/// - SPAN/RESPAN/PUSH must consume a group immediately, so delta_gc must be 1. -/// -/// Constraints: -/// 1. Inside basic block, gc can only stay same or decrement by 1: sp * delta_gc * (delta_gc - 1) = -/// 0 (where delta_gc = gc - gc') -/// 2. When END is executed, gc must be 0: end_flag * gc = 0 -/// 3. During SPAN/RESPAN, gc must decrement by 1: (span_flag + respan_flag) * (1 - delta_gc) = 0 -fn enforce_group_count_constraints( - builder: &mut AB, - cols: &DecoderColumns, - cols_next: &DecoderColumns, - local: &MainTraceRow, - op_flags: &OpFlags, - op_flags_next: &OpFlags, -) where - AB: TaggingAirBuilderExt, -{ - let sp = cols.in_span.clone(); - let gc = cols.group_count.clone(); - let gc_next = cols_next.group_count.clone(); - let h0: AB::Expr = local.decoder[decoder_cols::HASHER_STATE_OFFSET].clone().into(); - - // delta_gc = gc - gc' (how much gc decrements; expected to be 0 or 1) - let delta_gc = gc.clone() - gc_next; - - // is_push = push flag (PUSH is the only operation with immediate value) - let is_push = op_flags.push(); - - // Constraint 1: Inside a span, gc can only stay the same or decrement by 1. - // sp * delta_gc * (delta_gc - 1) = 0 - // This ensures: if sp=1 and delta_gc != 0, then delta_gc must equal 1 - assert_zero_transition( - builder, - GROUP_COUNT_BASE, - sp.clone() * delta_gc.clone() * (delta_gc.clone() - AB::Expr::ONE), - ); - - // Constraint 2: If gc decrements and this is not a PUSH-immediate row, - // then h0 must be zero (no immediate value packed into the group). - // sp * delta_gc * (1 - is_push) * h0 = 0 - assert_zero_transition( - builder, - GROUP_COUNT_BASE + 1, - sp.clone() * delta_gc.clone() * (AB::Expr::ONE - is_push.clone()) * h0, - ); - - // Constraint 3: SPAN/RESPAN/PUSH must consume a group immediately. - // (span_flag + respan_flag + is_push) * (delta_gc - 1) = 0 - let span_flag = op_flags.span(); - let respan_flag = op_flags.respan(); - assert_zero_transition( - builder, - GROUP_COUNT_BASE + 2, - (span_flag + respan_flag + is_push) * (delta_gc.clone() - AB::Expr::ONE), - ); - - // Constraint 4: If the next op is END or RESPAN, gc cannot decrement on this row. - // delta_gc * (end' + respan') = 0 - let end_next = op_flags_next.end(); - let respan_next = op_flags_next.respan(); - assert_zero_transition( - builder, - GROUP_COUNT_BASE + 3, - delta_gc.clone() * (end_next + respan_next), - ); - - // Constraint 5: END closes the span, so gc must be 0. - // end_flag * gc = 0 - let end_flag = op_flags.end(); - assert_zero_integrity(builder, GROUP_COUNT_BASE + 4, end_flag * gc); -} - -/// Enforces op group decoding constraints for the `h0` register. -/// -/// `h0` is a packed buffer of pending op groups. When a group is started or continued, -/// the next opcode is shifted into `h0` (base 2^7, because opcodes fit in 7 bits). -/// When the next op is END or RESPAN, the buffer must be empty (h0 = 0). -fn enforce_op_group_decoding_constraints( - builder: &mut AB, - cols: &DecoderColumns, - cols_next: &DecoderColumns, - local: &MainTraceRow, - next: &MainTraceRow, - op_flags: &OpFlags, - op_flags_next: &OpFlags, -) where - AB: TaggingAirBuilderExt, -{ - let sp = cols.in_span.clone(); - let sp_next = cols_next.in_span.clone(); - - let gc = cols.group_count.clone(); - let gc_next = cols_next.group_count.clone(); - let delta_gc = gc - gc_next; - - let f_span = op_flags.span(); - let f_respan = op_flags.respan(); - let is_push = op_flags.push(); - - // f_sgc is set when gc stays the same inside a basic block. - let f_sgc = sp.clone() * sp_next * (AB::Expr::ONE - delta_gc.clone()); - - let h0: AB::Expr = local.decoder[decoder_cols::HASHER_STATE_OFFSET].clone().into(); - let h0_next: AB::Expr = next.decoder[decoder_cols::HASHER_STATE_OFFSET].clone().into(); - - // Compute op' from next-row op bits (b0' + 2*b1' + ... + 64*b6'). - let op_next = op_bits_to_value::(&cols_next.op_bits); - - // When SPAN/RESPAN/PUSH or when gc doesn't change, shift h0 by op'. - // (h0 - h0' * 2^7 - op') = 0 under the combined flag. - let op_group_base = AB::Expr::from_u16(1u16 << 7); - let h0_shift = h0.clone() - h0_next * op_group_base - op_next; - assert_zero_transition( - builder, - OP_GROUP_DECODING_BASE, - (f_span + f_respan + is_push + f_sgc) * h0_shift, - ); - - // If the next op is END or RESPAN, the current h0 must be 0 (no pending group). - let end_next = op_flags_next.end(); - let respan_next = op_flags_next.respan(); - assert_zero_transition(builder, OP_GROUP_DECODING_BASE + 1, sp * (end_next + respan_next) * h0); -} + // HALT is absorbing: once entered, the VM stays in HALT for all remaining rows. + builder.when_transition().when(op_flags.halt()).assert_one(op_flags.halt_next()); + + // ============================================= + // Group count constraints + // ============================================= + // The group_count column tracks remaining operation groups in the current basic block. + // + // ## Lifecycle + // + // 1. SPAN/RESPAN: the prover sets group_count non-deterministically to the batch's group count. + // The constraint below forces delta_group_count = 1 on these rows. + // 2. Normal execution: each time a group is fully decoded (h0 reaches 0) or a PUSH consumes an + // immediate, group_count decrements by 1 (delta_group_count = 1). + // 3. END: group_count must be 0 — all groups in the span have been consumed. + + // Inside a span, group_count changes by at most 1. When it does change and this is not a PUSH, + // h0 must already be 0 (the group was fully decoded). + { + let gate = builder.is_transition() * in_span; + let builder = &mut builder.when(gate); + builder.assert_bool(delta_group_count.clone()); + builder.when(delta_group_count.clone()).when(is_push.not()).assert_zero(h0); + } -/// Enforces op index (ox) constraints. -/// -/// The op index tracks the position of the current operation within its operation group: -/// - ox ranges from 0 to 8 (9 operations per group) -/// - ox resets to 0 when entering a new group (SPAN, RESPAN, or group boundary) -/// - ox increments by 1 for each operation within a group -/// -/// Intuition: -/// - `ng = delta_gc - is_push` is 1 when a new group starts (excluding PUSH-immediate rows). -/// - When a new group starts, ox' must be 0. -/// - Otherwise, ox increments by 1 while sp stays 1. -/// -/// Constraints: -/// 1. After SPAN/RESPAN, ox' = 0: (span_flag + respan_flag) * ox' = 0 -/// 2. When starting new group inside basic block (gc decrements), ox' = 0: sp * delta_gc * ox' = 0 -/// 3. When inside basic block and not starting new group, ox increments by 1: sp * sp' * (1 - -/// delta_gc) * (ox' - ox - 1) = 0 -/// 4. Op index must be in range [0, 8]: ox * (ox-1) * (ox-2) * (ox-3) * (ox-4) * (ox-5) * (ox-6) * -/// (ox-7) * (ox-8) = 0 -fn enforce_op_index_constraints( - builder: &mut AB, - cols: &DecoderColumns, - cols_next: &DecoderColumns, - op_flags: &OpFlags, -) where - AB: TaggingAirBuilderExt, -{ - let sp = cols.in_span.clone(); - let sp_next = cols_next.in_span.clone(); - let gc = cols.group_count.clone(); - let gc_next = cols_next.group_count.clone(); - let ox = cols.op_index.clone(); - let ox_next = cols_next.op_index.clone(); + // SPAN, RESPAN, and PUSH each consume exactly one group (delta_group_count = 1). + builder + .when_transition() + .when(op_flags.span() + op_flags.respan() + is_push.clone()) + .assert_one(delta_group_count.clone()); + + // If delta_group_count = 1 on this row, the next row cannot be END or RESPAN — those ops need + // a fresh batch or span closure, not a mid-batch decrement. + builder + .when_transition() + .when(delta_group_count.clone()) + .assert_zero(op_flags.end_next() + op_flags.respan_next()); + + // By the time END executes, all groups must have been consumed. + builder.when(op_flags.end()).assert_zero(group_count); + + // ============================================= + // Op group decoding (h0) constraints + // ============================================= + // Register h0 holds the current operation group as a base-128 packed integer. + // Operations are packed least-significant first (each opcode is 7 bits): + // + // h0 = op_0 + 128·op_1 + 128²·op_2 + ... + 128^(k-1)·op_(k-1) + // + // Each step, the VM peels off the lowest 7 bits of h0 — these bits equal the + // opcode that will appear in op_bits on the *next* row (op'). What remains + // after removing op' becomes h0': + // + // h0 = h0' · 128 + op' (no field division needed) + // + // ## same_group_count flag + // + // same_group_count = in_span · in_span' · (1 - delta_group_count) + // + // This is 1 when we are inside a span on BOTH this and the next row AND the group + // count did not change — meaning we are still decoding ops from the same group. + // Note: same_group_count is mutually exclusive with f_span, f_respan, and is_push + // because those three always set delta_group_count = 1. + // + // ## h0_active flag + // + // h0_active = f_span + f_respan + is_push + same_group_count + // + // The h0 shift constraint fires in exactly 4 situations: + // - f_span/f_respan: a new batch was just loaded; h0 has the first group. + // - is_push: PUSH consumed an immediate; h0 shifts to reveal the next op. + // - same_group_count: normal op execution within a group; h0 shifts by one opcode. + { + let f_span = op_flags.span(); + let f_respan = op_flags.respan(); - // delta_gc = gc - gc' (how much gc decrements; 1 when entering new group) - let delta_gc = gc.clone() - gc_next; + let same_group_count: AB::Expr = in_span * in_span_next * delta_group_count.not(); + let op_next: AB::Expr = horner_eval_bits(&op_bits_next); - // is_push = push flag (PUSH is the only operation with immediate value) - let is_push = op_flags.push(); + // When h0 is active, verify the base-128 shift. + let h0_shift = h0 - h0_next * F_128 - op_next; + let h0_active = f_span + f_respan + is_push.clone() + same_group_count; + builder.when_transition().when(h0_active).assert_zero(h0_shift); - // ng = delta_gc - is_push - // This equals 1 when we're starting a new operation group (not due to immediate op) - let ng = delta_gc - is_push; - - let span_flag = op_flags.span(); - let respan_flag = op_flags.respan(); - - // Constraint 1: SPAN/RESPAN start a fresh group, so ox' = 0. - // (span_flag + respan_flag) * ox' = 0 - assert_zero_transition(builder, OP_INDEX_BASE, (span_flag + respan_flag) * ox_next.clone()); - - // Constraint 2: When a new group starts inside a span, ox' = 0. - // sp * ng * ox' = 0 - assert_zero_transition(builder, OP_INDEX_BASE + 1, sp.clone() * ng.clone() * ox_next.clone()); - - // Constraint 3: When staying in the same group, ox increments by 1. - // sp * sp' * (1 - ng) * (ox' - ox - 1) = 0 - let delta_ox = ox_next - ox.clone() - AB::Expr::ONE; - assert_zero_transition( - builder, - OP_INDEX_BASE + 2, - sp * sp_next * (AB::Expr::ONE - ng) * delta_ox, - ); - - // Constraint 4: ox must be in range [0, 8] (9 ops per group). - // ∏_{i=0}^{8}(ox - i) = 0 - let mut range_check = ox.clone(); - for i in 1..=8u64 { - range_check *= ox.clone() - AB::Expr::from_u16(i as u16); + // Before END or RESPAN, h0 must be empty (all ops in the group consumed). + let end_or_respan_next = op_flags.end_next() + op_flags.respan_next(); + builder.when_transition().when(in_span).when(end_or_respan_next).assert_zero(h0); } - assert_zero_integrity(builder, OP_INDEX_BASE + 3, range_check); -} -/// Enforces op batch flag constraints and associated hasher-state zeroing rules. -/// -/// Batch flags encode how many groups were emitted by SPAN/RESPAN: -/// - g8, g4, g2, g1 correspond to batches of 8, 4, 2, or 1 groups. The hasher lanes h1..h7 store -/// the group values; unused lanes must be zeroed. -fn enforce_batch_flags_constraints( - builder: &mut AB, - cols: &DecoderColumns, - local: &MainTraceRow, - op_flags: &OpFlags, -) where - AB: TaggingAirBuilderExt, -{ - let bc0 = cols.batch_flags[0].clone(); - let bc1 = cols.batch_flags[1].clone(); - let bc2 = cols.batch_flags[2].clone(); - - // Batch flag decoding matches trace::decoder batch encodings. - let f_g8 = bc0.clone(); - let f_g4 = (AB::Expr::ONE - bc0.clone()) * bc1.clone() * (AB::Expr::ONE - bc2.clone()); - let f_g2 = (AB::Expr::ONE - bc0.clone()) * (AB::Expr::ONE - bc1.clone()) * bc2.clone(); - let f_g1 = (AB::Expr::ONE - bc0) * bc1 * bc2; - - let f_span = op_flags.span(); - let f_respan = op_flags.respan(); - let span_or_respan = f_span + f_respan; - - // When SPAN or RESPAN, exactly one batch flag must be set. - assert_zero_integrity( - builder, - BATCH_FLAGS_BASE, - span_or_respan.clone() - (f_g1.clone() + f_g2.clone() + f_g4.clone() + f_g8), - ); - - // When not SPAN/RESPAN, all batch flags must be zero. - assert_zero_integrity( - builder, - BATCH_FLAGS_BASE + 1, - (AB::Expr::ONE - span_or_respan) - * (cols.batch_flags[0].clone() - + cols.batch_flags[1].clone() - + cols.batch_flags[2].clone()), - ); - - // When batch has <=4 groups, h4..h7 must be zero (unused lanes). - let small_batch = f_g1.clone() + f_g2.clone() + f_g4.clone(); - for i in 0..4 { - let hi: AB::Expr = local.decoder[decoder_cols::HASHER_STATE_OFFSET + 4 + i].clone().into(); - assert_zero_integrity(builder, BATCH_FLAGS_BASE + 2 + i, small_batch.clone() * hi); - } - - // When batch has <=2 groups, h2..h3 must be zero (unused lanes). - let tiny_batch = f_g1.clone() + f_g2.clone(); - for i in 0..2 { - let hi: AB::Expr = local.decoder[decoder_cols::HASHER_STATE_OFFSET + 2 + i].clone().into(); - assert_zero_integrity(builder, BATCH_FLAGS_BASE + 6 + i, tiny_batch.clone() * hi); + // ============================================= + // Op index constraints + // ============================================= + // The op_index column tracks the position of the current operation within its operation + // group. op_index ranges from 0 to 8 (up to 9 operations per group), resets to 0 when + // entering a new group, and increments by 1 for each operation within a group. + // + // ## new_group flag + // + // new_group = delta_group_count - is_push + // + // When new_group = 1, a genuine new group is starting: group_count decremented and it + // was NOT because of a PUSH immediate. When new_group = 0, we are still in the same + // group (either group_count didn't change, or it changed only because of PUSH). + { + let new_group: AB::Expr = delta_group_count - is_push; + + // SPAN/RESPAN start a fresh batch, so op_index' = 0. + builder + .when_transition() + .when(op_flags.span() + op_flags.respan()) + .assert_zero(op_index_next); + + // When a new group starts inside a span, op_index' = 0. + // Gated by in_span to exclude SPAN/RESPAN rows (which are handled above). + builder + .when_transition() + .when(in_span) + .when(new_group.clone()) + .assert_zero(op_index_next); + + // When staying in the same group inside a span, op_index increments by 1. + // Gated by in_span_next to exclude the row before END/RESPAN (where in_span' = 0). + builder + .when_transition() + .when(in_span) + .when(in_span_next) + .when(new_group.not()) + .assert_eq(op_index_next, op_index + F_1); + + // op_index must be in [0, 8] — 9 ops per group max. + let mut range_check: AB::Expr = op_index.into(); + for i in 1..=8u64 { + range_check *= op_index - Felt::new(i); + } + builder.assert_zero(range_check); } - // When batch has 1 group, h1 must be zero (unused lane). - let h1: AB::Expr = local.decoder[decoder_cols::HASHER_STATE_OFFSET + 1].clone().into(); - assert_zero_integrity(builder, BATCH_FLAGS_BASE + 8, f_g1 * h1); -} - -/// Enforces block address (addr) constraints. -/// -/// The block address identifies the current code block in the hasher table: -/// - addr stays constant inside a basic block (sp = 1) -/// - addr increments by HASH_CYCLE_LEN (32) after RESPAN -/// - addr must be 0 when HALT is executed -/// -/// This ties the span state to the hasher table position. -/// -/// Constraints: -/// 1. Inside basic block, address unchanged: sp * (addr' - addr) = 0 -/// 2. RESPAN increments address by HASH_CYCLE_LEN: respan_flag * (addr' - addr - HASH_CYCLE_LEN) = -/// 0 -/// 3. HALT has addr = 0: halt_flag * addr = 0 -fn enforce_block_address_constraints( - builder: &mut AB, - cols: &DecoderColumns, - cols_next: &DecoderColumns, - op_flags: &OpFlags, -) where - AB: TaggingAirBuilderExt, -{ - let sp = cols.in_span.clone(); - let addr = cols.addr.clone(); - let addr_next = cols_next.addr.clone(); - - // Constraint 1: Inside a span, address must stay the same. - // sp * (addr' - addr) = 0 - assert_zero_transition(builder, ADDR_BASE, sp * (addr_next.clone() - addr.clone())); - - // Constraint 2: RESPAN moves to the next hash block (Poseidon2 = 32 rows). - // respan_flag * (addr' - addr - HASH_CYCLE_LEN) = 0 - let hash_cycle_len: AB::Expr = AB::Expr::from_u16(HASH_CYCLE_LEN as u16); - let respan_flag = op_flags.respan(); - assert_zero_transition( - builder, - ADDR_BASE + 1, - respan_flag * (addr_next - addr.clone() - hash_cycle_len), - ); - - // Constraint 3: HALT forces addr = 0. - // halt_flag * addr = 0 - let halt_flag = op_flags.halt(); - assert_zero_integrity(builder, ADDR_BASE + 2, halt_flag * addr); -} - -/// Enforces control flow constraints. -/// -/// When outside a basic block (sp = 0), only control flow operations can execute. -/// This is expressed as: fctrl = 1 - sp, or equivalently: (1 - sp) * (1 - fctrl) = 0 -/// -/// Control flow operations include: -/// - SPAN, JOIN, SPLIT, LOOP (block start operations) -/// - END, REPEAT, RESPAN, HALT (block transition operations) -/// - DYN, DYNCALL, CALL, SYSCALL (procedure invocations) -/// -/// Constraints: -/// 1. When sp = 0, control_flow must be 1: (1 - sp) * (1 - fctrl) = 0 -fn enforce_control_flow_constraints( - builder: &mut AB, - cols: &DecoderColumns, - op_flags: &OpFlags, -) where - AB: TaggingAirBuilderExt, -{ - let sp = cols.in_span.clone(); - - // Constraint: sp and control_flow must be complementary. - // 1 - sp - fctrl = 0 - let ctrl_flag = op_flags.control_flow(); - assert_zero_integrity(builder, CONTROL_FLOW_BASE, AB::Expr::ONE - sp - ctrl_flag); -} + // ============================================= + // Batch flag constraints + // ============================================= + // Batch flags (c0, c1, c2) encode the number of op groups in the current batch. + // This matters for the last batch in a basic block (or the only batch), since all + // other batches must be completely full (8 groups). + // + // The flags are mutually exclusive (exactly one is set during SPAN/RESPAN). + // Unused hasher lanes must be zero to prevent the prover from smuggling + // arbitrary values through unused group slots. The zeroed lanes cascade: + // + // Groups | Zeroed lanes + // -------+-------------- + // 8 | (none) + // 4 | h4..h7 + // 2 | h2..h7 + // 1 | h1..h7 + { + // Batch flag bits must be binary. + builder.assert_bools([bc0, bc1, bc2]); + + // 8 groups: c0 = 1 (c1, c2 don't matter). + let groups_8 = bc0; + // 4 groups: c0 = 0, c1 = 1, c2 = 0. + let not_bc0 = bc0.into().not(); + let groups_4 = not_bc0.clone() * bc1 * bc2.into().not(); + // 2 groups: c0 = 0, c1 = 0, c2 = 1. + let groups_2 = not_bc0.clone() * bc1.into().not() * bc2; + // 1 group: c0 = 0, c1 = 1, c2 = 1. + let groups_1 = not_bc0 * bc1 * bc2; + + // Combined flags for the cascading lane-zeroing constraints. + let groups_1_or_2 = groups_1.clone() + groups_2.clone(); + let groups_1_or_2_or_4 = groups_1_or_2.clone() + groups_4.clone(); + + let span_or_respan = op_flags.span() + op_flags.respan(); + + // During SPAN/RESPAN, exactly one batch flag must be set. + builder.assert_eq(span_or_respan.clone(), groups_1_or_2_or_4.clone() + groups_8); + + // Outside SPAN/RESPAN, all batch flags must be zero. + builder.when(span_or_respan.not()).assert_zero(bc0 + bc1 + bc2); + + // Fewer than 8 groups: h4..h7 are unused and must be zero. + { + let builder = &mut builder.when(groups_1_or_2_or_4); + for i in 0..4 { + builder.assert_zero(hasher_state[4 + i]); + } + } -fn assert_zero_transition(builder: &mut AB, idx: usize, expr: AB::Expr) { - let mut idx = idx; - tagged_assert_zero(builder, &DECODER_TAGS, &mut idx, expr); -} + // Fewer than 4 groups: h2..h3 are also unused. + { + let builder = &mut builder.when(groups_1_or_2); + for i in 0..2 { + builder.assert_zero(hasher_state[2 + i]); + } + } -fn assert_zero_integrity(builder: &mut AB, idx: usize, expr: AB::Expr) { - let mut idx = idx; - tagged_assert_zero_integrity(builder, &DECODER_TAGS, &mut idx, expr); -} + // Only 1 group: h1 is also unused. + builder.when(groups_1).assert_zero(hasher_state[1]); + } -fn assert_zero_first_row(builder: &mut AB, idx: usize, expr: AB::Expr) { - let id = DECODER_BASE_ID + idx; - let name = DECODER_NAMES[idx]; - builder.tagged(id, name, |builder| { - builder.when_first_row().assert_zero(expr); - }); + // ============================================= + // Block address (addr) constraints + // ============================================= + // The block address links decoder rows to the hasher table, which computes Poseidon2 + // hashes of MAST node contents. Each hash uses a controller input/output pair + // (CONTROLLER_ROWS_PER_PERMUTATION = 2 rows in the hasher table). + // + // When RESPAN starts a new batch within the same span, the hasher table needs a new + // controller pair, so addr increments by CONTROLLER_ROWS_PER_PERMUTATION. + + // Inside a basic block, addr must stay the same (all ops in one batch share the same + // hasher-table address). + builder.when_transition().when(in_span).assert_eq(addr_next, addr); + + // RESPAN moves to the next hash block (addr += CONTROLLER_ROWS_PER_PERMUTATION). + builder + .when_transition() + .when(op_flags.respan()) + .assert_eq(addr_next, addr + CONTROLLER_ROWS_PER_PERM_FELT); + + // HALT forces addr = 0 (execution ends at the root block). + builder.when(op_flags.halt()).assert_zero(addr); + + // ============================================= + // Control flow constraint + // ============================================= + // Every row is either inside a basic block (in_span = 1) or executing a control-flow + // operation (f_ctrl = 1). These two states are mutually exclusive and exhaustive. + // + // f_ctrl covers: JOIN, SPLIT, LOOP, SPAN, RESPAN, END, REPEAT, HALT, DYN, DYNCALL, + // CALL, SYSCALL. + // + // This also implies in_span = 1 - f_ctrl, so in_span is automatically 0 on + // control-flow rows and 1 otherwise (given that in_span is binary, enforced above). + builder.assert_one(in_span + op_flags.control_flow()); + + // Last-row boundary: the final row must be HALT. The processor pads the trace with + // HALT rows and the absorbing transition constraint keeps them there; this constraint + // makes it explicit in the AIR. + // + // TODO: with HALT guaranteed on the last row, some `when_transition()` guards in this + // module may be redundant (HALT is absorbing and addr = 0). Audit which can be removed. + builder.when_last_row().assert_one(op_flags.halt()); } diff --git a/air/src/constraints/decoder/tests.rs b/air/src/constraints/decoder/tests.rs index 8d31c70abd..e69de29bb2 100644 --- a/air/src/constraints/decoder/tests.rs +++ b/air/src/constraints/decoder/tests.rs @@ -1,18 +0,0 @@ -//! Tests for decoder constraints. - -use super::{CONSTRAINT_DEGREES, NUM_CONSTRAINTS}; - -// CONSTRAINT COUNT TEST -// ================================================================================================ - -#[test] -fn test_array_sizes() { - // 7 op bits binary + 2 extra columns + 3 op-bit group constraints + 3 batch flags - // + 14 general constraints - // + 1 sp binary + 2 sp transitions + 5 group count constraints - // + 2 op group decoding + 4 op index constraints + 9 batch flag constraints - // + 3 block address constraints + 1 control flow constraint - // + 1 additional decoder constraint (see DECODER_NAMES) - assert_eq!(NUM_CONSTRAINTS, 57); - assert_eq!(CONSTRAINT_DEGREES.len(), NUM_CONSTRAINTS); -} diff --git a/air/src/constraints/ext_field.rs b/air/src/constraints/ext_field.rs index f1398cb97d..2e100bef23 100644 --- a/air/src/constraints/ext_field.rs +++ b/air/src/constraints/ext_field.rs @@ -1,42 +1,59 @@ //! Quadratic extension expression helpers (F_p[u] / u^2 - 7). //! //! This keeps constraint code readable when manipulating extension elements in terms of -//! base-field expressions. +//! base-field expressions. All arithmetic requires `E: PrimeCharacteristicRing`. use core::ops::{Add, Mul, Sub}; use miden_core::field::PrimeCharacteristicRing; +use miden_crypto::stark::air::AirBuilder; // Quadratic non-residue for the extension: u^2 = 7. const W: u16 = 7; /// Quadratic extension element represented as (c0 + c1 * u). -#[derive(Clone, Debug)] +/// +/// `#[repr(C)]` guarantees layout-compatible with `[E; 2]`, so this can be used +/// inside `#[repr(C)]` column structs in place of `[T; 2]`. +#[derive(Clone, Copy, Debug)] +#[repr(C)] pub struct QuadFeltExpr(pub E, pub E); +// CONSTRUCTORS AND CONVERSIONS +// ================================================================================================ + impl QuadFeltExpr { - /// Constructs a new extension element from two base-field values. - pub fn new>(c0: &V, c1: &V) -> Self { - Self(c0.clone().into(), c1.clone().into()) + /// Constructs a new extension element from two base-field components. + /// + /// Accepts any type convertible to `E`, e.g. `Var` when `E = Expr`. + pub fn new(c0: impl Into, c1: impl Into) -> Self { + Self(c0.into(), c1.into()) } /// Returns the base-field components `[c0, c1]`. pub fn into_parts(self) -> [E; 2] { [self.0, self.1] } + + /// Converts `QuadFeltExpr` into `QuadFeltExpr` (e.g. Var -> Expr). + /// + /// A blanket `From` impl is not possible because `From> for QuadFeltExpr` + /// conflicts with std's `impl From for T` when `V == E`. + pub fn into_expr(self) -> QuadFeltExpr + where + E: Into, + { + QuadFeltExpr(self.0.into(), self.1.into()) + } } -impl QuadFeltExpr -where - E: Clone + Add + Mul + PrimeCharacteristicRing, -{ - /// Returns `self * other`. - pub fn mul(self, rhs: Self) -> Self { - let w = E::from_u16(W); - // (a0 + a1·u)(b0 + b1·u) = (a0·b0 + 7·a1·b1) + (a0·b1 + a1·b0)·u - let c0 = self.0.clone() * rhs.0.clone() + w * (self.1.clone() * rhs.1.clone()); - let c1 = self.0 * rhs.1 + self.1 * rhs.0; - Self(c0, c1) +// EXTENSION FIELD ARITHMETIC +// ================================================================================================ + +impl QuadFeltExpr { + /// Returns `self + self`. + pub fn double(self) -> Self { + Self(self.0.double(), self.1.double()) } /// Returns `self * self`. @@ -47,14 +64,25 @@ where let a1_sq = self.1.clone() * self.1.clone(); let a0_a1 = self.0 * self.1; let c0 = a0_sq + w * a1_sq; - let c1 = a0_a1.clone() + a0_a1; + let c1 = a0_a1.double(); + Self(c0, c1) + } + + /// Extension multiplication: (a0 + a1·u)(b0 + b1·u) in F_p[u]/(u² - 7). + fn ext_mul(self, rhs: Self) -> Self { + let w = E::from_u16(W); + let c0 = self.0.clone() * rhs.0.clone() + w * (self.1.clone() * rhs.1.clone()); + let c1 = self.0 * rhs.1 + self.1 * rhs.0; Self(c0, c1) } } +// QFE-QFE ARITHMETIC TRAIT IMPLS +// ================================================================================================ + impl Add for QuadFeltExpr where - E: Add, + E: PrimeCharacteristicRing, { type Output = Self; @@ -65,7 +93,7 @@ where impl Sub for QuadFeltExpr where - E: Sub, + E: PrimeCharacteristicRing, { type Output = Self; @@ -74,42 +102,45 @@ where } } -impl Add for QuadFeltExpr +impl Mul for QuadFeltExpr where - E: Add, + E: PrimeCharacteristicRing, { type Output = Self; - fn add(self, rhs: E) -> Self { - Self(self.0 + rhs, self.1) + fn mul(self, rhs: Self) -> Self { + self.ext_mul(rhs) } } -impl Sub for QuadFeltExpr +// SCALAR ARITHMETIC +// ================================================================================================ + +impl Add for QuadFeltExpr where - E: Sub, + E: PrimeCharacteristicRing, { type Output = Self; - fn sub(self, rhs: E) -> Self { - Self(self.0 - rhs, self.1) + fn add(self, rhs: E) -> Self { + Self(self.0 + rhs, self.1) } } -impl Mul for QuadFeltExpr +impl Sub for QuadFeltExpr where - E: Clone + Add + Mul + PrimeCharacteristicRing, + E: PrimeCharacteristicRing, { type Output = Self; - fn mul(self, rhs: Self) -> Self { - QuadFeltExpr::mul(self, rhs) + fn sub(self, rhs: E) -> Self { + Self(self.0 - rhs, self.1) } } impl Mul for QuadFeltExpr where - E: Clone + Mul, + E: PrimeCharacteristicRing, { type Output = Self; @@ -117,3 +148,17 @@ where Self(self.0 * rhs.clone(), self.1 * rhs) } } + +// QUAD FELT AIR BUILDER EXTENSION +// ================================================================================================ + +/// Extension trait for asserting equality of quadratic extension field expressions. +pub trait QuadFeltAirBuilder: AirBuilder { + /// Asserts `lhs == rhs` component-wise for quadratic extension field elements. + fn assert_eq_quad(&mut self, lhs: QuadFeltExpr, rhs: QuadFeltExpr) { + self.assert_eq(lhs.0, rhs.0); + self.assert_eq(lhs.1, rhs.1); + } +} + +impl QuadFeltAirBuilder for AB {} diff --git a/air/src/constraints/mod.rs b/air/src/constraints/mod.rs index 5e34cd4327..c46e5b7452 100644 --- a/air/src/constraints/mod.rs +++ b/air/src/constraints/mod.rs @@ -1,6 +1,3 @@ -// `AB::Var: Copy` but clippy flags `.clone()` on it -#![allow(clippy::clone_on_copy)] - //! Miden VM Constraints //! //! This module contains the constraint functions for the Miden VM processor. @@ -22,20 +19,23 @@ //! //! Additional components (decoder, chiplets) are introduced in later constraint chunks. -use miden_crypto::stark::air::{ExtensionBuilder, LiftedAirBuilder, WindowAccess}; +use chiplets::selectors::ChipletSelectors; +use miden_crypto::stark::air::{ExtensionBuilder, WindowAccess}; -use crate::{Felt, MainTraceRow, trace::Challenges}; +use crate::{MainCols, MidenAirBuilder, trace::Challenges}; pub mod bus; pub mod chiplets; +pub mod columns; +pub mod constants; pub mod decoder; pub mod ext_field; -mod op_flags; +pub(crate) mod op_flags; pub mod public_inputs; pub mod range; pub mod stack; pub mod system; -pub mod tagging; +pub mod utils; // ENTRY POINTS // ================================================================================================ @@ -43,18 +43,18 @@ pub mod tagging; /// Enforces all main trace constraints. pub fn enforce_main( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, + selectors: &ChipletSelectors, + op_flags: &op_flags::OpFlags, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { - system::enforce_main(builder, local, next); + system::enforce_main(builder, local, next, op_flags); range::enforce_main(builder, local, next); - - let op_flags = op_flags::OpFlags::new(op_flags::ExprDecoderAccess::<_, AB::Expr>::new(local)); - stack::enforce_main(builder, local, next, &op_flags); - decoder::enforce_main(builder, local, next, &op_flags); - chiplets::enforce_main(builder, local, next); + stack::enforce_main(builder, local, next, op_flags); + decoder::enforce_main(builder, local, next, op_flags); + chiplets::enforce_main(builder, local, next, selectors); } /// Enforces all auxiliary (bus) constraints: boundary + transition. @@ -65,51 +65,34 @@ pub fn enforce_main( /// 3. **`reduced_aux_values`** -- final values satisfy bus identities pub fn enforce_bus( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, + selectors: &ChipletSelectors, + op_flags: &op_flags::OpFlags, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { let r = builder.permutation_randomness(); let challenges = Challenges::::new(r[0].into(), r[1].into()); - let op_flags = op_flags::OpFlags::new(op_flags::ExprDecoderAccess::<_, AB::Expr>::new(local)); - enforce_bus_boundary(builder); - - range::bus::enforce_bus(builder, local); - stack::bus::enforce_bus(builder, local, next, &op_flags, &challenges); - decoder::bus::enforce_bus(builder, local, next, &op_flags, &challenges); - chiplets::bus::enforce_bus(builder, local, next, &op_flags, &challenges); -} - -/// Enforces boundary constraints on all auxiliary columns. -/// -/// **First row:** running-product columns start at 1, LogUp sums start at 0. -/// -/// **Last row:** each aux column must equal its committed final value (from -/// `permutation_values`). This binds the aux trace polynomial to the values checked -/// by `reduced_aux_values`, preventing a malicious prover from committing arbitrary -/// finals that satisfy the bus identity without matching the actual trace. -fn enforce_bus_boundary(builder: &mut AB) -where - AB: LiftedAirBuilder, -{ // First row: running products = 1, LogUp sums = 0. enforce_bus_first_row(builder); - // Last row: bind aux trace to committed finals checked by `reduced_aux_values`. + // Last row: bind aux trace to committed finals checked by `reduced_aux_values`, + // preventing a malicious prover from committing arbitrary finals. enforce_bus_last_row(builder); + + range::bus::enforce_bus(builder, local, op_flags, &challenges, selectors); + stack::bus::enforce_bus(builder, local, next, op_flags, &challenges); + decoder::bus::enforce_bus(builder, local, next, op_flags, &challenges); + chiplets::bus::enforce_bus(builder, local, next, op_flags, &challenges, selectors); } fn enforce_bus_first_row(builder: &mut AB) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { use bus::indices::*; - use tagging::{TaggingAirBuilderExt, ids::TAG_BUS_BOUNDARY_BASE}; - - const N: usize = 8; - let ids: [usize; N] = core::array::from_fn(|i| TAG_BUS_BOUNDARY_BASE + i); let aux = builder.permutation(); let aux_local = aux.current_slice(); @@ -123,33 +106,24 @@ where let b_rng = aux_local[B_RANGE]; let v_wir = aux_local[V_WIRING]; - builder.tagged_list(ids, "bus.boundary.first_row", |builder| { - let mut first = builder.when_first_row(); - first.assert_one_ext(p1); - first.assert_one_ext(p2); - first.assert_one_ext(p3); - first.assert_one_ext(s_aux); - first.assert_one_ext(b_hk); - first.assert_one_ext(b_ch); - first.assert_zero_ext(b_rng); - first.assert_zero_ext(v_wir); - }); + let mut first = builder.when_first_row(); + first.assert_one_ext(p1); + first.assert_one_ext(p2); + first.assert_one_ext(p3); + first.assert_one_ext(s_aux); + first.assert_one_ext(b_hk); + first.assert_one_ext(b_ch); + first.assert_zero_ext(b_rng); + first.assert_zero_ext(v_wir); } fn enforce_bus_last_row(builder: &mut AB) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { - use tagging::{ - TaggingAirBuilderExt, - ids::{TAG_BUS_BOUNDARY_BASE, TAG_BUS_BOUNDARY_FIRST_ROW_COUNT}, - }; - use crate::trace::AUX_TRACE_WIDTH; const N: usize = AUX_TRACE_WIDTH; - let ids: [usize; N] = - core::array::from_fn(|i| TAG_BUS_BOUNDARY_BASE + TAG_BUS_BOUNDARY_FIRST_ROW_COUNT + i); let cols: [AB::VarEF; N] = { let aux = builder.permutation(); @@ -161,10 +135,8 @@ where core::array::from_fn(|i| f[i].clone().into()) }; - builder.tagged_list(ids, "bus.boundary.last_row", |builder| { - let mut last = builder.when_last_row(); - for (col, expected) in cols.into_iter().zip(finals) { - last.assert_eq_ext(col, expected); - } - }); + let mut last = builder.when_last_row(); + for (col, expected) in cols.into_iter().zip(finals) { + last.assert_eq_ext(col, expected); + } } diff --git a/air/src/constraints/op_flags/mod.rs b/air/src/constraints/op_flags/mod.rs index 27757b6d04..3e1d0d970a 100644 --- a/air/src/constraints/op_flags/mod.rs +++ b/air/src/constraints/op_flags/mod.rs @@ -4,13 +4,18 @@ //! throughout stack constraints to gate constraint enforcement based on which operation //! is currently being executed. //! -//! ## Operation Degree Categories +//! ## Opcode Bit Layout //! -//! Operations are grouped by their flag computation degree: -//! - **Degree 7**: 64 operations (opcodes 0-63) - use all 7 op bits -//! - **Degree 6**: 8 operations (opcodes 64-79) - u32 operations -//! - **Degree 5**: 16 operations (opcodes 80-95) - use op_bit_extra[0] -//! - **Degree 4**: 8 operations (opcodes 96-127) - use op_bit_extra[1] +//! Each opcode is 7 bits `[b0, b1, b2, b3, b4, b5, b6]` (b0 = LSB): +//! +//! ```text +//! b6 b5 b4 | Degree | Opcodes | Description +//! ---------+--------+----------+--------------------------- +//! 0 * * | 7 | 0 - 63 | All 7 bits discriminate +//! 1 0 0 | 6 | 64 - 79 | u32 ops (b0 unused) +//! 1 0 1 | 5 | 80 - 95 | Uses extra[0] column +//! 1 1 * | 4 | 96 - 127 | Uses extra[1] column +//! ``` //! //! ## Composite Flags //! @@ -19,16 +24,16 @@ //! - `left_shift_at(i)`: stack shifts left at position i //! - `right_shift_at(i)`: stack shifts right at position i -use core::marker::PhantomData; +use core::array; -use miden_core::{field::PrimeCharacteristicRing, operations::opcodes}; +use miden_core::{ + field::{Algebra, PrimeCharacteristicRing}, + operations::opcodes, +}; +use crate::constraints::{decoder::columns::DecoderCols, stack::columns::StackCols}; #[cfg(test)] -use crate::trace::decoder::NUM_OP_BITS; -use crate::trace::{ - decoder::{IS_LOOP_FLAG_COL_IDX, OP_BITS_EXTRA_COLS_RANGE, OP_BITS_RANGE}, - stack::{B0_COL_IDX, H0_COL_IDX}, -}; +use crate::trace::decoder::{NUM_OP_BITS, OP_BITS_RANGE}; // CONSTANTS // ================================================================================================ @@ -70,10 +75,13 @@ const DEGREE_5_OPCODE_ENDS: usize = DEGREE_5_OPCODE_STARTS + 15; const DEGREE_4_OPCODE_STARTS: usize = DEGREE_5_OPCODE_ENDS + 1; /// Opcode at which degree 4 operations end. -#[allow(dead_code)] +#[cfg(test)] const DEGREE_4_OPCODE_ENDS: usize = DEGREE_4_OPCODE_STARTS + 31; -// INTERNAL HELPERS +/// Op bit selectors: `bits[k][0]` = 1 - b_k (negation), `bits[k][1]` = b_k (value). +type OpBits = [[E; 2]; 7]; + +// OP FLAGS // ================================================================================================ /// Operation flags for all stack operations. @@ -85,7 +93,6 @@ const DEGREE_4_OPCODE_ENDS: usize = DEGREE_4_OPCODE_STARTS + 31; /// This struct is parameterized by the expression type `E` which allows it to work /// with both concrete field elements (for testing) and symbolic expressions (for /// constraint generation). -#[allow(dead_code)] pub struct OpFlags { degree7_op_flags: [E; NUM_DEGREE_7_OPS], degree6_op_flags: [E; NUM_DEGREE_6_OPS], @@ -100,127 +107,651 @@ pub struct OpFlags { control_flow: E, overflow: E, u32_rc_op: E, + + // Next-row control flow flags (degree 4) + end_next: E, + repeat_next: E, + respan_next: E, + halt_next: E, } -/// Helper trait for accessing decoder columns from a trace row. -pub trait DecoderAccess { - /// Returns the value of op_bit[index] from the decoder. - fn op_bit(&self, index: usize) -> E; +impl OpFlags +where + E: PrimeCharacteristicRing, +{ + /// Creates a new OpFlags instance by computing all flags from the decoder columns. + /// + /// Builds flags for the current row from `decoder`/`stack`, and also computes + /// degree-4 next-row control flow flags (END, REPEAT, RESPAN, HALT) from + /// `decoder_next`, so that callers never need to construct a second `OpFlags`. + /// + /// The computation uses intermediate values to minimize multiplications: + /// - Degree 7 flags: computed hierarchically from op bits + /// - Degree 6 flags: u32 operations, share common prefix `100` + /// - Degree 5 flags: use op_bit_extra[0] for degree reduction + /// - Degree 4 flags: use op_bit_extra[1] for degree reduction + pub fn new( + decoder: &DecoderCols, + stack: &StackCols, + decoder_next: &DecoderCols, + ) -> Self + where + V: Copy, + E: Algebra, + { + // Op bit selectors: bits[k][v] returns bit k with value v (0=negated, 1=value). + let bits: OpBits = array::from_fn(|k| { + let val = decoder.op_bits[k]; + [E::ONE - val, val.into()] + }); + // --- Precomputed multi-bit selector products --- + // Each array is built iteratively: prev[i>>1] * bits[next_bit][i&1]. + // MSB expanded first so index = MSB*2^(n-1) + ... + LSB. + + // b32: index = b3*2 + b2. Shared by degree-6, degree-5, and degree-7. + let b32: [E; 4] = array::from_fn(|i| bits[3][i >> 1].clone() * bits[2][i & 1].clone()); + // b321: index = b3*4 + b2*2 + b1. Used by degree-6 and degree-7 (with nb6 prefix). + let b321: [E; 8] = array::from_fn(|i| b32[i >> 1].clone() * bits[1][i & 1].clone()); + // b3210: index = b3*8 + b2*4 + b1*2 + b0. Used by degree-5. + let b3210: [E; 16] = array::from_fn(|i| b321[i >> 1].clone() * bits[0][i & 1].clone()); + // b432: index = b4*4 + b3*2 + b2. Used by degree-4. Reuses b32. + let b432: [E; 8] = array::from_fn(|i| bits[4][i >> 2].clone() * b32[i & 3].clone()); + // b654: index = b5*2 + b4 (b6 always negated). Used by degree-7. + let b654: [E; 4] = array::from_fn(|i| { + bits[5][i >> 1].clone() * bits[4][i & 1].clone() * bits[6][0].clone() + }); + // b654321: all bits except b0. index = b5*16 + b4*8 + b3*4 + b2*2 + b1. Reuses b321. + let b654321: [E; 32] = array::from_fn(|i| b654[i >> 3].clone() * b321[i & 7].clone()); + + // --- Degree-7 flags (opcodes 0-63) --- + // 64 flags, one per opcode. Each is a degree-7 product of all 7 bit selectors. + // b654321 holds the pre-b0 intermediates (degree 6) that pair adjacent opcodes + // differing only in the LSB (e.g., MOVUP2 and MOVDN2). + let pre_b0 = PreB0Flags { + movup_or_movdn: [ + b654321[opcodes::MOVUP2 as usize >> 1].clone(), // MOVUP2 | MOVDN2 + b654321[opcodes::MOVUP3 as usize >> 1].clone(), // MOVUP3 | MOVDN3 + b654321[opcodes::MOVUP4 as usize >> 1].clone(), // MOVUP4 | MOVDN4 + b654321[opcodes::MOVUP5 as usize >> 1].clone(), // MOVUP5 | MOVDN5 + b654321[opcodes::MOVUP6 as usize >> 1].clone(), // MOVUP6 | MOVDN6 + b654321[opcodes::MOVUP7 as usize >> 1].clone(), // MOVUP7 | MOVDN7 + b654321[opcodes::MOVUP8 as usize >> 1].clone(), // MOVUP8 | MOVDN8 + ], + swapw2_or_swapw3: b654321[opcodes::SWAPW2 as usize >> 1].clone(), + advpopw_or_expacc: b654321[opcodes::ADVPOPW as usize >> 1].clone(), + }; + let degree7_op_flags: [E; NUM_DEGREE_7_OPS] = + array::from_fn(|i| b654321[i >> 1].clone() * bits[0][i & 1].clone()); + + // --- Degree-6 flags (opcodes 64-79, u32 operations) --- + // Prefix `100` (b6=1, b5=0, b4=0), discriminated by [b1, b2, b3]. + // Index = b3*4 + b2*2 + b1: + // - 0: U32ADD - 1: U32SUB + // - 2: U32MUL - 3: U32DIV + // - 4: U32SPLIT - 5: U32ASSERT2 + // - 6: U32ADD3 - 7: U32MADD + let degree6_prefix = bits[6][1].clone() * bits[5][0].clone() * bits[4][0].clone(); + let degree6_op_flags: [E; NUM_DEGREE_6_OPS] = + array::from_fn(|i| degree6_prefix.clone() * b321[i].clone()); + + // --- Degree-5 flags (opcodes 80-95) --- + // Uses extra[0] = b6*(1-b5)*b4 (degree 3), discriminated by [b0, b1, b2, b3]. + // Index = b3*8 + b2*4 + b1*2 + b0: + // - 0: HPERM - 1: MPVERIFY + // - 2: PIPE - 3: MSTREAM + // - 4: SPLIT - 5: LOOP + // - 6: SPAN - 7: JOIN + // - 8: DYN - 9: HORNERBASE + // - 10: HORNEREXT - 11: PUSH + // - 12: DYNCALL - 13: EVALCIRCUIT + // - 14: LOGPRECOMPILE - 15: (unused) + let degree5_extra: E = decoder.extra[0].into(); + let degree5_op_flags: [E; NUM_DEGREE_5_OPS] = + array::from_fn(|i| degree5_extra.clone() * b3210[i].clone()); + + // --- Degree-4 flags (opcodes 96-127) --- + // Uses extra[1] = b6*b5 (degree 2), discriminated by [b2, b3, b4]. + // Index = b4*4 + b3*2 + b2: + // - 0: MRUPDATE - 1: CRYPTOSTREAM + // - 2: SYSCALL - 3: CALL + // - 4: END - 5: REPEAT + // - 6: RESPAN - 7: HALT + let degree4_extra = decoder.extra[1]; + let degree4_op_flags: [E; NUM_DEGREE_4_OPS] = + array::from_fn(|i| b432[i].clone() * degree4_extra); + + // --- Composite flags --- + let composite = Self::compute_composite_flags::( + &bits, + °ree7_op_flags, + pre_b0, + °ree6_op_flags, + °ree5_op_flags, + °ree4_op_flags, + decoder, + stack, + ); + + // --- Next-row control flow flags (degree 4) --- + // Detect END, REPEAT, RESPAN, HALT on the *next* row. + // Prefix = extra[1]' * b4' = b6'*b5'*b4'. + // - END = 0b0111_0000 → prefix * (1-b3') * (1-b2') + // - REPEAT = 0b0111_0100 → prefix * (1-b3') * b2' + // - RESPAN = 0b0111_1000 → prefix * b3' * (1-b2') + // - HALT = 0b0111_1100 → prefix * b3' * b2' + let (end_next, repeat_next, respan_next, halt_next) = { + let prefix: E = decoder_next.extra[1].into(); + let prefix = prefix * decoder_next.op_bits[4]; + // b32_next[i] = b3'[i>>1] * b2'[i&1], same pattern as b32 above. + let b32_next: [E; 4] = { + let b3 = decoder_next.op_bits[3]; + let b2 = decoder_next.op_bits[2]; + let bits_next: [[E; 2]; 2] = [[E::ONE - b2, b2.into()], [E::ONE - b3, b3.into()]]; + array::from_fn(|i| bits_next[1][i >> 1].clone() * bits_next[0][i & 1].clone()) + }; + ( + prefix.clone() * b32_next[0].clone(), // END: (1-b3') * (1-b2') + prefix.clone() * b32_next[1].clone(), // REPEAT: (1-b3') * b2' + prefix.clone() * b32_next[2].clone(), // RESPAN: b3' * (1-b2') + prefix * b32_next[3].clone(), // HALT: b3' * b2' + ) + }; - /// Returns the value of op_bit_extra[index] from the decoder. - fn op_bit_extra(&self, index: usize) -> E; + Self { + degree7_op_flags, + degree6_op_flags, + degree5_op_flags, + degree4_op_flags, + no_shift_flags: composite.no_shift, + left_shift_flags: composite.left_shift, + right_shift_flags: composite.right_shift, + left_shift: composite.left_shift_scalar, + right_shift: composite.right_shift_scalar, + control_flow: composite.control_flow, + overflow: composite.overflow, + u32_rc_op: composite.u32_rc_op, + end_next, + repeat_next, + respan_next, + halt_next, + } + } - /// Returns the h0 helper register (overflow indicator). - fn overflow_register(&self) -> E; + // COMPOSITE FLAGS + // ============================================================================================ - /// Returns the stack depth (b0 column). - fn stack_depth(&self) -> E; + /// Computes composite stack-shift flags, control flow flag, and overflow flag. + /// + /// Each `no_shift[d]` / `left_shift[d]` / `right_shift[d]` is the sum of all + /// operation flags whose stack impact matches that shift at depth `d`. These are + /// built incrementally: each depth adds or removes operations relative to the + /// previous depth. + #[allow(clippy::too_many_arguments)] + fn compute_composite_flags( + bits: &OpBits, + deg7: &[E; NUM_DEGREE_7_OPS], + pre_b0: PreB0Flags, + deg6: &[E; NUM_DEGREE_6_OPS], + deg5: &[E; NUM_DEGREE_5_OPS], + deg4: &[E; NUM_DEGREE_4_OPS], + decoder: &DecoderCols, + stack: &StackCols, + ) -> CompositeFlags + where + V: Copy, + E: Algebra, + { + let PreB0Flags { + movup_or_movdn, + swapw2_or_swapw3, + advpopw_or_expacc, + } = pre_b0; + + // --- Op flag accessors --- + let op7 = |op: u8| deg7[op as usize].clone(); + let op6 = |op: u8| deg6[get_op_index(op)].clone(); + let op5 = |op: u8| deg5[get_op_index(op)].clone(); + let op4 = |op: u8| deg4[get_op_index(op)].clone(); + + // --- Shared bit-prefix selectors --- + + // prefix_01: (1-b6)*b5 — degree 2, shared by prefix_010 and prefix_011 + let prefix_01 = bits[6][0].clone() * bits[5][1].clone(); + + // prefix_100: b6*(1-b5)*(1-b4) — degree 3, all u32 operations (opcodes 64-79) + let prefix_100 = bits[6][1].clone() * bits[5][0].clone() * bits[4][0].clone(); + + // --- END operation with loop flag --- + let is_loop_end = decoder.end_block_flags().is_loop; + let end_loop_flag = op4(opcodes::END) * is_loop_end; + + // ── No-shift flags ────────────────────────────────────────── + // no_shift[d] = sum of op flags whose stack position d is unchanged. + // Built incrementally via accumulate_depth_deltas. + + let no_shift_depth0 = E::sum_array::<10>(&[ + // +NOOP — no-op + op7(opcodes::NOOP), + // +U32ASSERT2 — checks s0,s1 are u32, no change + op6(opcodes::U32ASSERT2), + // +MPVERIFY — verifies Merkle path in place + op5(opcodes::MPVERIFY), + // +SPAN — control flow: begins basic block + op5(opcodes::SPAN), + // +JOIN — control flow: begins join block + op5(opcodes::JOIN), + // +EMIT — emits event, no stack change + op7(opcodes::EMIT), + // +RESPAN — control flow: next batch in basic block + op4(opcodes::RESPAN), + // +HALT — control flow: ends program + op4(opcodes::HALT), + // +CALL — control flow: enters procedure + op4(opcodes::CALL), + // +END*(1-loop) — no-shift only when NOT ending a loop body + op4(opcodes::END) * (E::ONE - is_loop_end), + ]); + + // +opcodes[0..8] –NOOP — unary ops that modify only s0 (EQZ, NEG, INV, INCR, NOT, MLOAD) + let no_shift_depth1 = deg7[0..8].iter().cloned().sum::() - op7(opcodes::NOOP); + + // +U32ADD +U32SUB +U32MUL +U32DIV — consume s0,s1, produce 2 results + let u32_arith_group = prefix_100.clone() * bits[3][0].clone(); + + let no_shift_depth4 = E::sum_array::<5>(&[ + // +MOVUP3|MOVDN3 — permute s0..s3 + movup_or_movdn[1].clone(), + // +ADVPOPW|EXPACC — overwrite s0..s3 in place + advpopw_or_expacc.clone(), + // +SWAPW2|SWAPW3 — swap s0..s3 with s8+ (leaves at depth 8) + swapw2_or_swapw3.clone(), + // +EXT2MUL — ext field multiply on s0..s3 + op7(opcodes::EXT2MUL), + // +MRUPDATE — Merkle root update on s0..s3 + op4(opcodes::MRUPDATE), + ]); + + // SWAPW2/SWAPW3 depth lifecycle: + // Op Swaps No-shift depths + // SWAPW2 s[0..4] ↔ s[8..12] 0-7, 12-15 + // SWAPW3 s[0..4] ↔ s[12..16] 0-7, 8-11 + // Combined pair: enters at 4, leaves at 8, re-enters at 12 (minus SWAPW3) + + let no_shift_depth8 + // +MOVUP7|MOVDN7 — permute s0..s7 + = movup_or_movdn[5].clone() + // +SWAPW — swap s0..s3 with s4..s7, only affects depths 0-7 + + op7(opcodes::SWAPW) + // –SWAPW2|SWAPW3 — target range s8+ now affected at this depth + - swapw2_or_swapw3.clone(); + + let no_shift_depth12 + // +SWAPW2|SWAPW3 — pair re-enters (both leave depths 12+ untouched) + = swapw2_or_swapw3.clone() + // +HPERM — Poseidon2 permutation on s0..s11 + + op5(opcodes::HPERM) + // –SWAPW3 — SWAPW3 swaps s0..s3 with s12..s15, so s12+ still changes + - op7(opcodes::SWAPW3); + + let no_shift = accumulate_depth_deltas([ + // d=0 + no_shift_depth0, + // d=1 + no_shift_depth1, + // +SWAP — swap s0,s1 + // +u32_arith_group — U32ADD..U32DIV: consume s0,s1, produce 2 results + op7(opcodes::SWAP) + u32_arith_group, + // +MOVUP2|MOVDN2 — permute s0..s2 + movup_or_movdn[0].clone(), + // d=4 + no_shift_depth4, + // +MOVUP4|MOVDN4 — permute s0..s4 + movup_or_movdn[2].clone(), + // +MOVUP5|MOVDN5 — permute s0..s5 + movup_or_movdn[3].clone(), + // +MOVUP6|MOVDN6 — permute s0..s6 + movup_or_movdn[4].clone(), + // d=8 + no_shift_depth8, + // +MOVUP8|MOVDN8 — permute s0..s8 + movup_or_movdn[6].clone(), + // d=10 (unchanged) + E::ZERO, + // d=11 (unchanged) + E::ZERO, + // d=12 + no_shift_depth12, + // d=13 (unchanged) + E::ZERO, + // d=14 (unchanged) + E::ZERO, + // d=15 (unchanged) + E::ZERO, + ]); + + // ── Left-shift flags ──────────────────────────────────────── + // left_shift[d] = sum of op flags causing a left shift at depth d. + // Built incrementally via accumulate_depth_deltas. + + // All MOVUP/MOVDN pairs share bits [1..6] and differ only in b0: + // b0 = 0 → MOVUP{w}, b0 = 1 → MOVDN{w} (for all widths 2..8) + let all_mov_pairs = E::sum_array::<7>(&movup_or_movdn); + let all_movdn = all_mov_pairs.clone() * bits[0][1].clone(); + + let left_shift_depth1 = E::sum_array::<11>(&[ + // +ASSERT — consumes s0 (must be 1) + op7(opcodes::ASSERT), + // +MOVDN{2..8} — move s0 down, shifts left above + all_movdn, + // +DROP — discards s0 + op7(opcodes::DROP), + // +MSTORE — pops address s0, stores s1 to memory + op7(opcodes::MSTORE), + // +MSTOREW — pops address s0, stores word to memory + op7(opcodes::MSTOREW), + // +(opcode 47) — unused opcode slot + deg7[47].clone(), + // +SPLIT — control flow: pops condition from s0 + op5(opcodes::SPLIT), + // +LOOP — control flow: pops condition from s0 + op5(opcodes::LOOP), + // +END*loop — END when ending a loop: pops the loop flag + end_loop_flag.clone(), + // +DYN — control flow: consumes s0..s3 (target hash) + op5(opcodes::DYN), + // +DYNCALL — control flow: consumes s0..s3 (target hash) + op5(opcodes::DYNCALL), + ]); + + // +opcodes[32..40] –ASSERT — binary ops (EQ, ADD, MUL, AND, OR, U32AND, U32XOR) + // that consume s0,s1 and produce 1 result; ASSERT already counted at depth 1 + let left_shift_depth2 = deg7[32..40].iter().cloned().sum::() - op7(opcodes::ASSERT); + + let left_shift_depth3 + // +CSWAP — pops condition s0, conditionally swaps s1,s2; net -1 at depth 3 + = op7(opcodes::CSWAP) + // +U32ADD3 — pops s0,s1,s2, pushes 2 results; net -1 at depth 3 + + op6(opcodes::U32ADD3) + // +U32MADD — pops s0,s1,s2, pushes s0*s1+s2 as 2 results; net -1 at depth 3 + + op6(opcodes::U32MADD) + // –MOVDN2 — only shifts left at depths 1..2 + - op7(opcodes::MOVDN2); + + let left_shift = accumulate_depth_deltas([ + // d=0 (left shift undefined at depth 0) + E::ZERO, + // d=1 + left_shift_depth1, + // d=2 + left_shift_depth2, + // d=3 + left_shift_depth3, + // –MOVDN3 — only shifts left at depths 1..3 + -op7(opcodes::MOVDN3), + // +MLOADW — pops address, loads 4 values; net -1 at depth 5 + // –MOVDN4 — only shifts left at depths 1..4 + op7(opcodes::MLOADW) - op7(opcodes::MOVDN4), + // –MOVDN5 — only shifts left at depths 1..5 + -op7(opcodes::MOVDN5), + // –MOVDN6 — only shifts left at depths 1..6 + -op7(opcodes::MOVDN6), + // –MOVDN7 — only shifts left at depths 1..7 + -op7(opcodes::MOVDN7), + // +CSWAPW — pops condition, swaps words s1..s4 with s5..s8; net -1 from depth 9 + // –MOVDN8 — only shifts left at depths 1..8 + op7(opcodes::CSWAPW) - op7(opcodes::MOVDN8), + // d=10 (unchanged) + E::ZERO, + // d=11 (unchanged) + E::ZERO, + // d=12 (unchanged) + E::ZERO, + // d=13 (unchanged) + E::ZERO, + // d=14 (unchanged) + E::ZERO, + // d=15 (unchanged) + E::ZERO, + ]); + + // ── Right-shift flags ─────────────────────────────────────── + // right_shift[d] = sum of op flags causing a right shift at depth d. + // Built incrementally via accumulate_depth_deltas. + + let all_movup = all_mov_pairs * bits[0][0].clone(); + let right_shift_depth0 + // +deg7[48..64] — PAD, DUP0..DUP15, ADVPOP, SDEPTH, CLK: push one element + = deg7[48..64].iter().cloned().sum::() + // +PUSH — push immediate value + + op5(opcodes::PUSH) + // +MOVUP{2..8} — move element from below to top, shifting s0..s{w-1} right + + all_movup; + + let right_shift = accumulate_depth_deltas([ + // d=0 + right_shift_depth0, + // +U32SPLIT — pops one u32, pushes high and low halves; net +1 from depth 1 + op6(opcodes::U32SPLIT), + // –MOVUP2 — only shifts right at depths 0..1 + -op7(opcodes::MOVUP2), + // –MOVUP3 — only shifts right at depths 0..2 + -op7(opcodes::MOVUP3), + // –MOVUP4 — only shifts right at depths 0..3 + -op7(opcodes::MOVUP4), + // –MOVUP5 — only shifts right at depths 0..4 + -op7(opcodes::MOVUP5), + // –MOVUP6 — only shifts right at depths 0..5 + -op7(opcodes::MOVUP6), + // –MOVUP7 — only shifts right at depths 0..6 + -op7(opcodes::MOVUP7), + // –MOVUP8 — only shifts right at depths 0..7 + -op7(opcodes::MOVUP8), + // d=9 (unchanged) + E::ZERO, + // d=10 (unchanged) + E::ZERO, + // d=11 (unchanged) + E::ZERO, + // d=12 (unchanged) + E::ZERO, + // d=13 (unchanged) + E::ZERO, + // d=14 (unchanged) + E::ZERO, + // d=15 (unchanged) + E::ZERO, + ]); + + // ── Scalar shift flags ────────────────────────────────────── + // These are NOT the same expressions as right_shift[15] / left_shift[15]. + // They use low-degree bit prefixes that are algebraically equivalent on + // valid traces (exactly one opcode active), but produce lower-degree + // expressions for use in constraints that multiply these with other terms. + + // right_shift_scalar (degree 6): + // Uses prefix_011 (degree 3) instead of summing all 16 push-like degree-7 flags. + let prefix_011 = prefix_01.clone() * bits[4][1].clone(); + let right_shift_scalar + // +prefix_011 — PAD, DUP0..DUP15, ADVPOP, SDEPTH, CLK (opcodes 48-63) + = prefix_011 + // +PUSH — push immediate value + + op5(opcodes::PUSH) + // +U32SPLIT — pops one u32, pushes high and low halves + + op6(opcodes::U32SPLIT); + + // left_shift_scalar (degree 5): + // Uses prefix_010 (degree 3) instead of summing all left-shifting degree-7 flags. + // DYNCALL is intentionally excluded — it left-shifts the stack but uses + // decoder hasher state (h5) for overflow constraints, not the generic path. + let prefix_010 = prefix_01 * bits[4][0].clone(); + let u32_add3_madd_group = prefix_100.clone() * bits[3][1].clone() * bits[2][1].clone(); + let left_shift_scalar = E::sum_array::<7>(&[ + // +prefix_010 — ASSERT, EQ, ADD, MUL, AND, OR, U32AND, U32XOR, DROP, + // CSWAP, CSWAPW, MLOADW, MSTORE, MSTOREW, (op46), (op47) + prefix_010, + // +u32_add3_madd_group — U32ADD3, U32MADD: consume 3, produce 2 + u32_add3_madd_group, + // +SPLIT — control flow: pops condition + op5(opcodes::SPLIT), + // +LOOP — control flow: pops condition + op5(opcodes::LOOP), + // +REPEAT — control flow: pops condition for next iteration + op4(opcodes::REPEAT), + // +END*loop — END when ending a loop: pops loop flag + end_loop_flag, + // +DYN — control flow: consumes target hash + op5(opcodes::DYN), + ]); + + // --- Control flow flag --- + // + // Control flow operations are the only operations that can execute when outside a basic + // block (i.e., when in_span = 0). This is enforced by the decoder constraint: + // (1 - in_span) * (1 - control_flow) = 0 + // + // Control flow operations (must include ALL of these): + // - Block starters: SPAN, JOIN, SPLIT, LOOP + // - Block transitions: END, REPEAT, RESPAN, HALT + // - Dynamic execution: DYN, DYNCALL + // - Procedure calls: CALL, SYSCALL + // + // IMPORTANT: If a new control flow operation is added, it MUST be included here, + // otherwise the decoder constraint will fail when executing that operation. + let control_flow = E::sum_array::<6>(&[ + // +SPAN, JOIN, SPLIT, LOOP — block starters + bits[3][0].clone() * bits[2][1].clone() * decoder.extra[0], + // +END, REPEAT, RESPAN, HALT — block transitions + bits[4][1].clone() * decoder.extra[1], + // +DYNCALL — dynamic execution + op5(opcodes::DYNCALL), + // +DYN — dynamic execution + op5(opcodes::DYN), + // +SYSCALL — procedure call + op4(opcodes::SYSCALL), + // +CALL — procedure call + op4(opcodes::CALL), + ]); + + // Flag if current operation is a degree-6 u32 operation + let u32_rc_op = prefix_100; - /// Returns the is_loop flag from the decoder. - fn is_loop_end(&self) -> E; -} + // Flag if overflow table contains values + let overflow: E = stack.b0.into(); + let overflow = (overflow - E::from_u64(16)) * stack.h0; -/// Implement DecoderAccess for MainTraceRow references. -impl DecoderAccess for &crate::MainTraceRow -where - T: Clone, -{ - #[inline] - fn op_bit(&self, index: usize) -> T { - self.decoder[OP_BITS_RANGE.start + index].clone() + CompositeFlags { + no_shift, + left_shift, + right_shift, + left_shift_scalar, + right_shift_scalar, + control_flow, + u32_rc_op, + overflow, + } } - #[inline] - fn op_bit_extra(&self, index: usize) -> T { - self.decoder[OP_BITS_EXTRA_COLS_RANGE.start + index].clone() - } + // ------ Composite Flags --------------------------------------------------------------------- - #[inline] - fn overflow_register(&self) -> T { - self.stack[H0_COL_IDX].clone() + /// Returns the flag for when the stack item at the specified depth remains unchanged. + #[inline(always)] + pub fn no_shift_at(&self, index: usize) -> E { + self.no_shift_flags[index].clone() } - #[inline] - fn stack_depth(&self) -> T { - self.stack[B0_COL_IDX].clone() + /// Returns the flag for when the stack item at the specified depth shifts left. + /// Left shift is not defined on position 0, so returns default for index 0. + #[inline(always)] + pub fn left_shift_at(&self, index: usize) -> E { + self.left_shift_flags[index].clone() } - #[inline] - fn is_loop_end(&self) -> T { - self.decoder[IS_LOOP_FLAG_COL_IDX].clone() + /// Returns the flag for when the stack item at the specified depth shifts right. + #[inline(always)] + pub fn right_shift_at(&self, index: usize) -> E { + self.right_shift_flags[index].clone() } -} -/// Wrapper that converts trace row variables to expressions during decoder access. -/// -/// This is used when building constraints to convert `AB::Var` to `AB::Expr` so that -/// `OpFlags` can be created for use in constraint expressions. -pub struct ExprDecoderAccess<'a, V, E> { - row: &'a crate::MainTraceRow, - _phantom: PhantomData, -} - -impl<'a, V, E> ExprDecoderAccess<'a, V, E> { - /// Creates a new expression decoder access wrapper. - pub fn new(row: &'a crate::MainTraceRow) -> Self { - Self { row, _phantom: PhantomData } + /// Returns the scalar flag when the stack operation shifts the stack to the right. + /// + /// This is NOT the same expression as `right_shift_at(15)`. It uses low-degree + /// bit prefixes (degree 6) that are algebraically equivalent on valid traces, + /// producing a lower-degree expression for use in constraints that multiply + /// this flag with other terms. + #[inline(always)] + pub fn right_shift(&self) -> E { + self.right_shift.clone() } -} -impl<'a, V, E> DecoderAccess for ExprDecoderAccess<'a, V, E> -where - V: Clone + Into, -{ - #[inline] - fn op_bit(&self, index: usize) -> E { - self.row.decoder[OP_BITS_RANGE.start + index].clone().into() + /// Returns the scalar flag when the stack operation shifts the stack to the left. + /// + /// This is NOT the same expression as `left_shift_at(15)`. It uses low-degree + /// bit prefixes (degree 5) that are algebraically equivalent on valid traces. + /// + /// Excludes `DYNCALL` — it left-shifts the stack but is handled via the + /// per-position `left_shift_at` flags. The aggregate `left_shift` flag only + /// gates generic helper/overflow constraints, which don't apply to `DYNCALL` + /// because those helper columns are reused for the context switch and the + /// overflow pointer is stored in decoder hasher state (h5). + #[inline(always)] + pub fn left_shift(&self) -> E { + self.left_shift.clone() } - #[inline] - fn op_bit_extra(&self, index: usize) -> E { - self.row.decoder[OP_BITS_EXTRA_COLS_RANGE.start + index].clone().into() + /// Returns the flag when the current operation is a control flow operation. + /// + /// Control flow operations are the only operations allowed to execute when outside a basic + /// block (i.e., when in_span = 0). This includes: + /// - Block starters: SPAN, JOIN, SPLIT, LOOP + /// - Block transitions: END, REPEAT, RESPAN, HALT + /// - Dynamic execution: DYN, DYNCALL + /// - Procedure calls: CALL, SYSCALL + /// + /// Used by the decoder constraint: `(1 - in_span) * (1 - control_flow) = 0` + /// + /// Degree: 3 + #[inline(always)] + pub fn control_flow(&self) -> E { + self.control_flow.clone() } - #[inline] - fn overflow_register(&self) -> E { - self.row.stack[H0_COL_IDX].clone().into() + /// Returns the flag indicating whether the overflow stack contains values. + /// Degree: 2 + #[inline(always)] + pub fn overflow(&self) -> E { + self.overflow.clone() } - #[inline] - fn stack_depth(&self) -> E { - self.row.stack[B0_COL_IDX].clone().into() - } + // ------ Next-row flags ------------------------------------------------------------------- - #[inline] - fn is_loop_end(&self) -> E { - self.row.decoder[IS_LOOP_FLAG_COL_IDX].clone().into() + /// Returns the flag for END on the next row. Degree: 4 + #[inline(always)] + pub fn end_next(&self) -> E { + self.end_next.clone() } -} -/// Helper function to compute binary NOT: 1 - x -#[inline] -fn binary_not(x: E) -> E -where - E: Clone + core::ops::Sub + PrimeCharacteristicRing, -{ - E::ONE - x -} + /// Returns the flag for REPEAT on the next row. Degree: 4 + #[inline(always)] + pub fn repeat_next(&self) -> E { + self.repeat_next.clone() + } -#[derive(Clone)] -struct Op { - bit: E, - not: E, -} + /// Returns the flag for RESPAN on the next row. Degree: 4 + #[inline(always)] + pub fn respan_next(&self) -> E { + self.respan_next.clone() + } -impl Op { - #[inline] - fn is(&self) -> E { - self.bit.clone() + /// Returns the flag for HALT on the next row. Degree: 4 + #[inline(always)] + pub fn halt_next(&self) -> E { + self.halt_next.clone() } - #[inline] - fn not(&self) -> E { - self.not.clone() + /// Returns the flag when the current operation is a u32 operation requiring range checks. + #[inline(always)] + pub fn u32_rc_op(&self) -> E { + self.u32_rc_op.clone() } } @@ -236,397 +767,7 @@ macro_rules! op_flag_getters { }; } -#[allow(dead_code)] -impl OpFlags -where - E: Clone - + Default - + core::ops::Add - + core::ops::Sub - + core::ops::Mul - + PrimeCharacteristicRing, -{ - /// Creates a new OpFlags instance by computing all flags from the decoder columns. - /// - /// The computation uses intermediate values to minimize multiplications: - /// - Degree 7 flags: computed hierarchically from op bits - /// - Degree 6 flags: u32 operations, share common prefix `100` - /// - Degree 5 flags: use op_bit_extra[0] for degree reduction - /// - Degree 4 flags: use op_bit_extra[1] for degree reduction - pub fn new>(frame: D) -> Self { - // Initialize arrays with default values - let mut degree7_op_flags: [E; NUM_DEGREE_7_OPS] = core::array::from_fn(|_| E::default()); - let mut degree6_op_flags: [E; NUM_DEGREE_6_OPS] = core::array::from_fn(|_| E::default()); - let mut degree5_op_flags: [E; NUM_DEGREE_5_OPS] = core::array::from_fn(|_| E::default()); - let mut degree4_op_flags: [E; NUM_DEGREE_4_OPS] = core::array::from_fn(|_| E::default()); - let mut no_shift_flags: [E; NUM_STACK_IMPACT_FLAGS] = - core::array::from_fn(|_| E::default()); - let mut left_shift_flags: [E; NUM_STACK_IMPACT_FLAGS] = - core::array::from_fn(|_| E::default()); - let mut right_shift_flags: [E; NUM_STACK_IMPACT_FLAGS] = - core::array::from_fn(|_| E::default()); - - // Get op bits and their binary negations. - let op: [Op; 7] = core::array::from_fn(|i| { - let bit = frame.op_bit(i); - let not = binary_not(bit.clone()); - Op { bit, not } - }); - - // --- Low-degree prefix selectors for composite flags --- - // These produce degree-5 left_shift and right_shift composite flags. - // per spec: https://0xmiden.github.io/miden-vm/design/stack/op_constraints.html#shift-left-flag - - // Prefix `010` selector: (1-b6)*b5*(1-b4) - degree 3 - // Covers all degree-7 operations with this prefix (left shift ops) - let prefix_010 = op[6].not() * op[5].is() * op[4].not(); - - // Prefix `011` selector: (1-b6)*b5*b4 - degree 3 - // Covers all degree-7 operations with this prefix (right shift ops) - let prefix_011 = op[6].not() * op[5].is() * op[4].is(); - - // Prefix `10011` selector: b6*(1-b5)*(1-b4)*b3*b2 - degree 5 - // Covers U32ADD3 and U32MADD (both cause left shift by 2) - let add3_madd_prefix = op[6].is() * op[5].not() * op[4].not() * op[3].is() * op[2].is(); - - // --- Computation of degree 7 operation flags --- - - // Intermediate values computed from most significant bits - degree7_op_flags[0] = op[5].not() * op[4].not(); - degree7_op_flags[16] = op[5].not() * op[4].is(); - degree7_op_flags[32] = op[5].is() * op[4].not(); - // Prefix `11` in bits [5..4] (binary 110000 = 48). - degree7_op_flags[0b110000] = op[5].is() * op[4].is(); - - // Flag of prefix `100` - all degree 6 u32 operations - let f100 = degree7_op_flags[0].clone() * op[6].is(); - // Flag of prefix `1000` - u32 arithmetic operations - let f1000 = f100.clone() * op[3].not(); - - let not_6_not_3 = op[6].not() * op[3].not(); - let not_6_yes_3 = op[6].not() * op[3].is(); - - // Add fourth most significant bit along with most significant bit - for i in (0..64).step_by(16) { - let base = degree7_op_flags[i].clone(); - degree7_op_flags[i + 8] = base.clone() * not_6_yes_3.clone(); - degree7_op_flags[i] = base * not_6_not_3.clone(); - } - - // Flag of prefix `011` - degree 7 right shift operations - let f011 = degree7_op_flags[48].clone() + degree7_op_flags[56].clone(); - // Flag of prefix `010` - degree 7 left shift operations (reserved for future use) - let _f010 = degree7_op_flags[32].clone() + degree7_op_flags[40].clone(); - // Flag of prefix `0000` - no shift from position 1 onwards - let f0000 = degree7_op_flags[0].clone(); - // Flag of prefix `0100` - left shift from position 2 onwards - let f0100 = degree7_op_flags[32].clone(); - - // Add fifth most significant bit - for i in (0..64).step_by(8) { - let base = degree7_op_flags[i].clone(); - degree7_op_flags[i + 4] = base.clone() * op[2].is(); - degree7_op_flags[i] = base * op[2].not(); - } - - // Add sixth most significant bit - for i in (0..64).step_by(4) { - let base = degree7_op_flags[i].clone(); - degree7_op_flags[i + 2] = base.clone() * op[1].is(); - degree7_op_flags[i] = base * op[1].not(); - } - - // Cache flags for mov{up/dn}{2-8}, swapw{2-3} operations - let mov2_flag = degree7_op_flags[10].clone(); - let mov3_flag = degree7_op_flags[12].clone(); - let mov4_flag = degree7_op_flags[16].clone(); - let mov5_flag = degree7_op_flags[18].clone(); - let mov6_flag = degree7_op_flags[20].clone(); - let mov7_flag = degree7_op_flags[22].clone(); - let mov8_flag = degree7_op_flags[26].clone(); - let swapwx_flag = degree7_op_flags[28].clone(); - let adv_popw_expacc = degree7_op_flags[14].clone(); - - // Add least significant bit - for i in (0..64).step_by(2) { - let base = degree7_op_flags[i].clone(); - degree7_op_flags[i + 1] = base.clone() * op[0].is(); - degree7_op_flags[i] = base * op[0].not(); - } - - let ext2mul_flag = degree7_op_flags[25].clone(); - - // Flag when items from first position onwards are copied over (excludes NOOP) - let no_change_1_flag = f0000.clone() - degree7_op_flags[0].clone(); - // Flag when items from second position onwards shift left (excludes ASSERT) - let left_change_1_flag = f0100 - degree7_op_flags[32].clone(); - - // --- Computation of degree 6 operation flags --- - - // Degree 6 flag prefix is `100` - let degree_6_flag = op[6].is() * op[5].not() * op[4].not(); - - // Degree 6 flags do not use the first bit (op_bits[0]) - let not_2_not_3 = op[2].not() * op[3].not(); - let yes_2_not_3 = op[2].is() * op[3].not(); - let not_2_yes_3 = op[2].not() * op[3].is(); - let yes_2_yes_3 = op[2].is() * op[3].is(); - - degree6_op_flags[0] = op[1].not() * not_2_not_3.clone(); // U32ADD - degree6_op_flags[1] = op[1].is() * not_2_not_3.clone(); // U32SUB - degree6_op_flags[2] = op[1].not() * yes_2_not_3.clone(); // U32MUL - degree6_op_flags[3] = op[1].is() * yes_2_not_3.clone(); // U32DIV - degree6_op_flags[4] = op[1].not() * not_2_yes_3.clone(); // U32SPLIT - degree6_op_flags[5] = op[1].is() * not_2_yes_3.clone(); // U32ASSERT2 - degree6_op_flags[6] = op[1].not() * yes_2_yes_3.clone(); // U32ADD3 - degree6_op_flags[7] = op[1].is() * yes_2_yes_3.clone(); // U32MADD - - // Multiply by degree 6 flag - for flag in degree6_op_flags.iter_mut() { - *flag = flag.clone() * degree_6_flag.clone(); - } - - // --- Computation of degree 5 operation flags --- - - // Degree 5 flag uses the first degree reduction column - let degree_5_flag = frame.op_bit_extra(0); - - let not_0_not_1 = op[0].not() * op[1].not(); - let yes_0_not_1 = op[0].is() * op[1].not(); - let not_0_yes_1 = op[0].not() * op[1].is(); - let yes_0_yes_1 = op[0].is() * op[1].is(); - - degree5_op_flags[0] = not_0_not_1.clone() * op[2].not(); // HPERM - degree5_op_flags[1] = yes_0_not_1.clone() * op[2].not(); // MPVERIFY - degree5_op_flags[2] = not_0_yes_1.clone() * op[2].not(); // PIPE - degree5_op_flags[3] = yes_0_yes_1.clone() * op[2].not(); // MSTREAM - degree5_op_flags[4] = not_0_not_1.clone() * op[2].is(); // SPLIT - degree5_op_flags[5] = yes_0_not_1.clone() * op[2].is(); // LOOP - degree5_op_flags[6] = not_0_yes_1.clone() * op[2].is(); // SPAN - degree5_op_flags[7] = yes_0_yes_1.clone() * op[2].is(); // JOIN - - // Second half shares same lower 3 bits - for i in 0..8 { - degree5_op_flags[i + 8] = degree5_op_flags[i].clone(); - } - - // Update with op_bit[3] and degree 5 flag - let deg_5_not_3 = op[3].not() * degree_5_flag.clone(); - for flag in degree5_op_flags.iter_mut().take(8) { - *flag = flag.clone() * deg_5_not_3.clone(); - } - let deg_5_yes_3 = op[3].is() * degree_5_flag.clone(); - for flag in degree5_op_flags.iter_mut().skip(8) { - *flag = flag.clone() * deg_5_yes_3.clone(); - } - - // --- Computation of degree 4 operation flags --- - - // Degree 4 flag uses the second degree reduction column - let degree_4_flag = frame.op_bit_extra(1); - - // Degree 4 flags do not use the first two bits - degree4_op_flags[0] = not_2_not_3.clone(); // MRUPDATE - degree4_op_flags[1] = yes_2_not_3; // (unused) - degree4_op_flags[2] = not_2_yes_3; // SYSCALL - degree4_op_flags[3] = yes_2_yes_3; // CALL - - // Second half shares same lower 4 bits - for i in 0..4 { - degree4_op_flags[i + 4] = degree4_op_flags[i].clone(); - } - - // Update with op_bit[4] and degree 4 flag - let deg_4_not_4 = op[4].not() * degree_4_flag.clone(); - for flag in degree4_op_flags.iter_mut().take(4) { - *flag = flag.clone() * deg_4_not_4.clone(); - } - let deg_4_yes_4 = op[4].is() * degree_4_flag.clone(); - for flag in degree4_op_flags.iter_mut().skip(4) { - *flag = flag.clone() * deg_4_yes_4.clone(); - } - - // --- No shift composite flags computation --- - - // Flag for END operation causing stack to shift left (depends on whether in loop) - let shift_left_on_end = degree4_op_flags[4].clone() * frame.is_loop_end(); - - no_shift_flags[0] = degree7_op_flags[0].clone() // NOOP - + degree6_op_flags[5].clone() // U32ASSERT2 - + degree5_op_flags[1].clone() // MPVERIFY - + degree5_op_flags[6].clone() // SPAN - + degree5_op_flags[7].clone() // JOIN - + degree7_op_flags[31].clone() // EMIT - + degree4_op_flags[6].clone() // RESPAN - + degree4_op_flags[7].clone() // HALT - + degree4_op_flags[3].clone() // CALL - + degree4_op_flags[4].clone() * binary_not(frame.is_loop_end()); // END (non-loop) - - no_shift_flags[1] = no_shift_flags[0].clone() + no_change_1_flag; - no_shift_flags[2] = no_shift_flags[1].clone() - + degree7_op_flags[8].clone() // SWAP - + f1000.clone(); // u32 arithmetic - no_shift_flags[3] = no_shift_flags[2].clone() + mov2_flag.clone(); - no_shift_flags[4] = no_shift_flags[3].clone() - + mov3_flag.clone() - + adv_popw_expacc.clone() - + swapwx_flag.clone() - + ext2mul_flag.clone() - + degree4_op_flags[0].clone(); // MRUPDATE - - no_shift_flags[5] = no_shift_flags[4].clone() + mov4_flag.clone(); - no_shift_flags[6] = no_shift_flags[5].clone() + mov5_flag.clone(); - no_shift_flags[7] = no_shift_flags[6].clone() + mov6_flag.clone(); - no_shift_flags[8] = - no_shift_flags[7].clone() + mov7_flag.clone() + degree7_op_flags[24].clone() - - degree7_op_flags[28].clone(); - - no_shift_flags[9] = no_shift_flags[8].clone() + mov8_flag.clone(); - no_shift_flags[10] = no_shift_flags[9].clone(); - no_shift_flags[11] = no_shift_flags[9].clone(); - // SWAPW3; SWAPW2; HPERM - no_shift_flags[12] = no_shift_flags[9].clone() - degree7_op_flags[29].clone() - + degree7_op_flags[28].clone() - + degree5_op_flags[0].clone(); - no_shift_flags[13] = no_shift_flags[12].clone(); - no_shift_flags[14] = no_shift_flags[12].clone(); - no_shift_flags[15] = no_shift_flags[12].clone(); - - // --- Left shift composite flags computation --- - - let movdnn_flag = degree7_op_flags[11].clone() - + degree7_op_flags[13].clone() - + degree7_op_flags[17].clone() - + degree7_op_flags[19].clone() - + degree7_op_flags[21].clone() - + degree7_op_flags[23].clone() - + degree7_op_flags[27].clone(); - - let split_loop_flag = degree5_op_flags[4].clone() + degree5_op_flags[5].clone(); - let add3_madd_flag = degree6_op_flags[6].clone() + degree6_op_flags[7].clone(); - - left_shift_flags[1] = degree7_op_flags[32].clone() - + movdnn_flag.clone() - + degree7_op_flags[41].clone() - + degree7_op_flags[45].clone() - + degree7_op_flags[47].clone() - + degree7_op_flags[46].clone() - + split_loop_flag.clone() - + shift_left_on_end.clone() - + degree5_op_flags[8].clone() // DYN - + degree5_op_flags[12].clone(); // DYNCALL - - left_shift_flags[2] = left_shift_flags[1].clone() + left_change_1_flag; - left_shift_flags[3] = - left_shift_flags[2].clone() + add3_madd_flag.clone() + degree7_op_flags[42].clone() - - degree7_op_flags[11].clone(); - left_shift_flags[4] = left_shift_flags[3].clone() - degree7_op_flags[13].clone(); - left_shift_flags[5] = left_shift_flags[4].clone() + degree7_op_flags[44].clone() - - degree7_op_flags[17].clone(); - left_shift_flags[6] = left_shift_flags[5].clone() - degree7_op_flags[19].clone(); - left_shift_flags[7] = left_shift_flags[6].clone() - degree7_op_flags[21].clone(); - left_shift_flags[8] = left_shift_flags[7].clone() - degree7_op_flags[23].clone(); - left_shift_flags[9] = left_shift_flags[8].clone() + degree7_op_flags[43].clone() - - degree7_op_flags[27].clone(); - left_shift_flags[10] = left_shift_flags[9].clone(); - left_shift_flags[11] = left_shift_flags[9].clone(); - left_shift_flags[12] = left_shift_flags[9].clone(); - left_shift_flags[13] = left_shift_flags[9].clone(); - left_shift_flags[14] = left_shift_flags[9].clone(); - left_shift_flags[15] = left_shift_flags[9].clone(); - - // --- Right shift composite flags computation --- - - let movupn_flag = degree7_op_flags[10].clone() - + degree7_op_flags[12].clone() - + degree7_op_flags[16].clone() - + degree7_op_flags[18].clone() - + degree7_op_flags[20].clone() - + degree7_op_flags[22].clone() - + degree7_op_flags[26].clone(); - - right_shift_flags[0] = f011.clone() - + degree5_op_flags[11].clone() // PUSH - + movupn_flag.clone(); - - right_shift_flags[1] = right_shift_flags[0].clone() + degree6_op_flags[4].clone(); // U32SPLIT - - right_shift_flags[2] = right_shift_flags[1].clone() - degree7_op_flags[10].clone(); - right_shift_flags[3] = right_shift_flags[2].clone() - degree7_op_flags[12].clone(); - right_shift_flags[4] = right_shift_flags[3].clone() - degree7_op_flags[16].clone(); - right_shift_flags[5] = right_shift_flags[4].clone() - degree7_op_flags[18].clone(); - right_shift_flags[6] = right_shift_flags[5].clone() - degree7_op_flags[20].clone(); - right_shift_flags[7] = right_shift_flags[6].clone() - degree7_op_flags[22].clone(); - right_shift_flags[8] = right_shift_flags[7].clone() - degree7_op_flags[26].clone(); - right_shift_flags[9] = right_shift_flags[8].clone(); - right_shift_flags[10] = right_shift_flags[8].clone(); - right_shift_flags[11] = right_shift_flags[8].clone(); - right_shift_flags[12] = right_shift_flags[8].clone(); - right_shift_flags[13] = right_shift_flags[8].clone(); - right_shift_flags[14] = right_shift_flags[8].clone(); - right_shift_flags[15] = right_shift_flags[8].clone(); - - // --- Other composite flags --- - - // Flag if stack shifted right (degree 6, dominated by U32SPLIT) - // Uses prefix_011 (degree 3) instead of f011 (degree 4) for lower base degree - let right_shift = prefix_011.clone() - + degree5_op_flags[11].clone() // PUSH - + degree6_op_flags[4].clone(); // U32SPLIT - - // Flag if stack shifted left (degree 5). - // Uses low-degree prefixes to keep left_shift at degree 5 (avoids degree growth). - // Note: DYNCALL is intentionally excluded; see stack overflow depth constraints. - let left_shift = prefix_010.clone() - + add3_madd_prefix.clone() - + split_loop_flag - + degree4_op_flags[5].clone() // REPEAT - + shift_left_on_end - + degree5_op_flags[8].clone(); // DYN - - // Flag if current operation is a control flow operation. - // - // Control flow operations are the only operations that can execute when outside a basic - // block (i.e., when in_span = 0). This is enforced by the decoder constraint: - // (1 - in_span) * (1 - control_flow) = 0 - // - // Control flow operations (must include ALL of these): - // - Block starters: SPAN, JOIN, SPLIT, LOOP - // - Block transitions: END, REPEAT, RESPAN, HALT - // - Dynamic execution: DYN, DYNCALL - // - Procedure calls: CALL, SYSCALL - // - // IMPORTANT: If a new control flow operation is added, it MUST be included here, - // otherwise the decoder constraint will fail when executing that operation. - let control_flow = degree_5_flag * op[3].not() * op[2].is() // SPAN, JOIN, SPLIT, LOOP - + degree_4_flag * op[4].is() // END, REPEAT, RESPAN, HALT - + degree5_op_flags[8].clone() // DYN - + degree5_op_flags[12].clone() // DYNCALL - + degree4_op_flags[2].clone() // SYSCALL - + degree4_op_flags[3].clone(); // CALL - - // Flag if current operation is a degree 6 u32 operation - let u32_rc_op = f100; - - // Flag if overflow table contains values - let overflow = (frame.stack_depth() - E::from_u64(16)) * frame.overflow_register(); - - Self { - degree7_op_flags, - degree6_op_flags, - degree5_op_flags, - degree4_op_flags, - no_shift_flags, - left_shift_flags, - right_shift_flags, - left_shift, - right_shift, - control_flow, - overflow, - u32_rc_op, - } - } - +impl OpFlags { // STATE ACCESSORS // ============================================================================================ @@ -634,7 +775,7 @@ where op_flag_getters!(degree7_op_flags, /// Operation Flag of NOOP operation. - #[allow(dead_code)] + #[expect(dead_code)] noop => opcodes::NOOP, /// Operation Flag of EQZ operation. eqz => opcodes::EQZ, @@ -664,7 +805,7 @@ where /// Operation Flag of MOVDN3 operation. movdn3 => opcodes::MOVDN3, /// Operation Flag of ADVPOPW operation. - #[allow(dead_code)] + #[expect(dead_code)] advpopw => opcodes::ADVPOPW, /// Operation Flag of EXPACC operation. expacc => opcodes::EXPACC, @@ -714,8 +855,10 @@ where u32and => opcodes::U32AND, /// Operation Flag of U32XOR operation. u32xor => opcodes::U32XOR, + /// Operation Flag of FRIE2F4 operation. + frie2f4 => opcodes::FRIE2F4, /// Operation Flag of DROP operation. - #[allow(dead_code)] + #[expect(dead_code)] drop => opcodes::DROP, /// Operation Flag of CSWAP operation. cswap => opcodes::CSWAP, @@ -754,7 +897,7 @@ where /// Operation Flag of DUP15 operation. dup15 => opcodes::DUP15, /// Operation Flag of ADVPOP operation. - #[allow(dead_code)] + #[expect(dead_code)] advpop => opcodes::ADVPOP, /// Operation Flag of SDEPTH operation. sdepth => opcodes::SDEPTH, @@ -838,110 +981,36 @@ where /// Operation Flag of CRYPTOSTREAM operation. cryptostream => opcodes::CRYPTOSTREAM, ); - - // ------ Composite Flags --------------------------------------------------------------------- - - /// Returns the flag for when the stack item at the specified depth remains unchanged. - #[inline(always)] - pub fn no_shift_at(&self, index: usize) -> E { - self.no_shift_flags[index].clone() - } - - /// Returns the flag for when the stack item at the specified depth shifts left. - /// Left shift is not defined on position 0, so returns default for index 0. - #[inline(always)] - pub fn left_shift_at(&self, index: usize) -> E { - self.left_shift_flags[index].clone() - } - - /// Returns the flag for when the stack item at the specified depth shifts right. - #[inline(always)] - pub fn right_shift_at(&self, index: usize) -> E { - self.right_shift_flags[index].clone() - } - - /// Returns the flag when the stack operation shifts the stack to the right. - /// Degree: 6 - #[inline(always)] - pub fn right_shift(&self) -> E { - self.right_shift.clone() - } - - /// Returns the flag when the stack operation shifts the stack to the left. - /// - /// Note: `DYNCALL` still shifts the stack, but it is handled via the per-position - /// `left_shift_at` flags. The aggregate `left_shift` flag only gates the generic - /// helper/overflow constraints, which do not apply to `DYNCALL` because those - /// helper columns are reused for the context switch and the overflow pointer is - /// stored in decoder hasher state (h5), not in the usual helper/stack columns. - /// Degree: 5 - #[inline(always)] - pub fn left_shift(&self) -> E { - self.left_shift.clone() - } - - /// Returns the flag when the current operation is a control flow operation. - /// - /// Control flow operations are the only operations allowed to execute when outside a basic - /// block (i.e., when in_span = 0). This includes: - /// - Block starters: SPAN, JOIN, SPLIT, LOOP - /// - Block transitions: END, REPEAT, RESPAN, HALT - /// - Dynamic execution: DYN, DYNCALL - /// - Procedure calls: CALL, SYSCALL - /// - /// Used by the decoder constraint: `(1 - in_span) * (1 - control_flow) = 0` - /// - /// Degree: 3 - #[inline(always)] - pub fn control_flow(&self) -> E { - self.control_flow.clone() - } - - /// Returns the flag when the current operation is a u32 operation requiring range checks. - #[inline(always)] - #[allow(dead_code)] - pub fn u32_rc_op(&self) -> E { - self.u32_rc_op.clone() - } - - /// Returns the flag indicating whether the overflow stack contains values. - /// Degree: 2 - #[inline(always)] - pub fn overflow(&self) -> E { - self.overflow.clone() - } - - // TEST ACCESSORS - // ============================================================================================ - - /// Returns reference to degree 7 operation flags array (for testing). - #[cfg(test)] - pub fn degree7_op_flags(&self) -> &[E; NUM_DEGREE_7_OPS] { - &self.degree7_op_flags - } - - /// Returns reference to degree 6 operation flags array (for testing). - #[cfg(test)] - pub fn degree6_op_flags(&self) -> &[E; NUM_DEGREE_6_OPS] { - &self.degree6_op_flags - } - - /// Returns reference to degree 5 operation flags array (for testing). - #[cfg(test)] - pub fn degree5_op_flags(&self) -> &[E; NUM_DEGREE_5_OPS] { - &self.degree5_op_flags - } - - /// Returns reference to degree 4 operation flags array (for testing). - #[cfg(test)] - pub fn degree4_op_flags(&self) -> &[E; NUM_DEGREE_4_OPS] { - &self.degree4_op_flags - } } // INTERNAL HELPERS // ================================================================================================ +/// Pre-b0 intermediate flags captured before the final bit split. +/// +/// These are degree-6 products (all bits except b0) that pair adjacent opcodes +/// sharing all bits except the LSB. Used by composite shift flag computation. +struct PreB0Flags { + /// MOVUP{2..8} | MOVDN{2..8} paired flags, indexed 0..7 for widths 2..8. + movup_or_movdn: [E; 7], + /// SWAPW2 | SWAPW3 paired flag. + swapw2_or_swapw3: E, + /// ADVPOPW | EXPACC paired flag. + advpopw_or_expacc: E, +} + +/// Composite flag results: shift arrays, scalar flags, and control flow. +struct CompositeFlags { + no_shift: [E; NUM_STACK_IMPACT_FLAGS], + left_shift: [E; NUM_STACK_IMPACT_FLAGS], + right_shift: [E; NUM_STACK_IMPACT_FLAGS], + left_shift_scalar: E, + right_shift_scalar: E, + control_flow: E, + u32_rc_op: E, + overflow: E, +} + /// Maps opcode of an operation to the index in its respective degree flag array. pub const fn get_op_index(opcode: u8) -> usize { let opcode = opcode as usize; @@ -961,6 +1030,18 @@ pub const fn get_op_index(opcode: u8) -> usize { } } +/// Prefix-sums an array of per-depth deltas in place. +/// +/// `result[d] = deltas[0] + deltas[1] + ... + deltas[d]` +fn accumulate_depth_deltas( + mut deltas: [E; N], +) -> [E; N] { + for i in 1..N { + deltas[i] = deltas[i - 1].clone() + deltas[i].clone(); + } + deltas +} + // TEST HELPERS // ================================================================================================ @@ -971,45 +1052,29 @@ pub const fn get_op_index(opcode: u8) -> usize { /// - Op bits extra columns are computed for degree reduction /// - All other columns are zero #[cfg(test)] -pub fn generate_test_row(opcode: usize) -> crate::MainTraceRow { - use miden_core::{ONE, ZERO}; +pub fn generate_test_row(opcode: usize) -> crate::MainCols { + use miden_core::{Felt, ZERO}; - use crate::trace::{ - CHIPLETS_WIDTH, DECODER_TRACE_WIDTH, RANGE_CHECK_TRACE_WIDTH, STACK_TRACE_WIDTH, - decoder::OP_BITS_EXTRA_COLS_RANGE, - }; + use crate::trace::{TRACE_WIDTH, decoder::OP_BITS_EXTRA_COLS_RANGE}; - // Get op bits for this opcode let op_bits = get_op_bits(opcode); - // Initialize decoder array with zeros - let mut decoder = [ZERO; DECODER_TRACE_WIDTH]; - - // Set op bits (indices 1-7 in decoder, after addr column at index 0) + // Build a flat zeroed row, then set the decoder op bits via the col map. + let mut row = [ZERO; TRACE_WIDTH]; for (i, &bit) in op_bits.iter().enumerate() { - decoder[OP_BITS_RANGE.start + i] = bit; + row[OP_BITS_RANGE.start + crate::trace::DECODER_TRACE_OFFSET + i] = bit; } - // Compute and set op bits extra columns for degree reduction + // Compute and set op bits extra columns for degree reduction. let bit_6 = op_bits[6]; let bit_5 = op_bits[5]; let bit_4 = op_bits[4]; + row[OP_BITS_EXTRA_COLS_RANGE.start + crate::trace::DECODER_TRACE_OFFSET] = + bit_6 * (Felt::ONE - bit_5) * bit_4; + row[OP_BITS_EXTRA_COLS_RANGE.start + 1 + crate::trace::DECODER_TRACE_OFFSET] = bit_6 * bit_5; - // op_bit_extra[0] = bit_6 * (1 - bit_5) * bit_4 (degree 5 flag) - decoder[OP_BITS_EXTRA_COLS_RANGE.start] = bit_6 * (ONE - bit_5) * bit_4; - - // op_bit_extra[1] = bit_6 * bit_5 (degree 4 flag) - decoder[OP_BITS_EXTRA_COLS_RANGE.start + 1] = bit_6 * bit_5; - - crate::MainTraceRow { - clk: ZERO, - ctx: ZERO, - fn_hash: [ZERO; 4], - decoder, - stack: [ZERO; STACK_TRACE_WIDTH], - range: [ZERO; RANGE_CHECK_TRACE_WIDTH], - chiplets: [ZERO; CHIPLETS_WIDTH], - } + // Safety: MainCols is #[repr(C)] with the same layout as [Felt; TRACE_WIDTH]. + unsafe { core::mem::transmute::<[Felt; TRACE_WIDTH], crate::MainCols>(row) } } /// Returns a 7-bit array representation of an opcode. diff --git a/air/src/constraints/op_flags/tests.rs b/air/src/constraints/op_flags/tests.rs index 9261f244b3..b4a1e310d6 100644 --- a/air/src/constraints/op_flags/tests.rs +++ b/air/src/constraints/op_flags/tests.rs @@ -14,15 +14,14 @@ use super::{ NUM_DEGREE_4_OPS, NUM_DEGREE_5_OPS, NUM_DEGREE_6_OPS, NUM_DEGREE_7_OPS, OpFlags, generate_test_row, get_op_bits, get_op_index, }; -use crate::trace::decoder::IS_LOOP_FLAG_COL_IDX; - // HELPER // ================================================================================================ /// Creates OpFlags from an opcode using a generated test row. fn op_flags_for_opcode(opcode: usize) -> OpFlags { let row = generate_test_row(opcode); - OpFlags::new(&row) + let row_next = generate_test_row(0); // next row defaults to NOOP + OpFlags::new(&row.decoder, &row.stack, &row_next.decoder) } fn naive_flag(bits: &[Felt; 7], opcode: u8) -> Felt { @@ -186,7 +185,7 @@ fn degree_7_op_flags() { let expected_idx = get_op_index(opcode as u8); // Check degree 7 flags: exactly one should be ONE - for (i, &flag) in op_flags.degree7_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree7_op_flags.iter().enumerate() { if i == expected_idx { assert_eq!(flag, ONE, "Degree 7 flag {} should be ONE for opcode {}", i, opcode); } else { @@ -195,21 +194,21 @@ fn degree_7_op_flags() { } // All other degree flags should be ZERO - for (i, &flag) in op_flags.degree6_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree6_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 6 flag {} should be ZERO for degree 7 opcode {}", i, opcode ); } - for (i, &flag) in op_flags.degree5_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree5_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 5 flag {} should be ZERO for degree 7 opcode {}", i, opcode ); } - for (i, &flag) in op_flags.degree4_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree4_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 4 flag {} should be ZERO for degree 7 opcode {}", @@ -232,7 +231,7 @@ fn degree_6_op_flags() { let expected_idx = get_op_index(opcode as u8); // Check degree 6 flags - for (i, &flag) in op_flags.degree6_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree6_op_flags.iter().enumerate() { if i == expected_idx { assert_eq!(flag, ONE, "Degree 6 flag {} should be ONE for opcode {}", i, opcode); } else { @@ -241,21 +240,21 @@ fn degree_6_op_flags() { } // All other degree flags should be ZERO - for (i, &flag) in op_flags.degree7_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree7_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 7 flag {} should be ZERO for degree 6 opcode {}", i, opcode ); } - for (i, &flag) in op_flags.degree5_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree5_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 5 flag {} should be ZERO for degree 6 opcode {}", i, opcode ); } - for (i, &flag) in op_flags.degree4_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree4_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 4 flag {} should be ZERO for degree 6 opcode {}", @@ -277,7 +276,7 @@ fn degree_5_op_flags() { let expected_idx = get_op_index(opcode as u8); // Check degree 5 flags - for (i, &flag) in op_flags.degree5_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree5_op_flags.iter().enumerate() { if i == expected_idx { assert_eq!(flag, ONE, "Degree 5 flag {} should be ONE for opcode {}", i, opcode); } else { @@ -286,21 +285,21 @@ fn degree_5_op_flags() { } // All other degree flags should be ZERO - for (i, &flag) in op_flags.degree7_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree7_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 7 flag {} should be ZERO for degree 5 opcode {}", i, opcode ); } - for (i, &flag) in op_flags.degree6_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree6_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 6 flag {} should be ZERO for degree 5 opcode {}", i, opcode ); } - for (i, &flag) in op_flags.degree4_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree4_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 4 flag {} should be ZERO for degree 5 opcode {}", @@ -321,16 +320,16 @@ fn optimized_flags_match_naive() { let (deg7, deg6, deg5, deg4) = naive_op_flags(bits); let op_flags = op_flags_for_opcode(opcode); - for (i, &flag) in op_flags.degree7_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree7_op_flags.iter().enumerate() { assert_eq!(flag, deg7[i], "degree7 flag mismatch at index {}", i); } - for (i, &flag) in op_flags.degree6_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree6_op_flags.iter().enumerate() { assert_eq!(flag, deg6[i], "degree6 flag mismatch at index {}", i); } - for (i, &flag) in op_flags.degree5_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree5_op_flags.iter().enumerate() { assert_eq!(flag, deg5[i], "degree5 flag mismatch at index {}", i); } - for (i, &flag) in op_flags.degree4_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree4_op_flags.iter().enumerate() { assert_eq!(flag, deg4[i], "degree4 flag mismatch at index {}", i); } @@ -356,7 +355,7 @@ fn degree_4_op_flags() { let expected_idx = get_op_index(opcode as u8); // Check degree 4 flags - for (i, &flag) in op_flags.degree4_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree4_op_flags.iter().enumerate() { if i == expected_idx { assert_eq!(flag, ONE, "Degree 4 flag {} should be ONE for opcode {}", i, opcode); } else { @@ -365,21 +364,21 @@ fn degree_4_op_flags() { } // All other degree flags should be ZERO - for (i, &flag) in op_flags.degree7_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree7_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 7 flag {} should be ZERO for degree 4 opcode {}", i, opcode ); } - for (i, &flag) in op_flags.degree6_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree6_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 6 flag {} should be ZERO for degree 4 opcode {}", i, opcode ); } - for (i, &flag) in op_flags.degree5_op_flags().iter().enumerate() { + for (i, &flag) in op_flags.degree5_op_flags.iter().enumerate() { assert_eq!( flag, ZERO, "Degree 5 flag {} should be ZERO for degree 4 opcode {}", @@ -550,8 +549,9 @@ fn composite_end_flags() { // END with loop flag: left shift (need to modify the row) let mut row = generate_test_row(opcodes::END.into()); - row.decoder[IS_LOOP_FLAG_COL_IDX] = ONE; - let op_flags_loop = OpFlags::new(&row); + row.decoder.hasher_state[5] = ONE; // is_loop flag + let row_next = generate_test_row(0); + let op_flags_loop: OpFlags = OpFlags::new(&row.decoder, &row.stack, &row_next.decoder); for i in 0..16 { assert_eq!( @@ -669,7 +669,7 @@ fn u32_rc_op_flag() { for op in u32_ops { let op_flags = op_flags_for_opcode(op.op_code().into()); - assert_eq!(op_flags.u32_rc_op(), ONE, "u32_rc_op should be ONE for {:?}", op); + assert_eq!(op_flags.u32_rc_op, ONE, "u32_rc_op should be ONE for {:?}", op); } // Non-u32 operations @@ -681,6 +681,6 @@ fn u32_rc_op_flag() { for op in non_u32_ops { let op_flags = op_flags_for_opcode(op.op_code().into()); - assert_eq!(op_flags.u32_rc_op(), ZERO, "u32_rc_op should be ZERO for {:?}", op); + assert_eq!(op_flags.u32_rc_op, ZERO, "u32_rc_op should be ZERO for {:?}", op); } } diff --git a/air/src/constraints/public_inputs.rs b/air/src/constraints/public_inputs.rs index 47f21c9beb..ebc2ffc2c8 100644 --- a/air/src/constraints/public_inputs.rs +++ b/air/src/constraints/public_inputs.rs @@ -4,12 +4,9 @@ //! - First row: stack[0..16] == stack_inputs[0..16] //! - Last row: stack[0..16] == stack_outputs[0..16] -use miden_crypto::stark::air::{AirBuilder, LiftedAirBuilder}; +use miden_crypto::stark::air::AirBuilder; -use crate::{ - MainTraceRow, - constraints::tagging::{TaggingAirBuilderExt, ids::TAG_PUBLIC_INPUTS_BASE}, -}; +use crate::{MainCols, MidenAirBuilder}; // CONSTANTS // ================================================================================================ @@ -20,12 +17,6 @@ const STACK_DEPTH: usize = 16; /// (stack_inputs + stack_outputs + pc_transcript_state). const TAIL_LEN: usize = STACK_DEPTH + STACK_DEPTH + 4; -// TAGGING CONSTANTS -// ================================================================================================ - -const STACK_INPUT_NAMESPACE: &str = "public_inputs.stack_input"; -const STACK_OUTPUT_NAMESPACE: &str = "public_inputs.stack_output"; - // ENTRY POINTS // ================================================================================================ @@ -33,9 +24,9 @@ const STACK_OUTPUT_NAMESPACE: &str = "public_inputs.stack_output"; /// /// - First row: `stack[i] == stack_inputs[i]` for i in 0..16 /// - Last row: `stack[i] == stack_outputs[i]` for i in 0..16 -pub fn enforce_main(builder: &mut AB, local: &MainTraceRow) +pub fn enforce_main(builder: &mut AB, local: &MainCols) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { // Copy public values into local arrays to release the immutable borrow on builder. let pv = builder.public_values(); @@ -46,27 +37,20 @@ where core::array::from_fn(|i| pv[n - TAIL_LEN + STACK_DEPTH + i]); // First row: stack[i] == stack_inputs[i] - let input_ids: [usize; STACK_DEPTH] = core::array::from_fn(|i| TAG_PUBLIC_INPUTS_BASE + i); - builder.tagged_list(input_ids, STACK_INPUT_NAMESPACE, |builder| { - builder - .when_first_row() - .assert_zeros(core::array::from_fn::<_, STACK_DEPTH, _>(|i| { - let stack_i: AB::Expr = local.stack[i].clone().into(); - let pv_i: AB::Expr = si[i].into(); - stack_i - pv_i - })); - }); + { + let builder = &mut builder.when_first_row(); + #[allow(clippy::needless_range_loop)] + for i in 0..STACK_DEPTH { + builder.assert_eq(local.stack.get(i), si[i]); + } + } // Last row: stack[i] == stack_outputs[i] - let output_ids: [usize; STACK_DEPTH] = - core::array::from_fn(|i| TAG_PUBLIC_INPUTS_BASE + STACK_DEPTH + i); - builder.tagged_list(output_ids, STACK_OUTPUT_NAMESPACE, |builder| { - builder - .when_last_row() - .assert_zeros(core::array::from_fn::<_, STACK_DEPTH, _>(|i| { - let stack_i: AB::Expr = local.stack[i].clone().into(); - let pv_i: AB::Expr = so[i].into(); - stack_i - pv_i - })); - }); + { + let builder = &mut builder.when_last_row(); + #[allow(clippy::needless_range_loop)] + for i in 0..STACK_DEPTH { + builder.assert_eq(local.stack.get(i), so[i]); + } + } } diff --git a/air/src/constraints/range/bus.rs b/air/src/constraints/range/bus.rs index 07f4e6dcb6..88b625f2db 100644 --- a/air/src/constraints/range/bus.rs +++ b/air/src/constraints/range/bus.rs @@ -13,39 +13,14 @@ //! Where requests come from stack (4 lookups) and memory (2 lookups), and //! responses come from the range table (V column with multiplicity). -use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::{ExtensionBuilder, LiftedAirBuilder, WindowAccess}; +use miden_crypto::stark::air::{ExtensionBuilder, WindowAccess}; use crate::{ - MainTraceRow, - constraints::tagging::{TaggingAirBuilderExt, ids::TAG_RANGE_BUS_BASE}, - trace::{ - CHIPLET_S0_COL_IDX, CHIPLET_S1_COL_IDX, CHIPLET_S2_COL_IDX, CHIPLETS_OFFSET, - RANGE_CHECK_TRACE_OFFSET, chiplets, decoder, range, - }, + MainCols, MidenAirBuilder, + constraints::{chiplets::selectors::ChipletSelectors, op_flags::OpFlags}, + trace::{Challenges, bus_types::RANGE_CHECK_BUS, range}, }; -// CONSTANTS -// ================================================================================================ - -// --- SLICE-RELATIVE INDICES --------------------------------------------------------------------- -const STACK_LOOKUP_BASE: usize = decoder::USER_OP_HELPERS_OFFSET; -const OP_BIT_4_COL_IDX: usize = decoder::OP_BITS_RANGE.start + 4; -const OP_BIT_5_COL_IDX: usize = decoder::OP_BITS_RANGE.start + 5; -const OP_BIT_6_COL_IDX: usize = decoder::OP_BITS_RANGE.start + 6; -const CHIPLET_S0_IDX: usize = CHIPLET_S0_COL_IDX - CHIPLETS_OFFSET; -const CHIPLET_S1_IDX: usize = CHIPLET_S1_COL_IDX - CHIPLETS_OFFSET; -const CHIPLET_S2_IDX: usize = CHIPLET_S2_COL_IDX - CHIPLETS_OFFSET; -const MEMORY_D0_IDX: usize = chiplets::MEMORY_D0_COL_IDX - CHIPLETS_OFFSET; -const MEMORY_D1_IDX: usize = chiplets::MEMORY_D1_COL_IDX - CHIPLETS_OFFSET; -const RANGE_M_COL_IDX: usize = range::M_COL_IDX - RANGE_CHECK_TRACE_OFFSET; -const RANGE_V_COL_IDX: usize = range::V_COL_IDX - RANGE_CHECK_TRACE_OFFSET; - -// TAGGING CONSTANTS -// ================================================================================================ - -const RANGE_BUS_NAME: &str = "range.bus.transition"; - // ENTRY POINTS // ================================================================================================ @@ -64,9 +39,14 @@ const RANGE_BUS_NAME: &str = "range.bus.transition"; /// - Stack lookups (4): decoder helper columns (USER_OP_HELPERS_OFFSET..+4) /// - Memory lookups (2): memory delta limbs (MEMORY_D0, MEMORY_D1) /// - Range response: range V column with multiplicity range M column -pub fn enforce_bus(builder: &mut AB, local: &MainTraceRow) -where - AB: LiftedAirBuilder, +pub fn enforce_bus( + builder: &mut AB, + local: &MainCols, + op_flags: &OpFlags, + challenges: &Challenges, + selectors: &ChipletSelectors, +) where + AB: MidenAirBuilder, { // In Miden VM, auxiliary trace is always present @@ -77,22 +57,22 @@ where let b_local = aux_local[range::B_RANGE_COL_IDX]; let b_next = aux_next[range::B_RANGE_COL_IDX]; - let challenges = builder.permutation_randomness(); - let alpha = challenges[0]; + let alpha = &challenges.bus_prefix[RANGE_CHECK_BUS]; // Denominators for LogUp - // Memory lookups: mv0 = alpha + chiplets[MEMORY_D0], mv1 = alpha + chiplets[MEMORY_D1] - let mv0: AB::ExprEF = alpha.into() + local.chiplets[MEMORY_D0_IDX].clone().into(); - let mv1: AB::ExprEF = alpha.into() + local.chiplets[MEMORY_D1_IDX].clone().into(); + let mem = local.memory(); + let mv0: AB::ExprEF = alpha.clone() + mem.d0.into(); + let mv1: AB::ExprEF = alpha.clone() + mem.d1.into(); // Stack lookups: sv0-sv3 = alpha + decoder helper columns - let sv0: AB::ExprEF = alpha.into() + local.decoder[STACK_LOOKUP_BASE].clone().into(); - let sv1: AB::ExprEF = alpha.into() + local.decoder[STACK_LOOKUP_BASE + 1].clone().into(); - let sv2: AB::ExprEF = alpha.into() + local.decoder[STACK_LOOKUP_BASE + 2].clone().into(); - let sv3: AB::ExprEF = alpha.into() + local.decoder[STACK_LOOKUP_BASE + 3].clone().into(); + let helpers = local.decoder.user_op_helpers(); + let sv0: AB::ExprEF = alpha.clone() + helpers[0].into(); + let sv1: AB::ExprEF = alpha.clone() + helpers[1].into(); + let sv2: AB::ExprEF = alpha.clone() + helpers[2].into(); + let sv3: AB::ExprEF = alpha.clone() + helpers[3].into(); // Range check value: alpha + range V column - let range_check: AB::ExprEF = alpha.into() + local.range[RANGE_V_COL_IDX].clone().into(); + let range_check: AB::ExprEF = alpha.clone() + local.range.value.into(); // Combined lookup denominators let memory_lookups = mv0.clone() * mv1.clone(); @@ -100,23 +80,17 @@ where let lookups = range_check.clone() * stack_lookups.clone() * memory_lookups.clone(); // Flags for conditional inclusion - // u32_rc_op = op_bit[6] * (1 - op_bit[5]) * (1 - op_bit[4]) - let not_4: AB::Expr = AB::Expr::ONE - local.decoder[OP_BIT_4_COL_IDX].clone().into(); - let not_5: AB::Expr = AB::Expr::ONE - local.decoder[OP_BIT_5_COL_IDX].clone().into(); - let u32_rc_op: AB::Expr = local.decoder[OP_BIT_6_COL_IDX].clone().into() * not_5 * not_4; + let u32_rc_op = op_flags.u32_rc_op(); let sflag_rc_mem = range_check.clone() * memory_lookups.clone() * u32_rc_op; - // chiplets_memory_flag = s0 * s1 * (1 - s2) - let s_0: AB::Expr = local.chiplets[CHIPLET_S0_IDX].clone().into(); - let s_1: AB::Expr = local.chiplets[CHIPLET_S1_IDX].clone().into(); - let s_2: AB::Expr = local.chiplets[CHIPLET_S2_IDX].clone().into(); - let chiplets_memory_flag: AB::Expr = s_0 * s_1 * (AB::Expr::ONE - s_2); + // chiplets_memory_flag = s0 * s1 * (1 - s2), i.e. memory is active + let chiplets_memory_flag = selectors.memory.is_active.clone(); let mflag_rc_stack = range_check * stack_lookups.clone() * chiplets_memory_flag; // LogUp transition constraint terms let b_next_term = b_next.into() * lookups.clone(); let b_term = b_local.into() * lookups; - let rc_term = stack_lookups * memory_lookups * local.range[RANGE_M_COL_IDX].clone().into(); + let rc_term = stack_lookups * memory_lookups * local.range.multiplicity.into(); // Stack lookup removal terms let s0_term = sflag_rc_mem.clone() * sv1.clone() * sv2.clone() * sv3.clone(); @@ -125,20 +99,12 @@ where let s3_term = sflag_rc_mem * sv0 * sv1 * sv2; // Memory lookup removal terms - let m0_term: AB::ExprEF = mflag_rc_stack.clone() * mv1; + let m0_term = mflag_rc_stack.clone() * mv1; let m1_term = mflag_rc_stack * mv0; // Main constraint: b_next * lookups = b * lookups + rc_term - s0_term - s1_term - s2_term - // s3_term - m0_term - m1_term - builder.tagged(TAG_RANGE_BUS_BASE, RANGE_BUS_NAME, |builder| { - builder.when_transition().assert_zero_ext( - b_next_term - b_term - rc_term - + s0_term - + s1_term - + s2_term - + s3_term - + m0_term - + m1_term, - ); - }); + builder.when_transition().assert_zero_ext( + b_next_term - b_term - rc_term + s0_term + s1_term + s2_term + s3_term + m0_term + m1_term, + ); } diff --git a/air/src/constraints/range/columns.rs b/air/src/constraints/range/columns.rs new file mode 100644 index 0000000000..57b6116194 --- /dev/null +++ b/air/src/constraints/range/columns.rs @@ -0,0 +1,8 @@ +/// Range check columns in the main execution trace (2 columns). +#[repr(C)] +pub struct RangeCols { + /// Multiplicity: how many times this value is range-checked. + pub multiplicity: T, + /// The value being range-checked. + pub value: T, +} diff --git a/air/src/constraints/range/mod.rs b/air/src/constraints/range/mod.rs index 3d8a684455..e490e71fd6 100644 --- a/air/src/constraints/range/mod.rs +++ b/air/src/constraints/range/mod.rs @@ -6,109 +6,47 @@ //! //! Bus constraints for the range checker are in `bus`. -use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::{AirBuilder, LiftedAirBuilder}; +pub mod columns; -use crate::{ - MainTraceRow, - constraints::tagging::{ - TaggingAirBuilderExt, - ids::{TAG_RANGE_MAIN_BASE, TAG_RANGE_MAIN_COUNT}, - }, - trace::{RANGE_CHECK_TRACE_OFFSET, range}, -}; +use miden_crypto::stark::air::AirBuilder; -pub mod bus; - -// CONSTANTS -// ================================================================================================ +use crate::{MainCols, MidenAirBuilder, constraints::constants::*}; -// --- SLICE-RELATIVE INDICES --------------------------------------------------------------------- -const RANGE_V_COL_IDX: usize = range::V_COL_IDX - RANGE_CHECK_TRACE_OFFSET; - -// TAGGING CONSTANTS -// ================================================================================================ - -const RANGE_MAIN_NAMES: [&str; TAG_RANGE_MAIN_COUNT] = - ["range.main.v.first_row", "range.main.v.last_row", "range.main.v.transition"]; +pub mod bus; // ENTRY POINTS // ================================================================================================ /// Enforces range checker main-trace constraints. -pub fn enforce_main( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, -) where - AB: LiftedAirBuilder, -{ - enforce_range_boundary_constraints(builder, local); - enforce_range_transition_constraint(builder, local, next); -} - -/// Enforces boundary constraints for the range checker. -/// -/// - First row: V[0] = 0 (range checker starts at 0) -/// - Last row: V[last] = 65535 (range checker ends at 2^16 - 1) -pub fn enforce_range_boundary_constraints(builder: &mut AB, local: &MainTraceRow) +pub fn enforce_main(builder: &mut AB, local: &MainCols, next: &MainCols) where - AB: LiftedAirBuilder, -{ - let v = local.range[RANGE_V_COL_IDX].clone(); - - // First row: V[0] = 0 - builder.tagged(TAG_RANGE_MAIN_BASE, RANGE_MAIN_NAMES[0], |builder| { - builder.when_first_row().assert_zero(v.clone()); - }); - - // Last row: V[last] = 65535 (2^16 - 1) - let sixty_five_k = AB::Expr::from_u32(65535); - builder.tagged(TAG_RANGE_MAIN_BASE + 1, RANGE_MAIN_NAMES[1], |builder| { - builder.when_last_row().assert_eq(v, sixty_five_k); - }); -} - -/// Enforces the transition constraint for the range checker V column. -/// -/// The V column must change by one of: {0, 1, 3, 9, 27, 81, 243, 729, 2187} -/// - 0 allows V to stay constant during padding rows -/// - Others are powers of 3: {3^0, 3^1, 3^2, 3^3, 3^4, 3^5, 3^6, 3^7} -/// -/// This is a degree-9 constraint. -pub fn enforce_range_transition_constraint( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, -) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { - let v = local.range[RANGE_V_COL_IDX].clone(); - let v_next = next.range[RANGE_V_COL_IDX].clone(); - let change_v = v_next - v; - - // Powers of 3: {1, 3, 9, 27, 81, 243, 729, 2187} - let one_expr = AB::Expr::ONE; - let three = AB::Expr::from_u16(3); - let nine = AB::Expr::from_u16(9); - let twenty_seven = AB::Expr::from_u16(27); - let eighty_one = AB::Expr::from_u16(81); - let two_forty_three = AB::Expr::from_u16(243); - let seven_twenty_nine = AB::Expr::from_u16(729); - let two_one_eight_seven = AB::Expr::from_u16(2187); - - // Note: Extra factor of change_v allows V to stay constant (change_v = 0) during padding - builder.tagged(TAG_RANGE_MAIN_BASE + 2, RANGE_MAIN_NAMES[2], |builder| { + let v = local.range.value; + let v_next = next.range.value; + + // Range checker boundaries: V[0] = 0, V[last] = 2^16 - 1 + { + builder.when_first_row().assert_zero(v); + builder.when_last_row().assert_eq(v, TWO_POW_16_MINUS_1); + } + + // Transition constraint for the V column (degree 9). + // V must change by one of: {0, 1, 3, 9, 27, 81, 243, 729, 2187} + // - 0 allows V to stay constant during padding rows + // - Others are powers of 3: {3^0, 3^1, 3^2, 3^3, 3^4, 3^5, 3^6, 3^7} + { + let change_v = v_next - v; builder.when_transition().assert_zero( change_v.clone() - * (change_v.clone() - one_expr) - * (change_v.clone() - three) - * (change_v.clone() - nine) - * (change_v.clone() - twenty_seven) - * (change_v.clone() - eighty_one) - * (change_v.clone() - two_forty_three) - * (change_v.clone() - seven_twenty_nine) - * (change_v - two_one_eight_seven), + * (change_v.clone() - F_1) + * (change_v.clone() - F_3) + * (change_v.clone() - F_9) + * (change_v.clone() - F_27) + * (change_v.clone() - F_81) + * (change_v.clone() - F_243) + * (change_v.clone() - F_729) + * (change_v - F_2187), ); - }); + } } diff --git a/air/src/constraints/stack/bus.rs b/air/src/constraints/stack/bus.rs index f22d8ddb44..6d4bb34da8 100644 --- a/air/src/constraints/stack/bus.rs +++ b/air/src/constraints/stack/bus.rs @@ -17,27 +17,14 @@ //! Each row in the overflow table is encoded as: //! `alpha + beta^0 * clk + beta^1 * val + beta^2 * prev` -use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::{ExtensionBuilder, LiftedAirBuilder, WindowAccess}; +use miden_crypto::stark::air::{ExtensionBuilder, WindowAccess}; use crate::{ - MainTraceRow, - constraints::{ - bus::indices::P1_STACK, - op_flags::OpFlags, - tagging::{TaggingAirBuilderExt, ids::TAG_STACK_OVERFLOW_BUS_BASE}, - }, - trace::{ - Challenges, - decoder::HASHER_STATE_RANGE, - stack::{B0_COL_IDX, B1_COL_IDX, H0_COL_IDX}, - }, + MainCols, MidenAirBuilder, + constraints::{bus::indices::P1_STACK, constants::F_16, op_flags::OpFlags, utils::BoolNot}, + trace::{Challenges, bus_types::STACK_OVERFLOW_TABLE}, }; -/// Tag ID and namespace for the stack overflow bus transition constraint. -const STACK_OVERFLOW_BUS_ID: usize = TAG_STACK_OVERFLOW_BUS_BASE; -const STACK_OVERFLOW_BUS_NAME: &str = "stack.overflow.bus.transition"; - // ENTRY POINTS // ================================================================================================ @@ -48,12 +35,12 @@ const STACK_OVERFLOW_BUS_NAME: &str = "stack.overflow.bus.transition"; /// - Removing rows when (left_shift OR dyncall) AND overflow is non-empty pub fn enforce_bus( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, challenges: &Challenges, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { // Auxiliary trace must be present. @@ -65,8 +52,6 @@ pub fn enforce_bus( (aux_local[P1_STACK], aux_next[P1_STACK]) }; - let one_ef = AB::ExprEF::ONE; - // ============================================================================================ // TRANSITION CONSTRAINT // ============================================================================================ @@ -76,25 +61,24 @@ pub fn enforce_bus( // ------------------------------------------------------------------------- // Current row values - let clk: AB::Expr = local.clk.clone().into(); - let s15: AB::Expr = local.stack[15].clone().into(); - let b0: AB::Expr = local.stack[B0_COL_IDX].clone().into(); - let b1: AB::Expr = local.stack[B1_COL_IDX].clone().into(); - let h0: AB::Expr = local.stack[H0_COL_IDX].clone().into(); + let clk = local.system.clk; + let s15 = local.stack.get(15); + let b0 = local.stack.b0; + let b1 = local.stack.b1; + let h0 = local.stack.h0; // Next row values (needed for removal) - let s15_next: AB::Expr = next.stack[15].clone().into(); - let b1_next: AB::Expr = next.stack[B1_COL_IDX].clone().into(); + let s15_next = next.stack.get(15); + let b1_next = next.stack.b1; // Hasher state element 5, used by DYNCALL to store the new overflow table pointer. - let hasher_state_5: AB::Expr = local.decoder[HASHER_STATE_RANGE.start + 5].clone().into(); + let hasher_state_5 = local.decoder.hasher_state[5]; // ------------------------------------------------------------------------- // Overflow condition: (b0 - 16) * h0 = 1 when overflow is non-empty // ------------------------------------------------------------------------- - let sixteen = AB::Expr::from_u16(16); - let is_non_empty_overflow: AB::Expr = (b0 - sixteen) * h0; + let is_non_empty_overflow: AB::Expr = (b0 - F_16) * h0; // ------------------------------------------------------------------------- // Operation flags @@ -109,21 +93,22 @@ pub fn enforce_bus( // ------------------------------------------------------------------------- // Response row value (adding to table during right_shift): - let response_row = challenges.encode([clk.clone(), s15.clone(), b1.clone()]); + let response_row = challenges.encode(STACK_OVERFLOW_TABLE, [clk.into(), s15.into(), b1.into()]); // Request row value for left_shift (removing from table): - let request_row_left = challenges.encode([b1.clone(), s15_next.clone(), b1_next.clone()]); + let request_row_left = + challenges.encode(STACK_OVERFLOW_TABLE, [b1.into(), s15_next.into(), b1_next.into()]); // Request row value for dyncall (removing from table): - let request_row_dyncall = - challenges.encode([b1.clone(), s15_next.clone(), hasher_state_5.clone()]); + let request_row_dyncall = challenges + .encode(STACK_OVERFLOW_TABLE, [b1.into(), s15_next.into(), hasher_state_5.into()]); // ------------------------------------------------------------------------- // Compute response and request terms // ------------------------------------------------------------------------- // Response: right_shift * response_row + (1 - right_shift) - let response: AB::ExprEF = response_row * right_shift.clone() + (one_ef.clone() - right_shift); + let response: AB::ExprEF = response_row * right_shift.clone() + right_shift.not(); // Request flags let left_flag: AB::Expr = left_shift * is_non_empty_overflow.clone(); @@ -133,7 +118,7 @@ pub fn enforce_bus( // Request: left_flag * left_value + dyncall_flag * dyncall_value + (1 - sum(flags)) let request: AB::ExprEF = request_row_left * left_flag.clone() + request_row_dyncall * dyncall_flag.clone() - + (one_ef.clone() - request_flag_sum); + + request_flag_sum.not(); // ------------------------------------------------------------------------- // Main running product constraint @@ -142,7 +127,5 @@ pub fn enforce_bus( let lhs = p1_next.into() * request; let rhs = p1_local.into() * response; - builder.tagged(STACK_OVERFLOW_BUS_ID, STACK_OVERFLOW_BUS_NAME, |builder| { - builder.when_transition().assert_zero_ext(lhs - rhs); - }); + builder.when_transition().assert_eq_ext(lhs, rhs); } diff --git a/air/src/constraints/stack/columns.rs b/air/src/constraints/stack/columns.rs new file mode 100644 index 0000000000..2a9678541d --- /dev/null +++ b/air/src/constraints/stack/columns.rs @@ -0,0 +1,28 @@ +use miden_core::program::MIN_STACK_DEPTH; + +/// Stack columns in the main execution trace (19 columns). +#[repr(C)] +pub struct StackCols { + /// Top 16 stack elements s0-s15. + pub(crate) top: [T; MIN_STACK_DEPTH], + /// Stack depth. + pub b0: T, + /// Overflow table parent address. + pub b1: T, + /// Helper: 1/(b0 - 16) when b0 != 16, else 0. + pub h0: T, +} + +impl StackCols { + /// Returns the stack element at position `idx` (0 = top of stack). + pub fn get(&self, idx: usize) -> T { + self.top[idx] + } +} + +impl StackCols { + /// Returns a slice of stack elements for the given range. + pub fn elements(&self, range: impl core::slice::SliceIndex<[T], Output = [T]>) -> &[T] { + &self.top[range] + } +} diff --git a/air/src/constraints/stack/crypto.rs b/air/src/constraints/stack/crypto.rs new file mode 100644 index 0000000000..a7c517b06f --- /dev/null +++ b/air/src/constraints/stack/crypto.rs @@ -0,0 +1,466 @@ +//! Crypto operation constraints. +//! +//! This module enforces the non-bus stack constraints for four crypto-related operations: +//! +//! - **CRYPTOSTREAM**: Encrypts memory words via XOR (i.e. addition in the prime field) with the +//! Poseidon2 sponge rate. Constraints here enforce pointer advancement and state stability; the +//! actual memory I/O and XOR happen via the chiplet bus (constrained elsewhere). +//! +//! - **HORNERBASE**: Evaluates a polynomial with base-field coefficients at an extension-field +//! point, processing 8 coefficients per row via Horner's method. Used during STARK verification +//! for polynomial commitment checks. +//! +//! - **HORNEREXT**: Same as HORNERBASE but for polynomials with extension-field coefficients, +//! processing 4 coefficient pairs per row. +//! +//! - **FRIE2F4**: Performs FRI layer folding, combining 4 extension-field query evaluations into 1, +//! and verifying the previous layer's folding was correct. + +use miden_core::{Felt, field::PrimeCharacteristicRing}; +use miden_crypto::stark::air::AirBuilder; + +use crate::{ + MainCols, MidenAirBuilder, + constraints::{ + constants::{F_3, F_4, F_8}, + ext_field::{QuadFeltAirBuilder, QuadFeltExpr}, + op_flags::OpFlags, + }, +}; + +// Fourth root of unity inverses (for FRI ext2fold4). +// tau = g^((p-1)/4) where p is the Goldilocks prime. +const TAU_INV: Felt = Felt::new(18446462594437873665); +const TAU2_INV: Felt = Felt::new(18446744069414584320); +const TAU3_INV: Felt = Felt::new(281474976710656); + +// ENTRY POINTS +// ================================================================================================ + +/// Enforces crypto operation constraints. +pub fn enforce_main( + builder: &mut AB, + local: &MainCols, + next: &MainCols, + op_flags: &OpFlags, +) where + AB: MidenAirBuilder, +{ + enforce_cryptostream_constraints(builder, local, next, op_flags); + enforce_hornerbase_constraints(builder, local, next, op_flags); + enforce_hornerext_constraints(builder, local, next, op_flags); + enforce_frie2f4_constraints(builder, local, next, op_flags); +} + +// CONSTRAINT HELPERS +// ================================================================================================ + +/// CRYPTOSTREAM: encrypts two memory words via XOR with the Poseidon2 sponge rate. +/// +/// The top 8 stack elements (rate/ciphertext) are updated by the chiplet bus, not +/// constrained here. These constraints enforce only: +/// - Capacity elements (s[8..12]) are preserved. +/// - Source and destination pointers (s[12], s[13]) advance by 8 (two words). +/// - Padding elements (s[14..16]) are preserved. +/// +/// Stack layout: +/// s[0..8] rate / ciphertext (updated via bus, unconstrained here) +/// s[8..12] capacity (preserved) +/// s[12] source pointer (incremented by 8) +/// s[13] destination pointer (incremented by 8) +/// s[14..16] padding (preserved) +fn enforce_cryptostream_constraints( + builder: &mut AB, + local: &MainCols, + next: &MainCols, + op_flags: &OpFlags, +) where + AB: MidenAirBuilder, +{ + let gate = builder.is_transition() * op_flags.cryptostream(); + let builder = &mut builder.when(gate); + + let s = &local.stack.top; + let s_next = &next.stack.top; + + // Capacity preserved. + builder.assert_eq(s_next[8], s[8]); + builder.assert_eq(s_next[9], s[9]); + builder.assert_eq(s_next[10], s[10]); + builder.assert_eq(s_next[11], s[11]); + + // Pointers advance by 8 (one memory word = 4 elements, two words per step). + builder.assert_eq(s_next[12], s[12].into() + F_8); + builder.assert_eq(s_next[13], s[13].into() + F_8); + + // Padding preserved. + builder.assert_eq(s_next[14], s[14]); + builder.assert_eq(s_next[15], s[15]); +} + +/// HORNERBASE: degree-7 polynomial evaluation over the quadratic extension field. +/// +/// Evaluates 8 base-field coefficients at an extension-field point α using Horner's +/// method, split into three stages for constraint degree reduction. The coefficients +/// are at s[0..8] with c0 being the highest-degree term (α⁷) and c7 the constant term. +/// +/// The prover supplies α and intermediate results (tmp0, tmp1) via helper registers. +/// Constraining the polynomial relations on these values forces correctness — no +/// separate validation of the helpers is needed. +/// +/// Stack layout: +/// s[0..8] c0..c7 base-field coefficients (c0 = α⁷ term, c7 = constant) +/// s[8..13] (unused) not affected by this operation +/// s[13] alpha_ptr memory address of α +/// s[14..16] (acc₀, acc₁) accumulator (quadratic extension element) +/// +/// Helper registers: +/// h[0..2] (α₀, α₁) evaluation point (read from alpha_ptr) +/// h[4..6] (tmp0₀, tmp0₁) first intermediate result +/// h[2..4] (tmp1₀, tmp1₁) second intermediate result +/// +/// Horner steps (expanded form; equivalent to (acc·α + c0)·α + c1, etc.): +/// tmp0 = acc · α² + (c0·α + c1) +/// tmp1 = tmp0 · α³ + (c2·α² + c3·α + c4) +/// acc' = tmp1 · α³ + (c5·α² + c6·α + c7) +fn enforce_hornerbase_constraints( + builder: &mut AB, + local: &MainCols, + next: &MainCols, + op_flags: &OpFlags, +) where + AB: MidenAirBuilder, +{ + let horner_builder = &mut builder.when(op_flags.hornerbase()); + + let s = &local.stack.top; + let s_next = &next.stack.top; + let helpers = local.decoder.user_op_helpers(); + + // Stack registers preserved during transition. + { + let builder = &mut horner_builder.when_transition(); + for i in 0..14 { + builder.assert_eq(s_next[i], s[i]); + } + } + + // Extension element alpha and its powers. + let alpha: QuadFeltExpr = QuadFeltExpr::new(helpers[0], helpers[1]); + let alpha_sq = alpha.clone().square(); + let alpha_cubed = alpha_sq.clone() * alpha.clone(); + + // Nondeterministic intermediates from decoder helpers. + let tmp0 = QuadFeltExpr::new(helpers[4], helpers[5]); + let tmp1 = QuadFeltExpr::new(helpers[2], helpers[3]); + + // Accumulator. + let acc = QuadFeltExpr::new(s[14], s[15]); + let acc_next = QuadFeltExpr::new(s_next[14], s_next[15]); + + // Base-field coefficient accessor. + let c = |i: usize| -> AB::Expr { s[i].into() }; + + // tmp0 = acc · α² + (c0·α + c1) + let tmp0_expected = acc * alpha_sq.clone() + alpha.clone() * c(0) + c(1); + // tmp1 = tmp0 · α³ + (c2·α² + c3·α + c4) + let tmp1_expected = + tmp0.clone() * alpha_cubed.clone() + alpha_sq.clone() * c(2) + alpha.clone() * c(3) + c(4); + // acc' = tmp1 · α³ + (c5·α² + c6·α + c7) + let acc_expected = tmp1.clone() * alpha_cubed + alpha_sq * c(5) + alpha * c(6) + c(7); + + // Intermediate temporaries match expected polynomial evaluations. + horner_builder.assert_eq_quad(tmp0, tmp0_expected); + horner_builder.assert_eq_quad(tmp1, tmp1_expected); + // Accumulator updated to next Horner step during transition. + horner_builder.when_transition().assert_eq_quad(acc_next, acc_expected); +} + +/// HORNEREXT: degree-3 polynomial evaluation over the quadratic extension field. +/// +/// Same Horner structure as HORNERBASE but with extension-field coefficients: each +/// coefficient is a quadratic extension element (a pair of base-field elements on +/// the stack). Processes 4 extension coefficients per row instead of 8 base ones, +/// so only α² is needed (not α³). +/// +/// Stack layout: +/// s[0..2] (c₀,₀, c₀,₁) highest-degree coefficient (α³ term) +/// s[2..4] (c₁,₀, c₁,₁) α² term +/// s[4..6] (c₂,₀, c₂,₁) α¹ term +/// s[6..8] (c₃,₀, c₃,₁) constant term +/// s[8..13] (unused) not affected by this operation +/// s[13] alpha_ptr memory address of α (word: [α₀, α₁, k0, k1]) +/// s[14..16] (acc₀, acc₁) accumulator (quadratic extension element) +/// +/// Helper registers: +/// h[0..2] (α₀, α₁) evaluation point +/// h[2..4] k0, k1 padding from the α memory word (unused by constraints) +/// h[4..6] (tmp₀, tmp₁) intermediate result +/// +/// Horner steps: +/// tmp = acc · α² + (c0·α + c1) +/// acc' = tmp · α² + (c2·α + c3) +fn enforce_hornerext_constraints( + builder: &mut AB, + local: &MainCols, + next: &MainCols, + op_flags: &OpFlags, +) where + AB: MidenAirBuilder, +{ + let horner_builder = &mut builder.when(op_flags.hornerext()); + + let s = &local.stack.top; + let s_next = &next.stack.top; + let helpers = local.decoder.user_op_helpers(); + + // Stack registers preserved during transition. + { + let builder = &mut horner_builder.when_transition(); + for i in 0..14 { + builder.assert_eq(s_next[i], s[i]); + } + } + + // Extension element alpha and its square. + let alpha: QuadFeltExpr = QuadFeltExpr::new(helpers[0], helpers[1]); + let alpha_sq = alpha.clone().square(); + + // Nondeterministic intermediate from decoder helpers. + let tmp = QuadFeltExpr::new(helpers[4], helpers[5]); + + // Accumulator. + let acc = QuadFeltExpr::new(s[14], s[15]); + let acc_next = QuadFeltExpr::new(s_next[14], s_next[15]); + + // Extension-field coefficient pairs from the stack. + let c0 = QuadFeltExpr::new(s[0], s[1]); + let c1 = QuadFeltExpr::new(s[2], s[3]); + let c2 = QuadFeltExpr::new(s[4], s[5]); + let c3 = QuadFeltExpr::new(s[6], s[7]); + + // tmp = acc · α² + (c0·α + c1) + let tmp_expected = acc * alpha_sq.clone() + alpha.clone() * c0 + c1; + // acc' = tmp · α² + (c2·α + c3) + let acc_expected = tmp.clone() * alpha_sq + alpha * c2 + c3; + + // Intermediate temporary matches expected polynomial evaluation. + horner_builder.assert_eq_quad(tmp, tmp_expected); + // Accumulator updated to next Horner step during transition. + horner_builder.when_transition().assert_eq_quad(acc_next, acc_expected); +} + +/// FRIE2F4: FRI layer folding — folds 4 extension-field query evaluations into 1. +/// +/// During FRI (Fast Reed-Solomon IOP) verification, the verifier reduces polynomial +/// degree by folding evaluations at related domain points. This operation folds 4 +/// query evaluations from a source domain of size 4N into 1 evaluation in the folded +/// domain of size N, using the verifier's random challenge α. +/// +/// The fold4 algorithm applies fold2 three times: +/// fold_mid0 = fold2(q0, q2, eval_point) — first conjugate pair +/// fold_mid1 = fold2(q1, q3, eval_point · τ⁻¹) — second pair (coset-shifted) +/// fold_result = fold2(fold_mid0, fold_mid1, eval_point_sq) +/// +/// where eval_point = α / domain_point, and domain_point = poe · tau_factor. +/// +/// The operation also verifies that the previous layer's folding was correct +/// (prev_eval must match the query value selected by the domain segment) and +/// advances state for the next layer (poe → poe⁴, layer pointer += 8). +/// +/// ## Register map +/// +/// Input stack (current row): +/// s[0..2] (q₀,₀, q₀,₁) query eval 0 ─┐ 4 extension-field evaluations +/// s[2..4] (q₂,₀, q₂,₁) query eval 2 │ (bit-reversed stack order; +/// s[4..6] (q₁,₀, q₁,₁) query eval 1 │ see "Bit-reversal" below) +/// s[6..8] (q₃,₀, q₃,₁) query eval 3 ─┘ +/// s[8] folded_pos query position in the folded domain +/// s[9] tree_index bit-reversed index: tree_index = 4·folded_pos + segment +/// s[10] poe power of initial domain generator +/// s[11..13] prev_eval previous layer's folded value (for consistency check) +/// s[13..15] (α₀, α₁) verifier challenge for this FRI layer +/// s[15] layer_ptr memory address of current FRI layer data +/// +/// Output stack (next row — first 10 positions are degree-reduction intermediates): +/// s'[0..2] fold_mid0 first fold2 intermediate result +/// s'[2..4] fold_mid1 second fold2 intermediate result +/// s'[4..8] seg_flag[0..3] domain segment flags (one-hot) +/// s'[8] poe_sq poe² +/// s'[9] tau_factor τ^(-segment) for this coset +/// s'[10] layer_ptr + 8 advanced layer pointer +/// s'[11] poe_fourth poe⁴ (for next FRI layer) +/// s'[12] folded_pos copied from input +/// s'[13..15] fold_result final fold4 output +/// +/// Helper registers (nondeterministic, provided by prover): +/// h[0..2] eval_point folding parameter = α / domain_point +/// h[2..4] eval_point_sq eval_point² (for the final fold2 round) +/// h[4] domain_point x = poe · tau_factor +/// h[5] domain_point_inv 1/x +/// +/// ## Bit-reversal +/// +/// Query values are stored on the stack in bit-reversed order (matching NTT +/// evaluation layout). The constraint names use natural order for fold4: +/// +/// stack position: [0,1] [2,3] [4,5] [6,7] +/// bit-reversed: qv0 qv1 qv2 qv3 +/// natural (fold4): q0 q2 q1 q3 +/// +/// fold4 pairs conjugate points: (q0, q2) and (q1, q3). +fn enforce_frie2f4_constraints( + builder: &mut AB, + local: &MainCols, + next: &MainCols, + op_flags: &OpFlags, +) where + AB: MidenAirBuilder, +{ + let builder = &mut builder.when(op_flags.frie2f4()); + + let s = &local.stack.top; + let s_next = &next.stack.top; + let helpers = local.decoder.user_op_helpers(); + + // ========================================================================== + // Inputs (current row) + // ========================================================================== + // Query values in natural order for fold4 (see "Bit-reversal" in docstring). + let q0 = QuadFeltExpr::new(s[0], s[1]); + let q2 = QuadFeltExpr::new(s[2], s[3]); + let q1 = QuadFeltExpr::new(s[4], s[5]); + let q3 = QuadFeltExpr::new(s[6], s[7]); + + let folded_pos = s[8]; + let tree_index = s[9]; + let poe = s[10]; + let prev_eval = QuadFeltExpr::new(s[11], s[12]); + let alpha = QuadFeltExpr::new(s[13], s[14]); + let layer_ptr = s[15]; + + // ========================================================================== + // Phase 1: Domain segment identification + // ========================================================================== + // Determine which coset of the 4-element multiplicative subgroup this query + // belongs to. The segment flags are one-hot: exactly one is 1. From them we + // derive the segment index (for position decomposition) and the tau factor + // (the twiddle factor τ^(-segment) for computing the domain point). + + let seg_flag_0 = s_next[4]; + let seg_flag_1 = s_next[5]; + let seg_flag_2 = s_next[6]; + let seg_flag_3 = s_next[7]; + + // Segment flags must be binary and exactly one must be active. + builder.assert_bools([seg_flag_0, seg_flag_1, seg_flag_2, seg_flag_3]); + builder.assert_one(seg_flag_0 + seg_flag_1 + seg_flag_2 + seg_flag_3); + + // The tree_index encodes both the folded position and the domain segment: + // tree_index = 4 · folded_pos + segment_index + // Bit-reversal mapping from flags to segment index: + // flag0 → 0, flag1 → 2, flag2 → 1, flag3 → 3 + // so segment_index = 2·flag1 + flag2 + 3·flag3. + let folded_pos_next = s_next[12]; + let segment_index = seg_flag_1.into().double() + seg_flag_2 + seg_flag_3 * F_3; + builder.assert_eq(tree_index, folded_pos_next * F_4 + segment_index); + + // Each segment corresponds to a power of τ⁻¹ (the inverse 4th root of unity). + // The one-hot flags select the appropriate power. + let tau_factor = s_next[9]; + let expected_tau = + seg_flag_0 + seg_flag_1 * TAU_INV + seg_flag_2 * TAU2_INV + seg_flag_3 * TAU3_INV; + builder.assert_eq(tau_factor, expected_tau); + + // ========================================================================== + // Phase 2: Folding parameters + // ========================================================================== + // Compute the domain point and evaluation parameters needed for fold2. + // + // The domain point is x = poe · tau_factor, the evaluation point in the source + // domain. The fold2 function needs eval_point = α/x and eval_point_sq = (α/x)². + // + // The prover supplies these nondeterministically via helper registers. + // Constraining the relations here forces the prover to provide correct values. + + // domain_point = poe · tau_factor, with a verified inverse. + let domain_point = helpers[4]; + let domain_point_inv = helpers[5]; + builder.assert_eq(domain_point, poe * tau_factor); + builder.assert_one(domain_point * domain_point_inv); + + // eval_point = α / domain_point = α · domain_point_inv (in Fp2). + let eval_point: QuadFeltExpr = QuadFeltExpr::new(helpers[0], helpers[1]); + builder.assert_eq_quad(eval_point.clone(), alpha * domain_point_inv.into()); + + // eval_point_sq = eval_point² (needed for the final fold2 round). + let eval_point_sq: QuadFeltExpr = QuadFeltExpr::new(helpers[2], helpers[3]); + builder.assert_eq_quad(eval_point_sq.clone(), eval_point.clone().square()); + + // ========================================================================== + // Phase 3: Fold4 — core FRI folding + // ========================================================================== + // fold2 recovers the degree-halved polynomial from evaluations at conjugate + // domain points. If f(z) = g(z²) + z·h(z²), then: + // f(x) + f(-x) = 2·g(x²) (even part) + // f(x) - f(-x) = 2x·h(x²) (odd part) + // Combining: fold2(f(x), f(-x), α/x) = g(x²) + (α/x)·h(x²) + // + // Formula: fold2(a, b, ep) = ((a + b) + (a - b) · ep) / 2 + // Constraint form: 2 · result = (a + b) + (a - b) · ep (avoids division). + + // Returns 2 · fold2(a, b, ep) as a constraint expression. + let fold2_doubled = |a: QuadFeltExpr, + b: QuadFeltExpr, + ep: QuadFeltExpr| + -> QuadFeltExpr { (a.clone() + b.clone()) + (a - b) * ep }; + + // Intermediate fold results stored in the next row for degree reduction. + let fold_mid0 = QuadFeltExpr::new(s_next[0], s_next[1]); + let fold_mid1 = QuadFeltExpr::new(s_next[2], s_next[3]); + let fold_result = QuadFeltExpr::new(s_next[13], s_next[14]); + + // Three fold2 applications compose into fold4: + // fold_mid0 = fold2(q0, q2, eval_point) + // fold_mid1 = fold2(q1, q3, eval_point · τ⁻¹) + // fold_result = fold2(fold_mid0, fold_mid1, eval_point_sq) + + builder.assert_eq_quad(fold_mid0.clone().double(), fold2_doubled(q0, q2, eval_point.clone())); + + // The second conjugate pair lives on a coset shifted by τ, so the evaluation + // parameter is adjusted by τ⁻¹ to account for the coset offset. + let eval_point_coset = eval_point * AB::Expr::from(TAU_INV); + builder.assert_eq_quad(fold_mid1.clone().double(), fold2_doubled(q1, q3, eval_point_coset)); + + builder + .assert_eq_quad(fold_result.double(), fold2_doubled(fold_mid0, fold_mid1, eval_point_sq)); + + // ========================================================================== + // Phase 4: Cross-layer consistency and state updates + // ========================================================================== + + // The folded output from the previous FRI layer (prev_eval) must equal the + // query value at the position indicated by the domain segment. This links + // adjacent FRI layers: layer k's fold_result appears as one of layer k+1's + // four query inputs. + // + // The segment flags select which query value to compare. Uses raw stack + // positions because the query QuadFeltExprs were consumed by fold2 above. + // Mapping: seg_flag_0 → s[0,1]=q0, seg_flag_1 → s[4,5]=q1, + // seg_flag_2 → s[2,3]=q2, seg_flag_3 → s[6,7]=q3. + let selected_re = s[0] * seg_flag_0 + s[4] * seg_flag_1 + s[2] * seg_flag_2 + s[6] * seg_flag_3; + let selected_im = s[1] * seg_flag_0 + s[5] * seg_flag_1 + s[3] * seg_flag_2 + s[7] * seg_flag_3; + builder.assert_eq_quad(prev_eval, QuadFeltExpr::new(selected_re, selected_im)); + + // Domain generator powers for the next layer: poe → poe² → poe⁴. + // Split into two squarings to keep constraint degree low. + let poe_sq = s_next[8]; + let poe_fourth = s_next[11]; + builder.assert_eq(poe_sq, poe * poe); + builder.assert_eq(poe_fourth, poe_sq * poe_sq); + + // Advance the layer pointer and preserve the folded position. + let layer_ptr_next = s_next[10]; + builder.assert_eq(layer_ptr_next, layer_ptr + F_8); + builder.assert_eq(folded_pos_next, folded_pos); +} diff --git a/air/src/constraints/stack/crypto/mod.rs b/air/src/constraints/stack/crypto/mod.rs deleted file mode 100644 index cf699d71dc..0000000000 --- a/air/src/constraints/stack/crypto/mod.rs +++ /dev/null @@ -1,339 +0,0 @@ -//! Crypto operation constraints. -//! -//! This module enforces crypto-related stack ops: -//! CRYPTOSTREAM, HORNERBASE, and HORNEREXT. - -use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::LiftedAirBuilder; - -use crate::{ - MainTraceRow, - constraints::{ - ext_field::QuadFeltExpr, - op_flags::OpFlags, - tagging::{ - TagGroup, TaggingAirBuilderExt, ids::TAG_STACK_CRYPTO_BASE, tagged_assert_zero, - tagged_assert_zero_integrity, - }, - }, - trace::decoder::USER_OP_HELPERS_OFFSET, -}; - -// CONSTANTS -// ================================================================================================ - -/// Number of crypto op constraints. -#[allow(dead_code)] -pub const NUM_CONSTRAINTS: usize = 46; - -/// Base tag ID for crypto op constraints. -const STACK_CRYPTO_BASE_ID: usize = TAG_STACK_CRYPTO_BASE; - -/// Tag namespaces for crypto op constraints. -const STACK_CRYPTO_NAMES: [&str; NUM_CONSTRAINTS] = [ - // CRYPTOSTREAM (8) - "stack.crypto.cryptostream", - "stack.crypto.cryptostream", - "stack.crypto.cryptostream", - "stack.crypto.cryptostream", - "stack.crypto.cryptostream", - "stack.crypto.cryptostream", - "stack.crypto.cryptostream", - "stack.crypto.cryptostream", - // HORNERBASE (20) - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - "stack.crypto.hornerbase", - // HORNEREXT (18) - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", - "stack.crypto.hornerext", -]; - -/// Tag metadata for this constraint group. -const STACK_CRYPTO_TAGS: TagGroup = TagGroup { - base: STACK_CRYPTO_BASE_ID, - names: &STACK_CRYPTO_NAMES, -}; - -// ENTRY POINTS -// ================================================================================================ - -/// Enforces crypto operation constraints. -pub fn enforce_main( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, - op_flags: &OpFlags, -) where - AB: LiftedAirBuilder, -{ - let mut idx = 0usize; - enforce_cryptostream_constraints(builder, local, next, op_flags, &mut idx); - enforce_hornerbase_constraints(builder, local, next, op_flags, &mut idx); - enforce_hornerext_constraints(builder, local, next, op_flags, &mut idx); -} - -// CONSTRAINT HELPERS -// ================================================================================================ - -fn enforce_cryptostream_constraints( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, - op_flags: &OpFlags, - idx: &mut usize, -) where - AB: LiftedAirBuilder, -{ - // CRYPTOSTREAM keeps the top of the stack stable except for the two counters - // that track the stream offset. Those counters advance by 8 (one word) per row. - // Everything is gated by the op flag, so the constraints are active only when - // CRYPTOSTREAM is executed. - let eight: AB::Expr = AB::Expr::from_u16(8); - let gate = op_flags.cryptostream(); - - assert_zero( - builder, - idx, - gate.clone() * (next.stack[8].clone().into() - local.stack[8].clone().into()), - ); - assert_zero( - builder, - idx, - gate.clone() * (next.stack[9].clone().into() - local.stack[9].clone().into()), - ); - assert_zero( - builder, - idx, - gate.clone() * (next.stack[10].clone().into() - local.stack[10].clone().into()), - ); - assert_zero( - builder, - idx, - gate.clone() * (next.stack[11].clone().into() - local.stack[11].clone().into()), - ); - assert_zero( - builder, - idx, - gate.clone() - * (next.stack[12].clone().into() - (local.stack[12].clone().into() + eight.clone())), - ); - assert_zero( - builder, - idx, - gate.clone() * (next.stack[13].clone().into() - (local.stack[13].clone().into() + eight)), - ); - assert_zero( - builder, - idx, - gate.clone() * (next.stack[14].clone().into() - local.stack[14].clone().into()), - ); - assert_zero( - builder, - idx, - gate * (next.stack[15].clone().into() - local.stack[15].clone().into()), - ); -} - -fn enforce_hornerbase_constraints( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, - op_flags: &OpFlags, - idx: &mut usize, -) where - AB: LiftedAirBuilder, -{ - // HORNERBASE evaluates a degree-7 polynomial over the quadratic extension. - // The accumulator lives in stack[14..16] and is updated using helper values - // supplied (nondeterministically) through the decoder helper registers. We - // enforce the algebraic relationships that must hold between the helpers, the - // coefficients on the stack, and the accumulator update. These constraints - // also implicitly bind the helper values to the required power relations. - let gate = op_flags.hornerbase(); - - // The lower 14 stack registers remain unchanged during HORNERBASE. - for i in 0..14 { - assert_zero( - builder, - idx, - gate.clone() * (next.stack[i].clone().into() - local.stack[i].clone().into()), - ); - } - - // Decoder helper columns contain alpha components and intermediate temporaries. - // We read them starting at USER_OP_HELPERS_OFFSET to avoid hardcoding column indices. - let base = USER_OP_HELPERS_OFFSET; - let a0: AB::Expr = local.decoder[base].clone().into(); - let a1: AB::Expr = local.decoder[base + 1].clone().into(); - let tmp1_0: AB::Expr = local.decoder[base + 2].clone().into(); - let tmp1_1: AB::Expr = local.decoder[base + 3].clone().into(); - let tmp0_0: AB::Expr = local.decoder[base + 4].clone().into(); - let tmp0_1: AB::Expr = local.decoder[base + 5].clone().into(); - - let acc0: AB::Expr = local.stack[14].clone().into(); - let acc1: AB::Expr = local.stack[15].clone().into(); - let acc0_next: AB::Expr = next.stack[14].clone().into(); - let acc1_next: AB::Expr = next.stack[15].clone().into(); - - // Coefficients are read from the bottom of the stack. - let c: [AB::Expr; 8] = core::array::from_fn(|i| local.stack[i].clone().into()); - - // Quadratic extension view (Fp2 with u^2 = 7): - // - alpha = (a0, a1), acc = (acc0, acc1) - // - tmp0 = (tmp0_0, tmp0_1), tmp1 = (tmp1_0, tmp1_1) - // - c[0..7] are base-field scalars - // - // Horner form: - // tmp0 = acc * alpha^2 + (c0 * alpha + c1) - // tmp1 = tmp0 * alpha^3 + (c2 * alpha^2 + c3 * alpha + c4) - // acc' = tmp1 * alpha^3 + (c5 * alpha^2 + c6 * alpha + c7) - let alpha: QuadFeltExpr = QuadFeltExpr::new(&a0, &a1); - let alpha2 = alpha.clone().square(); - let alpha3 = alpha2.clone() * alpha.clone(); - let acc: QuadFeltExpr = QuadFeltExpr::new(&acc0, &acc1); - let acc_alpha2: QuadFeltExpr = acc * alpha2.clone(); - let tmp0: QuadFeltExpr = QuadFeltExpr::new(&tmp0_0, &tmp0_1); - let tmp0_alpha3: QuadFeltExpr = tmp0.clone() * alpha3.clone(); - let tmp1: QuadFeltExpr = QuadFeltExpr::new(&tmp1_0, &tmp1_1); - - // tmp0 = acc * alpha^2 + (c0 * alpha + c1) - let tmp0_expected: QuadFeltExpr = - acc_alpha2 + alpha.clone() * c[0].clone() + c[1].clone(); - let [tmp0_exp_0, tmp0_exp_1] = tmp0_expected.into_parts(); - - // tmp1 = tmp0 * alpha^3 + (c2 * alpha^2 + c3 * alpha + c4) - let tmp1_expected: QuadFeltExpr = - tmp0_alpha3 + alpha2.clone() * c[2].clone() + alpha.clone() * c[3].clone() + c[4].clone(); - let [tmp1_exp_0, tmp1_exp_1] = tmp1_expected.into_parts(); - - // acc' = tmp1 * alpha^3 + (alpha^2 * c5 + alpha * c6 + c7) - let acc_expected: QuadFeltExpr = - tmp1 * alpha3 + alpha2.clone() * c[5].clone() + alpha.clone() * c[6].clone() + c[7].clone(); - let [acc_exp_0, acc_exp_1] = acc_expected.into_parts(); - - assert_zero_integrity(builder, idx, gate.clone() * (tmp0_0 - tmp0_exp_0)); - assert_zero_integrity(builder, idx, gate.clone() * (tmp0_1 - tmp0_exp_1)); - assert_zero_integrity(builder, idx, gate.clone() * (tmp1_0 - tmp1_exp_0)); - assert_zero_integrity(builder, idx, gate.clone() * (tmp1_1 - tmp1_exp_1)); - assert_zero(builder, idx, gate.clone() * (acc0_next - acc_exp_0)); - assert_zero(builder, idx, gate * (acc1_next - acc_exp_1)); -} - -fn enforce_hornerext_constraints( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, - op_flags: &OpFlags, - idx: &mut usize, -) where - AB: LiftedAirBuilder, -{ - // HORNEREXT evaluates a degree-3 polynomial over the quadratic extension with - // a smaller helper set. As with HORNERBASE, helper values are supplied via - // decoder columns, and the constraints below bind them to the required - // power relations and accumulator update. - let gate = op_flags.hornerext(); - - // The lower 14 stack registers are unchanged by HORNEREXT. - for i in 0..14 { - assert_zero( - builder, - idx, - gate.clone() * (next.stack[i].clone().into() - local.stack[i].clone().into()), - ); - } - - // Helper columns and accumulator values. - let base = USER_OP_HELPERS_OFFSET; - let a0: AB::Expr = local.decoder[base].clone().into(); - let a1: AB::Expr = local.decoder[base + 1].clone().into(); - let tmp0: AB::Expr = local.decoder[base + 4].clone().into(); - let tmp1: AB::Expr = local.decoder[base + 5].clone().into(); - - let acc0: AB::Expr = local.stack[14].clone().into(); - let acc1: AB::Expr = local.stack[15].clone().into(); - let acc0_next: AB::Expr = next.stack[14].clone().into(); - let acc1_next: AB::Expr = next.stack[15].clone().into(); - - // Coefficients live at the bottom of the stack. - let s: [AB::Expr; 8] = core::array::from_fn(|i| local.stack[i].clone().into()); - - // Quadratic extension view (Fp2 with u^2 = 7): - // - alpha = (a0, a1), acc = (acc0, acc1), tmp = (tmp0, tmp1) - // - extension coefficients use the stack pairs: c0 = (s0, s1), c1 = (s2, s3), c2 = (s4, s5), c3 - // = (s6, s7) - // - // Horner form: - // tmp = acc * alpha^2 + (c0 * alpha + c1) - // acc' = tmp * alpha^2 + (c2 * alpha + c3) - let alpha: QuadFeltExpr = QuadFeltExpr::new(&a0, &a1); - let alpha2 = alpha.clone().square(); - let acc: QuadFeltExpr = QuadFeltExpr::new(&acc0, &acc1); - let acc_alpha2: QuadFeltExpr = acc * alpha2.clone(); - let tmp: QuadFeltExpr = QuadFeltExpr::new(&tmp0, &tmp1); - let tmp_alpha2: QuadFeltExpr = tmp * alpha2; - - let c0 = QuadFeltExpr::new(&s[0], &s[1]); - let c1 = QuadFeltExpr::new(&s[2], &s[3]); - let c2 = QuadFeltExpr::new(&s[4], &s[5]); - let c3 = QuadFeltExpr::new(&s[6], &s[7]); - - // tmp = acc * alpha^2 + (c0 * alpha + c1) - let tmp_expected: QuadFeltExpr = acc_alpha2 + alpha.clone() * c0 + c1; - let [tmp_exp_0, tmp_exp_1] = tmp_expected.into_parts(); - - // acc' = tmp * alpha^2 + (c2 * alpha + c3) - let acc_expected: QuadFeltExpr = tmp_alpha2 + alpha * c2 + c3; - let [acc_exp_0, acc_exp_1] = acc_expected.into_parts(); - - assert_zero_integrity(builder, idx, gate.clone() * (tmp0 - tmp_exp_0)); - assert_zero_integrity(builder, idx, gate.clone() * (tmp1 - tmp_exp_1)); - assert_zero(builder, idx, gate.clone() * (acc0_next - acc_exp_0)); - assert_zero(builder, idx, gate * (acc1_next - acc_exp_1)); -} - -fn assert_zero(builder: &mut AB, idx: &mut usize, expr: AB::Expr) { - tagged_assert_zero(builder, &STACK_CRYPTO_TAGS, idx, expr); -} - -fn assert_zero_integrity( - builder: &mut AB, - idx: &mut usize, - expr: AB::Expr, -) { - tagged_assert_zero_integrity(builder, &STACK_CRYPTO_TAGS, idx, expr); -} diff --git a/air/src/constraints/stack/general.rs b/air/src/constraints/stack/general.rs new file mode 100644 index 0000000000..408f426b82 --- /dev/null +++ b/air/src/constraints/stack/general.rs @@ -0,0 +1,89 @@ +//! General stack transition constraints. +//! +//! This module contains the general constraints that enforce how stack items transition +//! based on the operation type (no shift, left shift, right shift). +//! +//! ## Stack Transition Model +//! +//! The stack has 16 visible positions (0-15). For each operation, stack items can: +//! - **Stay in place** (no shift): item stays at same position +//! - **Shift left**: item moves to position i from position i+1 +//! - **Shift right**: item moves to position i from position i-1 +//! +//! ## Constraints +//! +//! 1. **Position 0**: Can receive from position 0 (no shift) or position 1 (left shift). Right +//! shift doesn't apply - position 0 gets a new value pushed. +//! +//! 2. **Positions 1-14**: Can receive from position i (no shift), i+1 (left shift), or i-1 (right +//! shift). +//! +//! 3. **Position 15**: Can receive from position 15 (no shift) or position 14 (right shift). Left +//! shift at position 15 is handled by overflow constraints (zeroing). +//! +//! 4. **Top binary**: Enforced by the specific op constraints that require it. + +use miden_crypto::stark::air::AirBuilder; + +use crate::{MainCols, MidenAirBuilder, constraints::op_flags::OpFlags}; + +// ENTRY POINTS +// ================================================================================================ + +/// Enforces all general stack transition constraints. +/// +/// This includes: +/// - 16 constraints for stack item transitions at each position +pub fn enforce_main( + builder: &mut AB, + local: &MainCols, + next: &MainCols, + op_flags: &OpFlags, +) where + AB: MidenAirBuilder, +{ + // For each position i, the constraint ensures that the next value is consistent + // with the current value based on the shift flags: + // + // next[i] * flag_sum = no_shift[i] * current[i] + // + left_shift[i+1] * current[i+1] + // + right_shift[i-1] * current[i-1] + // + // where flag_sum is the sum of applicable flags for that position. + + // Position 0: no right shift (new value pushed instead) + // next[0] * flag_sum = no_shift[0] * current[0] + left_shift[1] * current[1] + { + let flag_sum = op_flags.no_shift_at(0) + op_flags.left_shift_at(1); + let expected = op_flags.no_shift_at(0) * local.stack.get(0).into() + + op_flags.left_shift_at(1) * local.stack.get(1).into(); + let actual = next.stack.get(0); + + builder.when_transition().assert_zero(actual * flag_sum - expected); + } + + // Positions 1-14: all three shift types possible. + for i in 1..15 { + let flag_sum = op_flags.no_shift_at(i) + + op_flags.left_shift_at(i + 1) + + op_flags.right_shift_at(i - 1); + + let expected = op_flags.no_shift_at(i) * local.stack.get(i).into() + + op_flags.left_shift_at(i + 1) * local.stack.get(i + 1).into() + + op_flags.right_shift_at(i - 1) * local.stack.get(i - 1).into(); + let actual = next.stack.get(i); + + builder.when_transition().assert_zero(actual * flag_sum - expected); + } + + // Position 15: no left shift (handled by overflow constraints) + // next[15] * flag_sum = no_shift[15] * current[15] + right_shift[14] * current[14] + { + let flag_sum = op_flags.no_shift_at(15) + op_flags.right_shift_at(14); + let expected = op_flags.no_shift_at(15) * local.stack.get(15).into() + + op_flags.right_shift_at(14) * local.stack.get(14).into(); + let actual = next.stack.get(15); + + builder.when_transition().assert_zero(actual * flag_sum - expected); + } +} diff --git a/air/src/constraints/stack/general/mod.rs b/air/src/constraints/stack/general/mod.rs deleted file mode 100644 index 28bc538f64..0000000000 --- a/air/src/constraints/stack/general/mod.rs +++ /dev/null @@ -1,133 +0,0 @@ -//! General stack transition constraints. -//! -//! This module contains the general constraints that enforce how stack items transition -//! based on the operation type (no shift, left shift, right shift). -//! -//! ## Stack Transition Model -//! -//! The stack has 16 visible positions (0-15). For each operation, stack items can: -//! - **Stay in place** (no shift): item stays at same position -//! - **Shift left**: item moves to position i from position i+1 -//! - **Shift right**: item moves to position i from position i-1 -//! -//! ## Constraints -//! -//! 1. **Position 0**: Can receive from position 0 (no shift) or position 1 (left shift). Right -//! shift doesn't apply - position 0 gets a new value pushed. -//! -//! 2. **Positions 1-14**: Can receive from position i (no shift), i+1 (left shift), or i-1 (right -//! shift). -//! -//! 3. **Position 15**: Can receive from position 15 (no shift) or position 14 (right shift). Left -//! shift at position 15 is handled by overflow constraints (zeroing). -//! -//! 4. **Top binary**: Enforced by the specific op constraints that require it. - -use miden_crypto::stark::air::{AirBuilder, LiftedAirBuilder}; - -use crate::{ - MainTraceRow, - constraints::{ - op_flags::OpFlags, - tagging::{ - TaggingAirBuilderExt, - ids::{TAG_STACK_GENERAL_BASE, TAG_STACK_GENERAL_COUNT}, - }, - }, -}; - -// CONSTANTS -// ================================================================================================ - -/// Number of general stack constraints. -/// 16 constraints for stack item transitions. -pub const NUM_CONSTRAINTS: usize = TAG_STACK_GENERAL_COUNT; - -/// Tag base ID for stack general constraints. -/// Tag namespaces for stack general constraints. -const STACK_GENERAL_NAMES: [&str; NUM_CONSTRAINTS] = [ - "stack.general.transition.0", - "stack.general.transition.1", - "stack.general.transition.2", - "stack.general.transition.3", - "stack.general.transition.4", - "stack.general.transition.5", - "stack.general.transition.6", - "stack.general.transition.7", - "stack.general.transition.8", - "stack.general.transition.9", - "stack.general.transition.10", - "stack.general.transition.11", - "stack.general.transition.12", - "stack.general.transition.13", - "stack.general.transition.14", - "stack.general.transition.15", -]; - -// ENTRY POINTS -// ================================================================================================ - -/// Enforces all general stack transition constraints. -/// -/// This includes: -/// - 16 constraints for stack item transitions at each position -pub fn enforce_main( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, - op_flags: &OpFlags, -) where - AB: LiftedAirBuilder, -{ - // For each position i, the constraint ensures that the next value is consistent - // with the current value based on the shift flags: - // - // next[i] * flag_sum = no_shift[i] * current[i] - // + left_shift[i+1] * current[i+1] - // + right_shift[i-1] * current[i-1] - // - // where flag_sum is the sum of applicable flags for that position. - - // Position 0: no right shift (new value pushed instead) - // next[0] * flag_sum = no_shift[0] * current[0] + left_shift[1] * current[1] - { - let flag_sum = op_flags.no_shift_at(0) + op_flags.left_shift_at(1); - let expected = op_flags.no_shift_at(0) * local.stack[0].clone().into() - + op_flags.left_shift_at(1) * local.stack[1].clone().into(); - let actual: AB::Expr = next.stack[0].clone().into(); - - builder.tagged(TAG_STACK_GENERAL_BASE, STACK_GENERAL_NAMES[0], |builder| { - builder.when_transition().assert_zero(actual * flag_sum - expected); - }); - } - - // Positions 1-14: all three shift types possible. - for (i, &namespace) in STACK_GENERAL_NAMES.iter().enumerate().take(15).skip(1) { - let flag_sum = op_flags.no_shift_at(i) - + op_flags.left_shift_at(i + 1) - + op_flags.right_shift_at(i - 1); - - let expected = op_flags.no_shift_at(i) * local.stack[i].clone().into() - + op_flags.left_shift_at(i + 1) * local.stack[i + 1].clone().into() - + op_flags.right_shift_at(i - 1) * local.stack[i - 1].clone().into(); - let actual: AB::Expr = next.stack[i].clone().into(); - - let id = TAG_STACK_GENERAL_BASE + i; - builder.tagged(id, namespace, |builder| { - builder.when_transition().assert_zero(actual * flag_sum - expected); - }); - } - - // Position 15: no left shift (handled by overflow constraints) - // next[15] * flag_sum = no_shift[15] * current[15] + right_shift[14] * current[14] - { - let flag_sum = op_flags.no_shift_at(15) + op_flags.right_shift_at(14); - let expected = op_flags.no_shift_at(15) * local.stack[15].clone().into() - + op_flags.right_shift_at(14) * local.stack[14].clone().into(); - let actual: AB::Expr = next.stack[15].clone().into(); - - builder.tagged(TAG_STACK_GENERAL_BASE + 15, STACK_GENERAL_NAMES[15], |builder| { - builder.when_transition().assert_zero(actual * flag_sum - expected); - }); - } -} diff --git a/air/src/constraints/stack/mod.rs b/air/src/constraints/stack/mod.rs index d4fde5aee5..a07da51ab0 100644 --- a/air/src/constraints/stack/mod.rs +++ b/air/src/constraints/stack/mod.rs @@ -4,15 +4,14 @@ //! and stack overflow constraints. pub mod bus; +pub mod columns; pub mod crypto; pub mod general; pub mod ops; pub mod overflow; pub mod stack_arith; -use miden_crypto::stark::air::LiftedAirBuilder; - -use crate::{MainTraceRow, constraints::op_flags::OpFlags}; +use crate::{MainCols, MidenAirBuilder, constraints::op_flags::OpFlags}; // ENTRY POINTS // ================================================================================================ @@ -20,11 +19,11 @@ use crate::{MainTraceRow, constraints::op_flags::OpFlags}; /// Enforces stack main-trace constraints for this group. pub fn enforce_main( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { general::enforce_main(builder, local, next, op_flags); overflow::enforce_main(builder, local, next, op_flags); diff --git a/air/src/constraints/stack/ops.rs b/air/src/constraints/stack/ops.rs new file mode 100644 index 0000000000..7db8ef8896 --- /dev/null +++ b/air/src/constraints/stack/ops.rs @@ -0,0 +1,266 @@ +//! Stack operation constraints. +//! +//! This module enforces ops that directly rewrite visible stack items: +//! PAD, DUP*, CLK, SWAP, MOVUP/MOVDN, SWAPW/SWAPDW, conditional swaps, and small +//! system/io stack ops (ASSERT, CALLER, SDEPTH). +//! +//! Stack shifting is enforced in the general stack constraints; here we only cover explicit +//! rewrites of stack positions for these op groups. + +use miden_crypto::stark::air::AirBuilder; + +use crate::{ + MainCols, MidenAirBuilder, + constraints::{op_flags::OpFlags, utils::BoolNot}, +}; + +// ENTRY POINT +// ================================================================================================ + +/// Enforces stack operation constraints for PAD/DUP/CLK/SWAP/MOV/SWAPW/CSWAP. +pub fn enforce_main( + builder: &mut AB, + local: &MainCols, + next: &MainCols, + op_flags: &OpFlags, +) where + AB: MidenAirBuilder, +{ + let s0 = local.stack.get(0); + let s1 = local.stack.get(1); + let s2 = local.stack.get(2); + let s3 = local.stack.get(3); + let s4 = local.stack.get(4); + let s5 = local.stack.get(5); + let s6 = local.stack.get(6); + let s7 = local.stack.get(7); + let s8 = local.stack.get(8); + let s9 = local.stack.get(9); + let s10 = local.stack.get(10); + let s11 = local.stack.get(11); + let s12 = local.stack.get(12); + let s13 = local.stack.get(13); + let s14 = local.stack.get(14); + let s15 = local.stack.get(15); + let stack_depth = local.stack.b0; + + let fn_hash_0 = local.system.fn_hash[0]; + let fn_hash_1 = local.system.fn_hash[1]; + let fn_hash_2 = local.system.fn_hash[2]; + let fn_hash_3 = local.system.fn_hash[3]; + + let s0_next = next.stack.get(0); + let s1_next = next.stack.get(1); + let s2_next = next.stack.get(2); + let s3_next = next.stack.get(3); + let s4_next = next.stack.get(4); + let s5_next = next.stack.get(5); + let s6_next = next.stack.get(6); + let s7_next = next.stack.get(7); + let s8_next = next.stack.get(8); + let s9_next = next.stack.get(9); + let s10_next = next.stack.get(10); + let s11_next = next.stack.get(11); + let s12_next = next.stack.get(12); + let s13_next = next.stack.get(13); + let s14_next = next.stack.get(14); + let s15_next = next.stack.get(15); + + let is_pad = op_flags.pad(); + let is_dup = op_flags.dup(); + let is_dup1 = op_flags.dup1(); + let is_dup2 = op_flags.dup2(); + let is_dup3 = op_flags.dup3(); + let is_dup4 = op_flags.dup4(); + let is_dup5 = op_flags.dup5(); + let is_dup6 = op_flags.dup6(); + let is_dup7 = op_flags.dup7(); + let is_dup9 = op_flags.dup9(); + let is_dup11 = op_flags.dup11(); + let is_dup13 = op_flags.dup13(); + let is_dup15 = op_flags.dup15(); + + let is_clk = op_flags.clk(); + + let is_swap = op_flags.swap(); + let is_movup2 = op_flags.movup2(); + let is_movup3 = op_flags.movup3(); + let is_movup4 = op_flags.movup4(); + let is_movup5 = op_flags.movup5(); + let is_movup6 = op_flags.movup6(); + let is_movup7 = op_flags.movup7(); + let is_movup8 = op_flags.movup8(); + + let is_movdn2 = op_flags.movdn2(); + let is_movdn3 = op_flags.movdn3(); + let is_movdn4 = op_flags.movdn4(); + let is_movdn5 = op_flags.movdn5(); + let is_movdn6 = op_flags.movdn6(); + let is_movdn7 = op_flags.movdn7(); + let is_movdn8 = op_flags.movdn8(); + + let is_swapw = op_flags.swapw(); + let is_swapw2 = op_flags.swapw2(); + let is_swapw3 = op_flags.swapw3(); + let is_swapdw = op_flags.swapdw(); + + let is_cswap = op_flags.cswap(); + let is_cswapw = op_flags.cswapw(); + let is_assert = op_flags.assert_op(); + let is_caller = op_flags.caller(); + let is_sdepth = op_flags.sdepth(); + + // All constraints are gated by op flags which vanish on the last row. + let builder = &mut builder.when_transition(); + + // PAD + builder.when(is_pad).assert_zero(s0_next); + + // DUP* + builder.when(is_dup).assert_eq(s0_next, s0); + builder.when(is_dup1).assert_eq(s0_next, s1); + builder.when(is_dup2).assert_eq(s0_next, s2); + builder.when(is_dup3).assert_eq(s0_next, s3); + builder.when(is_dup4).assert_eq(s0_next, s4); + builder.when(is_dup5).assert_eq(s0_next, s5); + builder.when(is_dup6).assert_eq(s0_next, s6); + builder.when(is_dup7).assert_eq(s0_next, s7); + builder.when(is_dup9).assert_eq(s0_next, s9); + builder.when(is_dup11).assert_eq(s0_next, s11); + builder.when(is_dup13).assert_eq(s0_next, s13); + builder.when(is_dup15).assert_eq(s0_next, s15); + + // CLK + let clk = local.system.clk; + builder.when(is_clk).assert_eq(s0_next, clk); + + // SWAP: exchange top two stack elements. + { + let builder = &mut builder.when(is_swap); + builder.assert_eq(s0_next, s1); + builder.assert_eq(s1_next, s0); + } + + // MOVUP + builder.when(is_movup2).assert_eq(s0_next, s2); + builder.when(is_movup3).assert_eq(s0_next, s3); + builder.when(is_movup4).assert_eq(s0_next, s4); + builder.when(is_movup5).assert_eq(s0_next, s5); + builder.when(is_movup6).assert_eq(s0_next, s6); + builder.when(is_movup7).assert_eq(s0_next, s7); + builder.when(is_movup8).assert_eq(s0_next, s8); + + // MOVDN + builder.when(is_movdn2).assert_eq(s2_next, s0); + builder.when(is_movdn3).assert_eq(s3_next, s0); + builder.when(is_movdn4).assert_eq(s4_next, s0); + builder.when(is_movdn5).assert_eq(s5_next, s0); + builder.when(is_movdn6).assert_eq(s6_next, s0); + builder.when(is_movdn7).assert_eq(s7_next, s0); + builder.when(is_movdn8).assert_eq(s8_next, s0); + + // SWAPW: exchange first and second words. + { + let builder = &mut builder.when(is_swapw); + builder.assert_eq(s0_next, s4); + builder.assert_eq(s1_next, s5); + builder.assert_eq(s2_next, s6); + builder.assert_eq(s3_next, s7); + builder.assert_eq(s4_next, s0); + builder.assert_eq(s5_next, s1); + builder.assert_eq(s6_next, s2); + builder.assert_eq(s7_next, s3); + } + + // SWAPW2: exchange first and third words. + { + let builder = &mut builder.when(is_swapw2); + builder.assert_eq(s0_next, s8); + builder.assert_eq(s1_next, s9); + builder.assert_eq(s2_next, s10); + builder.assert_eq(s3_next, s11); + builder.assert_eq(s8_next, s0); + builder.assert_eq(s9_next, s1); + builder.assert_eq(s10_next, s2); + builder.assert_eq(s11_next, s3); + } + + // SWAPW3: exchange first and fourth words. + { + let builder = &mut builder.when(is_swapw3); + builder.assert_eq(s0_next, s12); + builder.assert_eq(s1_next, s13); + builder.assert_eq(s2_next, s14); + builder.assert_eq(s3_next, s15); + builder.assert_eq(s12_next, s0); + builder.assert_eq(s13_next, s1); + builder.assert_eq(s14_next, s2); + builder.assert_eq(s15_next, s3); + } + + // SWAPDW: exchange first and second double-words. + { + let builder = &mut builder.when(is_swapdw); + builder.assert_eq(s0_next, s8); + builder.assert_eq(s1_next, s9); + builder.assert_eq(s2_next, s10); + builder.assert_eq(s3_next, s11); + builder.assert_eq(s4_next, s12); + builder.assert_eq(s5_next, s13); + builder.assert_eq(s6_next, s14); + builder.assert_eq(s7_next, s15); + builder.assert_eq(s8_next, s0); + builder.assert_eq(s9_next, s1); + builder.assert_eq(s10_next, s2); + builder.assert_eq(s11_next, s3); + builder.assert_eq(s12_next, s4); + builder.assert_eq(s13_next, s5); + builder.assert_eq(s14_next, s6); + builder.assert_eq(s15_next, s7); + } + + // CSWAP / CSWAPW: conditional swaps using s0 as the selector. + let cswap_c = s0; + let cswap_c_inv = cswap_c.into().not(); + + // Binary constraint for the cswap selector (must be 0 or 1). + builder.when(is_cswap.clone()).assert_bool(cswap_c); + + // Conditional swap equations for the top two stack items. + { + let builder = &mut builder.when(is_cswap); + builder.assert_eq(s0_next, cswap_c * s2.into() + cswap_c_inv.clone() * s1.into()); + builder.assert_eq(s1_next, cswap_c * s1.into() + cswap_c_inv.clone() * s2.into()); + } + + // Binary constraint for the cswapw selector (same selector as cswap). + builder.when(is_cswapw.clone()).assert_bool(cswap_c); + + // Conditional swap equations for the top two words. + { + let builder = &mut builder.when(is_cswapw); + builder.assert_eq(s0_next, cswap_c * s5.into() + cswap_c_inv.clone() * s1.into()); + builder.assert_eq(s1_next, cswap_c * s6.into() + cswap_c_inv.clone() * s2.into()); + builder.assert_eq(s2_next, cswap_c * s7.into() + cswap_c_inv.clone() * s3.into()); + builder.assert_eq(s3_next, cswap_c * s8.into() + cswap_c_inv.clone() * s4.into()); + builder.assert_eq(s4_next, cswap_c * s1.into() + cswap_c_inv.clone() * s5.into()); + builder.assert_eq(s5_next, cswap_c * s2.into() + cswap_c_inv.clone() * s6.into()); + builder.assert_eq(s6_next, cswap_c * s3.into() + cswap_c_inv.clone() * s7.into()); + builder.assert_eq(s7_next, cswap_c * s4.into() + cswap_c_inv * s8.into()); + } + + // ASSERT: top element must be 1 (shift handled by stack general). + builder.when(is_assert).assert_one(s0); + + // CALLER: load fn_hash into the top 4 stack elements. + { + let builder = &mut builder.when(is_caller); + builder.assert_eq(s0_next, fn_hash_0); + builder.assert_eq(s1_next, fn_hash_1); + builder.assert_eq(s2_next, fn_hash_2); + builder.assert_eq(s3_next, fn_hash_3); + } + + // SDEPTH: push current stack depth to the top. + builder.when(is_sdepth).assert_eq(s0_next, stack_depth); +} diff --git a/air/src/constraints/stack/ops/mod.rs b/air/src/constraints/stack/ops/mod.rs deleted file mode 100644 index c4564bd97a..0000000000 --- a/air/src/constraints/stack/ops/mod.rs +++ /dev/null @@ -1,478 +0,0 @@ -//! Stack operation constraints. -//! -//! This module enforces ops that directly rewrite visible stack items: -//! PAD, DUP*, CLK, SWAP, MOVUP/MOVDN, SWAPW/SWAPDW, conditional swaps, and small -//! system/io stack ops (ASSERT, CALLER, SDEPTH). -//! -//! Stack shifting is enforced in the general stack constraints; here we only cover explicit -//! rewrites of stack positions for these op groups. - -use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::LiftedAirBuilder; - -use crate::{ - MainTraceRow, - constraints::{ - op_flags::OpFlags, - tagging::{ - TagGroup, TaggingAirBuilderExt, ids::TAG_STACK_OPS_BASE, tagged_assert_zero, - tagged_assert_zero_integrity, tagged_assert_zeros, - }, - }, -}; - -// CONSTANTS -// ================================================================================================ - -/// Number of stack ops constraints. -pub const NUM_CONSTRAINTS: usize = 88; - -/// Base tag ID for stack ops constraints. -const STACK_OPS_BASE_ID: usize = TAG_STACK_OPS_BASE; - -/// Tag namespaces for stack ops constraints. -const STACK_OPS_NAMES: [&str; NUM_CONSTRAINTS] = [ - // PAD - "stack.ops.pad", - // DUP* - "stack.ops.dup", - "stack.ops.dup1", - "stack.ops.dup2", - "stack.ops.dup3", - "stack.ops.dup4", - "stack.ops.dup5", - "stack.ops.dup6", - "stack.ops.dup7", - "stack.ops.dup9", - "stack.ops.dup11", - "stack.ops.dup13", - "stack.ops.dup15", - // CLK - "stack.ops.clk", - // SWAP: exchange the top two stack items. - "stack.ops.swap", - "stack.ops.swap", - // MOVUP: move an item at depth N to the top. - "stack.ops.movup2", - "stack.ops.movup3", - "stack.ops.movup4", - "stack.ops.movup5", - "stack.ops.movup6", - "stack.ops.movup7", - "stack.ops.movup8", - // MOVDN: move the top item down to depth N. - "stack.ops.movdn2", - "stack.ops.movdn3", - "stack.ops.movdn4", - "stack.ops.movdn5", - "stack.ops.movdn6", - "stack.ops.movdn7", - "stack.ops.movdn8", - // SWAPW: swap word [0..3] with word [4..7]. - "stack.ops.swapw", - "stack.ops.swapw", - "stack.ops.swapw", - "stack.ops.swapw", - "stack.ops.swapw", - "stack.ops.swapw", - "stack.ops.swapw", - "stack.ops.swapw", - // SWAPW2: swap word [0..3] with word [8..11]. - "stack.ops.swapw2", - "stack.ops.swapw2", - "stack.ops.swapw2", - "stack.ops.swapw2", - "stack.ops.swapw2", - "stack.ops.swapw2", - "stack.ops.swapw2", - "stack.ops.swapw2", - // SWAPW3: swap word [0..3] with word [12..15]. - "stack.ops.swapw3", - "stack.ops.swapw3", - "stack.ops.swapw3", - "stack.ops.swapw3", - "stack.ops.swapw3", - "stack.ops.swapw3", - "stack.ops.swapw3", - "stack.ops.swapw3", - // SWAPDW: swap double-word [0..7] with [8..15]. - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - "stack.ops.swapdw", - // CSWAP - "stack.ops.cswap", - "stack.ops.cswap", - "stack.ops.cswap", - // CSWAPW - "stack.ops.cswapw", - "stack.ops.cswapw", - "stack.ops.cswapw", - "stack.ops.cswapw", - "stack.ops.cswapw", - "stack.ops.cswapw", - "stack.ops.cswapw", - "stack.ops.cswapw", - "stack.ops.cswapw", - // ASSERT - "stack.system.assert", - // CALLER - "stack.system.caller", - "stack.system.caller", - "stack.system.caller", - "stack.system.caller", - // SDEPTH - "stack.io.sdepth", -]; - -/// Tag metadata for this constraint group. -const STACK_OPS_TAGS: TagGroup = TagGroup { - base: STACK_OPS_BASE_ID, - names: &STACK_OPS_NAMES, -}; - -// ENTRY POINT -// ================================================================================================ - -/// Enforces stack operation constraints for PAD/DUP/CLK/SWAP/MOV/SWAPW/CSWAP. -pub fn enforce_main( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, - op_flags: &OpFlags, -) where - AB: LiftedAirBuilder, -{ - let s0: AB::Expr = local.stack[0].clone().into(); - let s1: AB::Expr = local.stack[1].clone().into(); - let s2: AB::Expr = local.stack[2].clone().into(); - let s3: AB::Expr = local.stack[3].clone().into(); - let s4: AB::Expr = local.stack[4].clone().into(); - let s5: AB::Expr = local.stack[5].clone().into(); - let s6: AB::Expr = local.stack[6].clone().into(); - let s7: AB::Expr = local.stack[7].clone().into(); - let s8: AB::Expr = local.stack[8].clone().into(); - let s9: AB::Expr = local.stack[9].clone().into(); - let s10: AB::Expr = local.stack[10].clone().into(); - let s11: AB::Expr = local.stack[11].clone().into(); - let s12: AB::Expr = local.stack[12].clone().into(); - let s13: AB::Expr = local.stack[13].clone().into(); - let s14: AB::Expr = local.stack[14].clone().into(); - let s15: AB::Expr = local.stack[15].clone().into(); - let stack_depth: AB::Expr = local.stack[16].clone().into(); - - let fn_hash_0: AB::Expr = local.fn_hash[0].clone().into(); - let fn_hash_1: AB::Expr = local.fn_hash[1].clone().into(); - let fn_hash_2: AB::Expr = local.fn_hash[2].clone().into(); - let fn_hash_3: AB::Expr = local.fn_hash[3].clone().into(); - - let s0_next: AB::Expr = next.stack[0].clone().into(); - let s1_next: AB::Expr = next.stack[1].clone().into(); - let s2_next: AB::Expr = next.stack[2].clone().into(); - let s3_next: AB::Expr = next.stack[3].clone().into(); - let s4_next: AB::Expr = next.stack[4].clone().into(); - let s5_next: AB::Expr = next.stack[5].clone().into(); - let s6_next: AB::Expr = next.stack[6].clone().into(); - let s7_next: AB::Expr = next.stack[7].clone().into(); - let s8_next: AB::Expr = next.stack[8].clone().into(); - let s9_next: AB::Expr = next.stack[9].clone().into(); - let s10_next: AB::Expr = next.stack[10].clone().into(); - let s11_next: AB::Expr = next.stack[11].clone().into(); - let s12_next: AB::Expr = next.stack[12].clone().into(); - let s13_next: AB::Expr = next.stack[13].clone().into(); - let s14_next: AB::Expr = next.stack[14].clone().into(); - let s15_next: AB::Expr = next.stack[15].clone().into(); - - let is_pad = op_flags.pad(); - let is_dup = op_flags.dup(); - let is_dup1 = op_flags.dup1(); - let is_dup2 = op_flags.dup2(); - let is_dup3 = op_flags.dup3(); - let is_dup4 = op_flags.dup4(); - let is_dup5 = op_flags.dup5(); - let is_dup6 = op_flags.dup6(); - let is_dup7 = op_flags.dup7(); - let is_dup9 = op_flags.dup9(); - let is_dup11 = op_flags.dup11(); - let is_dup13 = op_flags.dup13(); - let is_dup15 = op_flags.dup15(); - - let is_clk = op_flags.clk(); - - let is_swap = op_flags.swap(); - let is_movup2 = op_flags.movup2(); - let is_movup3 = op_flags.movup3(); - let is_movup4 = op_flags.movup4(); - let is_movup5 = op_flags.movup5(); - let is_movup6 = op_flags.movup6(); - let is_movup7 = op_flags.movup7(); - let is_movup8 = op_flags.movup8(); - - let is_movdn2 = op_flags.movdn2(); - let is_movdn3 = op_flags.movdn3(); - let is_movdn4 = op_flags.movdn4(); - let is_movdn5 = op_flags.movdn5(); - let is_movdn6 = op_flags.movdn6(); - let is_movdn7 = op_flags.movdn7(); - let is_movdn8 = op_flags.movdn8(); - - let is_swapw = op_flags.swapw(); - let is_swapw2 = op_flags.swapw2(); - let is_swapw3 = op_flags.swapw3(); - let is_swapdw = op_flags.swapdw(); - - let is_cswap = op_flags.cswap(); - let is_cswapw = op_flags.cswapw(); - let is_assert = op_flags.assert_op(); - let is_caller = op_flags.caller(); - let is_sdepth = op_flags.sdepth(); - - let mut idx = 0usize; - - // PAD - assert_zero(builder, &mut idx, is_pad * s0_next.clone()); - - // DUP* - assert_zero(builder, &mut idx, is_dup * (s0_next.clone() - s0.clone())); - assert_zero(builder, &mut idx, is_dup1 * (s0_next.clone() - s1.clone())); - assert_zero(builder, &mut idx, is_dup2 * (s0_next.clone() - s2.clone())); - assert_zero(builder, &mut idx, is_dup3 * (s0_next.clone() - s3.clone())); - assert_zero(builder, &mut idx, is_dup4 * (s0_next.clone() - s4.clone())); - assert_zero(builder, &mut idx, is_dup5 * (s0_next.clone() - s5.clone())); - assert_zero(builder, &mut idx, is_dup6 * (s0_next.clone() - s6.clone())); - assert_zero(builder, &mut idx, is_dup7 * (s0_next.clone() - s7.clone())); - assert_zero(builder, &mut idx, is_dup9 * (s0_next.clone() - s9.clone())); - assert_zero(builder, &mut idx, is_dup11 * (s0_next.clone() - s11.clone())); - assert_zero(builder, &mut idx, is_dup13 * (s0_next.clone() - s13.clone())); - assert_zero(builder, &mut idx, is_dup15 * (s0_next.clone() - s15.clone())); - - // CLK - let clk: AB::Expr = local.clk.clone().into(); - assert_zero(builder, &mut idx, is_clk * (s0_next.clone() - clk)); - - // SWAP - assert_zeros( - builder, - &mut idx, - "stack.ops.swap", - [ - is_swap.clone() * (s0_next.clone() - s1.clone()), - is_swap * (s1_next.clone() - s0.clone()), - ], - ); - - // MOVUP - assert_zero(builder, &mut idx, is_movup2 * (s0_next.clone() - s2.clone())); - assert_zero(builder, &mut idx, is_movup3 * (s0_next.clone() - s3.clone())); - assert_zero(builder, &mut idx, is_movup4 * (s0_next.clone() - s4.clone())); - assert_zero(builder, &mut idx, is_movup5 * (s0_next.clone() - s5.clone())); - assert_zero(builder, &mut idx, is_movup6 * (s0_next.clone() - s6.clone())); - assert_zero(builder, &mut idx, is_movup7 * (s0_next.clone() - s7.clone())); - assert_zero(builder, &mut idx, is_movup8 * (s0_next.clone() - s8.clone())); - - // MOVDN - assert_zero(builder, &mut idx, is_movdn2 * (s2_next.clone() - s0.clone())); - assert_zero(builder, &mut idx, is_movdn3 * (s3_next.clone() - s0.clone())); - assert_zero(builder, &mut idx, is_movdn4 * (s4_next.clone() - s0.clone())); - assert_zero(builder, &mut idx, is_movdn5 * (s5_next.clone() - s0.clone())); - assert_zero(builder, &mut idx, is_movdn6 * (s6_next.clone() - s0.clone())); - assert_zero(builder, &mut idx, is_movdn7 * (s7_next.clone() - s0.clone())); - assert_zero(builder, &mut idx, is_movdn8 * (s8_next.clone() - s0.clone())); - - // SWAPW - assert_zeros( - builder, - &mut idx, - "stack.ops.swapw", - [ - is_swapw.clone() * (s0_next.clone() - s4.clone()), - is_swapw.clone() * (s1_next.clone() - s5.clone()), - is_swapw.clone() * (s2_next.clone() - s6.clone()), - is_swapw.clone() * (s3_next.clone() - s7.clone()), - is_swapw.clone() * (s4_next.clone() - s0.clone()), - is_swapw.clone() * (s5_next.clone() - s1.clone()), - is_swapw.clone() * (s6_next.clone() - s2.clone()), - is_swapw * (s7_next.clone() - s3.clone()), - ], - ); - - // SWAPW2 - assert_zeros( - builder, - &mut idx, - "stack.ops.swapw2", - [ - is_swapw2.clone() * (s0_next.clone() - s8.clone()), - is_swapw2.clone() * (s1_next.clone() - s9.clone()), - is_swapw2.clone() * (s2_next.clone() - s10.clone()), - is_swapw2.clone() * (s3_next.clone() - s11.clone()), - is_swapw2.clone() * (s8_next.clone() - s0.clone()), - is_swapw2.clone() * (s9_next.clone() - s1.clone()), - is_swapw2.clone() * (s10_next.clone() - s2.clone()), - is_swapw2 * (s11_next.clone() - s3.clone()), - ], - ); - - // SWAPW3 - assert_zeros( - builder, - &mut idx, - "stack.ops.swapw3", - [ - is_swapw3.clone() * (s0_next.clone() - s12.clone()), - is_swapw3.clone() * (s1_next.clone() - s13.clone()), - is_swapw3.clone() * (s2_next.clone() - s14.clone()), - is_swapw3.clone() * (s3_next.clone() - s15.clone()), - is_swapw3.clone() * (s12_next.clone() - s0.clone()), - is_swapw3.clone() * (s13_next.clone() - s1.clone()), - is_swapw3.clone() * (s14_next.clone() - s2.clone()), - is_swapw3 * (s15_next.clone() - s3.clone()), - ], - ); - - // SWAPDW - assert_zeros( - builder, - &mut idx, - "stack.ops.swapdw", - [ - is_swapdw.clone() * (s0_next.clone() - s8.clone()), - is_swapdw.clone() * (s1_next.clone() - s9.clone()), - is_swapdw.clone() * (s2_next.clone() - s10.clone()), - is_swapdw.clone() * (s3_next.clone() - s11.clone()), - is_swapdw.clone() * (s4_next.clone() - s12.clone()), - is_swapdw.clone() * (s5_next.clone() - s13.clone()), - is_swapdw.clone() * (s6_next.clone() - s14.clone()), - is_swapdw.clone() * (s7_next.clone() - s15.clone()), - is_swapdw.clone() * (s8_next.clone() - s0.clone()), - is_swapdw.clone() * (s9_next.clone() - s1.clone()), - is_swapdw.clone() * (s10_next.clone() - s2.clone()), - is_swapdw.clone() * (s11_next.clone() - s3.clone()), - is_swapdw.clone() * (s12_next.clone() - s4.clone()), - is_swapdw.clone() * (s13_next.clone() - s5.clone()), - is_swapdw.clone() * (s14_next.clone() - s6.clone()), - is_swapdw * (s15_next.clone() - s7.clone()), - ], - ); - - // CSWAP / CSWAPW: conditional swaps using s0 as the selector. - let cswap_c = s0.clone(); - let cswap_c_inv = AB::Expr::ONE - cswap_c.clone(); - - // Binary constraint for the cswap selector (must be 0 or 1). - assert_zero_integrity( - builder, - &mut idx, - is_cswap.clone() * (cswap_c.clone() * (cswap_c.clone() - AB::Expr::ONE)), - ); - - // Conditional swap equations for the top two stack items. - assert_zeros( - builder, - &mut idx, - "stack.ops.cswap", - [ - is_cswap.clone() - * (s0_next.clone() - - (cswap_c.clone() * s2.clone() + cswap_c_inv.clone() * s1.clone())), - is_cswap - * (s1_next.clone() - - (cswap_c.clone() * s1.clone() + cswap_c_inv.clone() * s2.clone())), - ], - ); - - // Binary constraint for the cswapw selector (same selector as cswap). - assert_zero_integrity( - builder, - &mut idx, - is_cswapw.clone() * (cswap_c.clone() * (cswap_c.clone() - AB::Expr::ONE)), - ); - - // Conditional swap equations for the top two words. - assert_zeros( - builder, - &mut idx, - "stack.ops.cswapw", - [ - is_cswapw.clone() - * (s0_next.clone() - - (cswap_c.clone() * s5.clone() + cswap_c_inv.clone() * s1.clone())), - is_cswapw.clone() - * (s1_next.clone() - - (cswap_c.clone() * s6.clone() + cswap_c_inv.clone() * s2.clone())), - is_cswapw.clone() - * (s2_next.clone() - - (cswap_c.clone() * s7.clone() + cswap_c_inv.clone() * s3.clone())), - is_cswapw.clone() - * (s3_next.clone() - - (cswap_c.clone() * s8.clone() + cswap_c_inv.clone() * s4.clone())), - is_cswapw.clone() - * (s4_next.clone() - - (cswap_c.clone() * s1.clone() + cswap_c_inv.clone() * s5.clone())), - is_cswapw.clone() - * (s5_next.clone() - - (cswap_c.clone() * s2.clone() + cswap_c_inv.clone() * s6.clone())), - is_cswapw.clone() - * (s6_next.clone() - - (cswap_c.clone() * s3.clone() + cswap_c_inv.clone() * s7.clone())), - is_cswapw - * (s7_next.clone() - - (cswap_c.clone() * s4.clone() + cswap_c_inv.clone() * s8.clone())), - ], - ); - - // ASSERT: top element must be 1 (shift handled by stack general). - assert_zero_integrity(builder, &mut idx, is_assert * (s0 - AB::Expr::ONE)); - - // CALLER: load fn_hash into the top 4 stack elements. - assert_zeros( - builder, - &mut idx, - "stack.system.caller", - [ - is_caller.clone() * (s0_next.clone() - fn_hash_0), - is_caller.clone() * (s1_next.clone() - fn_hash_1), - is_caller.clone() * (s2_next.clone() - fn_hash_2), - is_caller * (s3_next.clone() - fn_hash_3), - ], - ); - - // SDEPTH: push current stack depth to the top. - assert_zero(builder, &mut idx, is_sdepth * (s0_next - stack_depth)); -} - -// CONSTRAINT HELPERS -// ================================================================================================ - -fn assert_zero_integrity( - builder: &mut AB, - idx: &mut usize, - expr: AB::Expr, -) { - tagged_assert_zero_integrity(builder, &STACK_OPS_TAGS, idx, expr); -} - -fn assert_zero(builder: &mut AB, idx: &mut usize, expr: AB::Expr) { - tagged_assert_zero(builder, &STACK_OPS_TAGS, idx, expr); -} - -fn assert_zeros( - builder: &mut AB, - idx: &mut usize, - namespace: &'static str, - exprs: [AB::Expr; N], -) { - tagged_assert_zeros(builder, &STACK_OPS_TAGS, idx, namespace, exprs); -} diff --git a/air/src/constraints/stack/overflow/mod.rs b/air/src/constraints/stack/overflow.rs similarity index 53% rename from air/src/constraints/stack/overflow/mod.rs rename to air/src/constraints/stack/overflow.rs index b523fd28cb..b40f2db638 100644 --- a/air/src/constraints/stack/overflow/mod.rs +++ b/air/src/constraints/stack/overflow.rs @@ -27,41 +27,13 @@ //! - On left shift with depth = 16: stack[15]' = 0 (no item to restore) use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::{AirBuilder, LiftedAirBuilder}; +use miden_crypto::stark::air::AirBuilder; use crate::{ - MainTraceRow, - constraints::{ - op_flags::OpFlags, - tagging::{ - TaggingAirBuilderExt, - ids::{TAG_STACK_OVERFLOW_BASE, TAG_STACK_OVERFLOW_COUNT}, - }, - }, - trace::{ - decoder::{IS_CALL_FLAG_COL_IDX, IS_SYSCALL_FLAG_COL_IDX}, - stack::{B0_COL_IDX, B1_COL_IDX}, - }, + MainCols, MidenAirBuilder, + constraints::{constants::*, op_flags::OpFlags, utils::BoolNot}, }; -// CONSTANTS -// ================================================================================================ - -/// Base tag ID for stack overflow constraints. -const STACK_OVERFLOW_BASE_ID: usize = TAG_STACK_OVERFLOW_BASE; - -/// Tag namespaces for stack overflow constraints (boundary + transition). -const STACK_OVERFLOW_NAMES: [&str; TAG_STACK_OVERFLOW_COUNT] = [ - "stack.overflow.depth.first_row", - "stack.overflow.depth.last_row", - "stack.overflow.addr.first_row", - "stack.overflow.addr.last_row", - "stack.overflow.depth.transition", - "stack.overflow.flag.transition", - "stack.overflow.addr.transition", - "stack.overflow.zero_insert.transition", -]; - // ENTRY POINTS // ================================================================================================ @@ -74,39 +46,28 @@ const STACK_OVERFLOW_NAMES: [&str; TAG_STACK_OVERFLOW_COUNT] = [ /// 4. Last stack item is zeroed on left shift when depth = 16 pub fn enforce_main( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { // Boundary constraints: stack depth and overflow pointer must start/end clean. - let sixteen: AB::Expr = AB::Expr::from_u16(16); - let zero: AB::Expr = AB::Expr::ZERO; - builder.tagged(STACK_OVERFLOW_BASE_ID, STACK_OVERFLOW_NAMES[0], |builder| { - builder - .when_first_row() - .assert_zero(local.stack[B0_COL_IDX].clone().into() - sixteen.clone()); - }); - builder.tagged(STACK_OVERFLOW_BASE_ID + 1, STACK_OVERFLOW_NAMES[1], |builder| { - builder - .when_last_row() - .assert_zero(local.stack[B0_COL_IDX].clone().into() - sixteen); - }); - builder.tagged(STACK_OVERFLOW_BASE_ID + 2, STACK_OVERFLOW_NAMES[2], |builder| { - builder - .when_first_row() - .assert_zero(local.stack[B1_COL_IDX].clone().into() - zero.clone()); - }); - builder.tagged(STACK_OVERFLOW_BASE_ID + 3, STACK_OVERFLOW_NAMES[3], |builder| { - builder - .when_last_row() - .assert_zero(local.stack[B1_COL_IDX].clone().into() - zero); - }); + builder.when_first_row().assert_eq(local.stack.b0, F_16); + builder.when_last_row().assert_eq(local.stack.b0, F_16); + builder.when_first_row().assert_zero(local.stack.b1); + builder.when_last_row().assert_zero(local.stack.b1); // Transition constraints: depth bookkeeping, overflow flag, and pointer updates. enforce_stack_depth_constraints(builder, local, next, op_flags); - enforce_overflow_flag_constraints(builder, local, op_flags); + + // Overflow flag: (1 - overflow) * (depth - 16) = 0 + // When depth > 16, overflow must be 1; when depth = 16, satisfied for any h0. + { + let depth = local.stack.b0; + builder.when(op_flags.overflow().not()).assert_eq(depth, F_16); + } + enforce_overflow_index_constraints(builder, local, next, op_flags); } @@ -124,21 +85,21 @@ pub fn enforce_main( /// The END operation exiting a CALL/SYSCALL block is handled separately via multiset constraints. fn enforce_stack_depth_constraints( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { - let depth: AB::Expr = local.stack[B0_COL_IDX].clone().into(); - let depth_next: AB::Expr = next.stack[B0_COL_IDX].clone().into(); + let depth = local.stack.b0; + let depth_next = next.stack.b0; // Flag for CALL, DYNCALL, or SYSCALL operations let call_or_dyncall_or_syscall = op_flags.call() + op_flags.dyncall() + op_flags.syscall(); // Flag for END operation that ends a CALL/DYNCALL or SYSCALL block - let is_call_or_dyncall_end: AB::Expr = local.decoder[IS_CALL_FLAG_COL_IDX].clone().into(); - let is_syscall_end: AB::Expr = local.decoder[IS_SYSCALL_FLAG_COL_IDX].clone().into(); + let is_call_or_dyncall_end = local.decoder.hasher_state[6]; + let is_syscall_end = local.decoder.hasher_state[7]; let call_or_dyncall_or_syscall_end = op_flags.end() * (is_call_or_dyncall_end + is_syscall_end); // Invariants relied on here: @@ -164,7 +125,7 @@ fn enforce_stack_depth_constraints( // - We still need to suppress the raw (b0' - b0) term on END-of-call rows, hence the mask. let normal_mask = AB::Expr::ONE - call_or_dyncall_or_syscall.clone() - call_or_dyncall_or_syscall_end; - let depth_delta_part = (depth_next.clone() - depth.clone()) * normal_mask; + let depth_delta_part = (depth_next.into() - depth.into()) * normal_mask; // Left shift with non-empty overflow: when f_shl=1 and f_ov=1, depth must decrement by 1. // This contributes +1 to the LHS, enforcing b0' = b0 - 1. @@ -175,41 +136,12 @@ fn enforce_stack_depth_constraints( let right_shift_part = op_flags.right_shift(); // CALL/SYSCALL/DYNCALL: depth resets to 16 when entering a new context. - let call_part = call_or_dyncall_or_syscall * (depth_next - AB::Expr::from_u16(16)); + let call_part = call_or_dyncall_or_syscall * (depth_next.into() - F_16); // Combined constraint: normal depth update + shift effects + call reset = 0. - builder.tagged(STACK_OVERFLOW_BASE_ID + 4, STACK_OVERFLOW_NAMES[4], |builder| { - builder - .when_transition() - .assert_zero(depth_delta_part + left_shift_part - right_shift_part + call_part); - }); -} - -/// Enforces overflow flag constraints. -/// -/// The overflow flag h0 must satisfy: -/// - (1 - overflow) * (b0 - 16) = 0 -/// -/// This ensures: -/// - When b0 = 16 (no overflow): the constraint is satisfied for any h0 -/// - When b0 > 16 (overflow): h0 must be set such that overflow = (b0 - 16) * h0 = 1 -fn enforce_overflow_flag_constraints( - builder: &mut AB, - local: &MainTraceRow, - op_flags: &OpFlags, -) where - AB: LiftedAirBuilder, -{ - let depth: AB::Expr = local.stack[B0_COL_IDX].clone().into(); - - // (1 - overflow) * (depth - 16) = 0 - // When depth > 16, overflow must be 1 (meaning h0 = 1/(depth - 16)) - // When depth = 16, this constraint is satisfied regardless of overflow - let constraint = (AB::Expr::ONE - op_flags.overflow()) * (depth - AB::Expr::from_u16(16)); - - builder.tagged(STACK_OVERFLOW_BASE_ID + 5, STACK_OVERFLOW_NAMES[5], |builder| { - builder.assert_zero(constraint); - }); + builder + .when_transition() + .assert_zero(depth_delta_part + left_shift_part - right_shift_part + call_part); } /// Enforces overflow bookkeeping index constraints. @@ -219,26 +151,26 @@ fn enforce_overflow_flag_constraints( /// 2. On left shift with depth = 16: stack[15]' = 0 (no item to restore from overflow) fn enforce_overflow_index_constraints( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { - let overflow_addr_next: AB::Expr = next.stack[B1_COL_IDX].clone().into(); - let clk: AB::Expr = local.clk.clone().into(); - let last_stack_item_next: AB::Expr = next.stack[15].clone().into(); + let overflow_addr_next = next.stack.b1; + let clk = local.system.clk; + let last_stack_item_next = next.stack.get(15); // On right shift, the overflow address should be set to current clk - let right_shift_constraint = (overflow_addr_next - clk) * op_flags.right_shift(); - builder.tagged(STACK_OVERFLOW_BASE_ID + 6, STACK_OVERFLOW_NAMES[6], |builder| { - builder.when_transition().assert_zero(right_shift_constraint); - }); + builder + .when_transition() + .when(op_flags.right_shift()) + .assert_eq(overflow_addr_next, clk); // On left shift when depth = 16 (no overflow), last stack item should be zero - let left_shift_constraint = - (AB::Expr::ONE - op_flags.overflow()) * op_flags.left_shift() * last_stack_item_next; - builder.tagged(STACK_OVERFLOW_BASE_ID + 7, STACK_OVERFLOW_NAMES[7], |builder| { - builder.when_transition().assert_zero(left_shift_constraint); - }); + builder + .when_transition() + .when(op_flags.overflow().not()) + .when(op_flags.left_shift()) + .assert_zero(last_stack_item_next); } diff --git a/air/src/constraints/stack/stack_arith/mod.rs b/air/src/constraints/stack/stack_arith/mod.rs index daef674461..21e4c0a045 100644 --- a/air/src/constraints/stack/stack_arith/mod.rs +++ b/air/src/constraints/stack/stack_arith/mod.rs @@ -4,94 +4,15 @@ //! (ADD/NEG/MUL/INV/INCR/NOT/AND/OR/EQ/EQZ/EXPACC/EXT2MUL) and u32 arithmetic ops //! (U32SPLIT/U32ADD/U32ADD3/U32SUB/U32MUL/U32MADD/U32DIV/U32ASSERT2). +#[cfg(test)] +mod tests; + use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::LiftedAirBuilder; +use miden_crypto::stark::air::AirBuilder; use crate::{ - MainTraceRow, - constraints::{ - op_flags::OpFlags, - tagging::{ - TagGroup, TaggingAirBuilderExt, ids::TAG_STACK_ARITH_BASE, tagged_assert_zero, - tagged_assert_zero_integrity, - }, - }, - trace::decoder::USER_OP_HELPERS_OFFSET, -}; - -// CONSTANTS -// ================================================================================================ - -/// Number of stack arith/u32 constraints. -#[allow(dead_code)] -pub const NUM_CONSTRAINTS: usize = 42; - -/// Base tag ID for stack arith/u32 constraints. -const STACK_ARITH_BASE_ID: usize = TAG_STACK_ARITH_BASE; - -/// Tag namespaces for stack arith/u32 constraints. -const STACK_ARITH_NAMES: [&str; NUM_CONSTRAINTS] = [ - // ADD/NEG/MUL/INV/INCR - "stack.arith.add", - "stack.arith.neg", - "stack.arith.mul", - "stack.arith.inv", - "stack.arith.incr", - // NOT - "stack.arith.not", - "stack.arith.not", - // AND - "stack.arith.and", - "stack.arith.and", - "stack.arith.and", - // OR - "stack.arith.or", - "stack.arith.or", - "stack.arith.or", - // EQ - "stack.arith.eq", - "stack.arith.eq", - // EQZ - "stack.arith.eqz", - "stack.arith.eqz", - // EXPACC - "stack.arith.expacc", - "stack.arith.expacc", - "stack.arith.expacc", - "stack.arith.expacc", - "stack.arith.expacc", - // EXT2MUL - "stack.arith.ext2mul", - "stack.arith.ext2mul", - "stack.arith.ext2mul", - "stack.arith.ext2mul", - // U32 shared/output - "stack.arith.u32.shared", - "stack.arith.u32.output", - "stack.arith.u32.output", - // U32SPLIT/U32ADD/U32ADD3 - "stack.arith.u32.split", - "stack.arith.u32.add", - "stack.arith.u32.add3", - // U32SUB - "stack.arith.u32.sub", - "stack.arith.u32.sub", - "stack.arith.u32.sub", - // U32MUL/U32MADD - "stack.arith.u32.mul", - "stack.arith.u32.madd", - // U32DIV - "stack.arith.u32.div", - "stack.arith.u32.div", - "stack.arith.u32.div", - // U32ASSERT2 - "stack.arith.u32.assert2", - "stack.arith.u32.assert2", -]; - -const STACK_ARITH_TAGS: TagGroup = TagGroup { - base: STACK_ARITH_BASE_ID, - names: &STACK_ARITH_NAMES, + MainCols, MidenAirBuilder, + constraints::{constants::*, op_flags::OpFlags}, }; // ENTRY POINTS @@ -100,35 +21,32 @@ const STACK_ARITH_TAGS: TagGroup = TagGroup { /// Enforces stack arith/u32 constraints. pub fn enforce_main( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, op_flags: &OpFlags, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { - let mut idx = 0usize; + let s0: AB::Expr = local.stack.get(0).into(); + let s1: AB::Expr = local.stack.get(1).into(); + let s2: AB::Expr = local.stack.get(2).into(); + let s3: AB::Expr = local.stack.get(3).into(); - let s0: AB::Expr = local.stack[0].clone().into(); - let s1: AB::Expr = local.stack[1].clone().into(); - let s2: AB::Expr = local.stack[2].clone().into(); - let s3: AB::Expr = local.stack[3].clone().into(); + let s0_next: AB::Expr = next.stack.get(0).into(); + let s1_next: AB::Expr = next.stack.get(1).into(); + let s2_next: AB::Expr = next.stack.get(2).into(); + let s3_next: AB::Expr = next.stack.get(3).into(); - let s0_next: AB::Expr = next.stack[0].clone().into(); - let s1_next: AB::Expr = next.stack[1].clone().into(); - let s2_next: AB::Expr = next.stack[2].clone().into(); - let s3_next: AB::Expr = next.stack[3].clone().into(); - - // Decoder helper columns: h0..h5 are stored starting at USER_OP_HELPERS_OFFSET. - // These helpers are op-specific and are validated by the constraints below. + // Decoder helper columns: hasher_state[2..8] are user-op helpers. // - h0 is used as an inverse witness (EQ/EQZ) or exp_val (EXPACC). // - h1..h4 hold u32 limbs / range-check witnesses for u32 ops. // - h5 is currently unused in this module. - let base = USER_OP_HELPERS_OFFSET; - let uop_h0: AB::Expr = local.decoder[base].clone().into(); - let uop_h1: AB::Expr = local.decoder[base + 1].clone().into(); - let uop_h2: AB::Expr = local.decoder[base + 2].clone().into(); - let uop_h3: AB::Expr = local.decoder[base + 3].clone().into(); - let uop_h4: AB::Expr = local.decoder[base + 4].clone().into(); + let [uop_h0, uop_h1, uop_h2, uop_h3, uop_h4, _] = local.decoder.user_op_helpers(); + let uop_h0: AB::Expr = uop_h0.into(); + let uop_h1: AB::Expr = uop_h1.into(); + let uop_h2: AB::Expr = uop_h2.into(); + let uop_h3: AB::Expr = uop_h3.into(); + let uop_h4: AB::Expr = uop_h4.into(); // Field ops. let is_add = op_flags.add(); @@ -157,63 +75,74 @@ pub fn enforce_main( // ------------------------------------------------------------------------- // Field ops // ------------------------------------------------------------------------- - assert_zero(builder, &mut idx, is_add * (s0_next.clone() - (s0.clone() + s1.clone()))); - assert_zero(builder, &mut idx, is_neg * (s0_next.clone() + s0.clone())); - assert_zero(builder, &mut idx, is_mul * (s0_next.clone() - s0.clone() * s1.clone())); - assert_zero(builder, &mut idx, is_inv * (s0_next.clone() * s0.clone() - AB::Expr::ONE)); - assert_zero(builder, &mut idx, is_incr * (s0_next.clone() - s0.clone() - AB::Expr::ONE)); - - assert_zero_integrity( - builder, - &mut idx, - is_not.clone() * (s0.clone() * (s0.clone() - AB::Expr::ONE)), - ); - assert_zero(builder, &mut idx, is_not * (s0.clone() + s0_next.clone() - AB::Expr::ONE)); - assert_zero_integrity( - builder, - &mut idx, - is_and.clone() * (s0.clone() * (s0.clone() - AB::Expr::ONE)), - ); - assert_zero_integrity( - builder, - &mut idx, - is_and.clone() * (s1.clone() * (s1.clone() - AB::Expr::ONE)), - ); - assert_zero(builder, &mut idx, is_and * (s0_next.clone() - s0.clone() * s1.clone())); - - assert_zero_integrity( - builder, - &mut idx, - is_or.clone() * (s0.clone() * (s0.clone() - AB::Expr::ONE)), - ); - assert_zero_integrity( - builder, - &mut idx, - is_or.clone() * (s1.clone() * (s1.clone() - AB::Expr::ONE)), - ); - assert_zero( - builder, - &mut idx, - is_or * (s0_next.clone() - (s0.clone() + s1.clone() - s0.clone() * s1.clone())), - ); + // ADD: s0' = s0 + s1 + builder + .when_transition() + .when(is_add) + .assert_eq(s0_next.clone(), s0.clone() + s1.clone()); + + // NEG: s0' = -s0 + builder.when_transition().when(is_neg).assert_zero(s0_next.clone() + s0.clone()); + + // MUL: s0' = s0 * s1 + builder + .when_transition() + .when(is_mul) + .assert_eq(s0_next.clone(), s0.clone() * s1.clone()); + + // INV: s0' * s0 = 1 + builder.when_transition().when(is_inv).assert_one(s0_next.clone() * s0.clone()); + + // INCR: s0' = s0 + 1 + builder + .when_transition() + .when(is_incr) + .assert_eq(s0_next.clone(), s0.clone() + F_1); + + // NOT: s0 is boolean, s0 + s0' = 1. + { + let builder = &mut builder.when(is_not); + builder.assert_bool(s0.clone()); + builder.when_transition().assert_eq(s0.clone() + s0_next.clone(), F_1); + } + + // AND: s0, s1 are boolean, s0' = s0 * s1. + { + let builder = &mut builder.when(is_and); + builder.assert_bool(s0.clone()); + builder.assert_bool(s1.clone()); + builder.when_transition().assert_eq(s0_next.clone(), s0.clone() * s1.clone()); + } + + // OR: s0, s1 are boolean, s0' = s0 + s1 - s0 * s1. + { + let builder = &mut builder.when(is_or); + builder.assert_bool(s0.clone()); + builder.assert_bool(s1.clone()); + builder + .when_transition() + .assert_eq(s0_next.clone(), s0.clone() + s1.clone() - s0.clone() * s1.clone()); + } // EQ: if s0 != s1, h0 acts as 1/(s0 - s1) and forces s0' = 0; if equal, s0' = 1. - let eq_diff = s0.clone() - s1.clone(); - assert_zero(builder, &mut idx, is_eq.clone() * (eq_diff.clone() * s0_next.clone())); - assert_zero( - builder, - &mut idx, - is_eq * (s0_next.clone() - (AB::Expr::ONE - eq_diff * uop_h0.clone())), - ); + // eq_diff * s0_next and the inverse witness constraint are intrinsic (conditional inverse). + let eq_diff: AB::Expr = s0.clone() - s1.clone(); + { + let gate = builder.is_transition() * is_eq; + let builder = &mut builder.when(gate); + builder.assert_zero(eq_diff.clone() * s0_next.clone()); + builder.assert_eq(s0_next.clone(), AB::Expr::ONE - eq_diff * uop_h0.clone()); + } // EQZ: if s0 != 0, h0 acts as 1/s0 and forces s0' = 0; if zero, s0' = 1. - assert_zero(builder, &mut idx, is_eqz.clone() * (s0.clone() * s0_next.clone())); - assert_zero( - builder, - &mut idx, - is_eqz * (s0_next.clone() - (AB::Expr::ONE - s0.clone() * uop_h0.clone())), - ); + // s0 * s0_next and the inverse witness constraint are intrinsic (conditional inverse). + { + let gate = builder.is_transition() * is_eqz; + let builder = &mut builder.when(gate); + builder.assert_zero(s0.clone() * s0_next.clone()); + builder.assert_eq(s0_next.clone(), AB::Expr::ONE - s0.clone() * uop_h0.clone()); + } // EXPACC: exp_next = exp^2, exp_val = 1 + (exp - 1) * exp_bit, acc_next = acc * exp_val. let exp = s1.clone(); @@ -224,23 +153,19 @@ pub fn enforce_main( let exp_b = s3.clone(); let exp_b_next = s3_next.clone(); let exp_val = uop_h0.clone(); - let two: AB::Expr = AB::Expr::from_u16(2); - - assert_zero(builder, &mut idx, is_expacc.clone() * (exp_next - exp.clone() * exp.clone())); - assert_zero( - builder, - &mut idx, - is_expacc.clone() - * (exp_val.clone() - AB::Expr::ONE - (exp - AB::Expr::ONE) * exp_bit.clone()), - ); - assert_zero(builder, &mut idx, is_expacc.clone() * (acc_next - acc * exp_val)); - assert_zero( - builder, - &mut idx, - is_expacc.clone() * (exp_b - exp_b_next * two - exp_bit.clone()), - ); - assert_zero(builder, &mut idx, is_expacc * (exp_bit.clone() * (exp_bit - AB::Expr::ONE))); + // EXPACC transition: squaring, exp_val witness, accumulation, bit decomposition, and boolean + // check. + { + let gate = builder.is_transition() * is_expacc; + let builder = &mut builder.when(gate); + builder.assert_eq(exp_next, exp.clone() * exp.clone()); + builder.assert_eq(exp_val.clone(), (exp - F_1) * exp_bit.clone() + F_1); + builder.assert_eq(acc_next, acc * exp_val); + builder.assert_eq(exp_b, exp_b_next * F_2 + exp_bit.clone()); + builder.assert_bool(exp_bit); + } + // EXT2MUL let ext_b0 = s0.clone(); let ext_b1 = s1.clone(); let ext_a0 = s2.clone(); @@ -248,126 +173,82 @@ pub fn enforce_main( let ext_d0 = s0_next.clone(); let ext_d1 = s1_next.clone(); let ext_c0 = s2_next.clone(); - let ext_c1 = s3_next.clone(); + let ext_c1 = s3_next; let ext_a0_b0 = ext_a0.clone() * ext_b0.clone(); let ext_a1_b1 = ext_a1.clone() * ext_b1.clone(); - let seven: AB::Expr = AB::Expr::from_u16(7); - assert_zero(builder, &mut idx, is_ext2mul.clone() * (ext_d0 - ext_b0.clone())); - assert_zero(builder, &mut idx, is_ext2mul.clone() * (ext_d1 - ext_b1.clone())); - assert_zero( - builder, - &mut idx, - is_ext2mul.clone() * (ext_c0 - (ext_a0_b0.clone() + seven.clone() * ext_a1_b1.clone())), - ); - assert_zero( - builder, - &mut idx, - is_ext2mul * (ext_c1 - ((ext_a0 + ext_a1) * (ext_b0 + ext_b1) - ext_a0_b0 - ext_a1_b1)), - ); + // EXT2MUL transition: quadratic extension multiplication producing (c0, c1) from (a, b). + { + let gate = builder.is_transition() * is_ext2mul; + let builder = &mut builder.when(gate); + builder.assert_eq(ext_d0, ext_b0.clone()); + builder.assert_eq(ext_d1, ext_b1.clone()); + builder.assert_eq(ext_c0, ext_a0_b0.clone() + ext_a1_b1.clone() * F_7); + builder.assert_eq(ext_c1, (ext_a0 + ext_a1) * (ext_b0 + ext_b1) - ext_a0_b0 - ext_a1_b1); + } // ------------------------------------------------------------------------- // U32 ops // ------------------------------------------------------------------------- - let two_pow_16: AB::Expr = AB::Expr::from_u64(1u64 << 16); - let two_pow_32: AB::Expr = AB::Expr::from_u64(1u64 << 32); - let two_pow_48: AB::Expr = AB::Expr::from_u64(1u64 << 48); - let two_pow_32_minus_one: AB::Expr = AB::Expr::from_u64((1u64 << 32) - 1); - // U32 limbs: v_lo = h1*2^16 + h0, v_hi = h3*2^16 + h2. - let u32_v_lo = uop_h1.clone() * two_pow_16.clone() + uop_h0.clone(); - let u32_v_hi = uop_h3.clone() * two_pow_16 + uop_h2.clone(); - let u32_v48 = uop_h2.clone() * two_pow_32.clone() + u32_v_lo.clone(); - let u32_v64 = uop_h3.clone() * two_pow_48 + u32_v48.clone(); + let u32_v_lo = uop_h1 * TWO_POW_16 + uop_h0.clone(); + let u32_v_hi = uop_h3.clone() * TWO_POW_16 + uop_h2.clone(); + let u32_v48 = uop_h2 * TWO_POW_32 + u32_v_lo.clone(); + let u32_v64 = uop_h3 * TWO_POW_48 + u32_v48.clone(); // Element validity check for u32split/u32mul/u32madd. + // u32_v_hi_comp * u32_v_lo is intrinsic (symmetry test: setting either factor to 0 hides a + // case). let u32_split_mul_madd = is_u32split.clone() + is_u32mul.clone() + is_u32madd.clone(); - let u32_v_hi_comp = AB::Expr::ONE - uop_h4.clone() * (two_pow_32_minus_one - u32_v_hi.clone()); - assert_zero_integrity( - builder, - &mut idx, - u32_split_mul_madd * (u32_v_hi_comp * u32_v_lo.clone()), - ); + let u32_v_hi_comp = + AB::Expr::ONE - uop_h4 * (AB::Expr::from(TWO_POW_32_MINUS_1) - u32_v_hi.clone()); + builder.when(u32_split_mul_madd).assert_zero(u32_v_hi_comp * u32_v_lo.clone()); + // U32 ops with two outputs: s0' = v_lo, s1' = v_hi. let u32_two_outputs = is_u32split.clone() + is_u32add.clone() + is_u32add3.clone() + is_u32mul.clone() + is_u32madd.clone(); - assert_zero( - builder, - &mut idx, - u32_two_outputs.clone() * (s0_next.clone() - u32_v_lo.clone()), - ); - assert_zero(builder, &mut idx, u32_two_outputs * (s1_next.clone() - u32_v_hi.clone())); - - assert_zero_integrity(builder, &mut idx, is_u32split * (s0.clone() - u32_v64.clone())); - assert_zero_integrity( - builder, - &mut idx, - is_u32add * (s0.clone() + s1.clone() - u32_v48.clone()), - ); - assert_zero_integrity( - builder, - &mut idx, - is_u32add3 * (s0.clone() + s1.clone() + s2.clone() - u32_v48.clone()), - ); - - assert_zero( - builder, - &mut idx, - is_u32sub.clone() - * (s1.clone() - (s0.clone() + s1_next.clone() - s0_next.clone() * two_pow_32.clone())), - ); - assert_zero( - builder, - &mut idx, - is_u32sub.clone() * (s0_next.clone() * (s0_next.clone() - AB::Expr::ONE)), - ); - assert_zero(builder, &mut idx, is_u32sub * (s1_next.clone() - u32_v_lo.clone())); - - assert_zero_integrity( - builder, - &mut idx, - is_u32mul * (s0.clone() * s1.clone() - u32_v64.clone()), - ); - assert_zero_integrity( - builder, - &mut idx, - is_u32madd * (s0.clone() * s1.clone() + s2 - u32_v64.clone()), - ); - - assert_zero( - builder, - &mut idx, - is_u32div.clone() * (s1.clone() - (s0.clone() * s1_next.clone() + s0_next.clone())), - ); - assert_zero( - builder, - &mut idx, - is_u32div.clone() * (s1.clone() - s1_next.clone() - u32_v_lo.clone()), - ); - assert_zero( - builder, - &mut idx, - is_u32div * (s0.clone() - s0_next.clone() - (u32_v_hi.clone() + AB::Expr::ONE)), - ); - - assert_zero(builder, &mut idx, is_u32assert2.clone() * (s0_next - u32_v_hi.clone())); - assert_zero(builder, &mut idx, is_u32assert2 * (s1_next - u32_v_lo)); -} - -// CONSTRAINT HELPERS -// ================================================================================================ - -fn assert_zero(builder: &mut AB, idx: &mut usize, expr: AB::Expr) { - tagged_assert_zero(builder, &STACK_ARITH_TAGS, idx, expr); -} - -fn assert_zero_integrity( - builder: &mut AB, - idx: &mut usize, - expr: AB::Expr, -) { - tagged_assert_zero_integrity(builder, &STACK_ARITH_TAGS, idx, expr); + { + let gate = builder.is_transition() * u32_two_outputs; + let builder = &mut builder.when(gate); + builder.assert_eq(s0_next.clone(), u32_v_lo.clone()); + builder.assert_eq(s1_next.clone(), u32_v_hi.clone()); + } + + builder.when(is_u32split).assert_eq(s0.clone(), u32_v64.clone()); + builder.when(is_u32add).assert_eq(s0.clone() + s1.clone(), u32_v48.clone()); + builder + .when(is_u32add3) + .assert_eq(s0.clone() + s1.clone() + s2.clone(), u32_v48); + + // U32SUB: s1 = s0 + s1' - s0' * 2^32, s0' is boolean (borrow), s1' = v_lo. + { + let gate = builder.is_transition() * is_u32sub; + let builder = &mut builder.when(gate); + builder.assert_eq(s1.clone(), s0.clone() + s1_next.clone() - s0_next.clone() * TWO_POW_32); + builder.assert_bool(s0_next.clone()); + builder.assert_eq(s1_next.clone(), u32_v_lo.clone()); + } + + builder.when(is_u32mul).assert_eq(s0.clone() * s1.clone(), u32_v64.clone()); + builder.when(is_u32madd).assert_eq(s0.clone() * s1.clone() + s2, u32_v64); + + // U32DIV: s1 = s0 * s1' + s0', range checks on remainder and quotient bounds. + { + let gate = builder.is_transition() * is_u32div; + let builder = &mut builder.when(gate); + builder.assert_eq(s1.clone(), s0.clone() * s1_next.clone() + s0_next.clone()); + builder.assert_eq(s1 - s1_next.clone(), u32_v_lo.clone()); + builder.assert_eq(s0 - s0_next.clone(), u32_v_hi.clone() + F_1); + } + + // U32ASSERT2: verifies both stack elements are valid u32 values. + { + let gate = builder.is_transition() * is_u32assert2; + let builder = &mut builder.when(gate); + builder.assert_eq(s0_next, u32_v_hi); + builder.assert_eq(s1_next, u32_v_lo); + } } diff --git a/air/src/constraints/stack/stack_arith/tests.rs b/air/src/constraints/stack/stack_arith/tests.rs new file mode 100644 index 0000000000..b446899297 --- /dev/null +++ b/air/src/constraints/stack/stack_arith/tests.rs @@ -0,0 +1,182 @@ +use alloc::vec::Vec; + +use miden_core::{ + Felt, + field::{PrimeCharacteristicRing, PrimeField64, QuadFelt}, + operations::opcodes, +}; +use miden_crypto::stark::{ + air::{AirBuilder, EmptyWindow, ExtensionBuilder, PeriodicAirBuilder, PermutationAirBuilder}, + matrix::RowMajorMatrix, +}; + +use super::enforce_main; +use crate::{ + MainCols, + constraints::op_flags::{OpFlags, generate_test_row}, + trace::{AUX_TRACE_RAND_CHALLENGES, AUX_TRACE_WIDTH, TRACE_WIDTH}, +}; + +struct ConstraintEvalBuilder { + main: RowMajorMatrix, + aux: RowMajorMatrix, + randomness: Vec, + permutation_values: Vec, + periodic_values: Vec, + evaluations: Vec, +} + +impl ConstraintEvalBuilder { + fn new() -> Self { + Self { + main: RowMajorMatrix::new(vec![Felt::ZERO; TRACE_WIDTH * 2], TRACE_WIDTH), + aux: RowMajorMatrix::new(vec![QuadFelt::ZERO; AUX_TRACE_WIDTH * 2], AUX_TRACE_WIDTH), + randomness: vec![QuadFelt::ZERO; AUX_TRACE_RAND_CHALLENGES], + permutation_values: vec![QuadFelt::ZERO; AUX_TRACE_WIDTH], + periodic_values: Vec::new(), + evaluations: Vec::new(), + } + } +} + +impl AirBuilder for ConstraintEvalBuilder { + type F = Felt; + type Expr = Felt; + type Var = Felt; + type PreprocessedWindow = EmptyWindow; + type MainWindow = RowMajorMatrix; + type PublicVar = Felt; + + fn main(&self) -> Self::MainWindow { + self.main.clone() + } + + fn preprocessed(&self) -> &Self::PreprocessedWindow { + EmptyWindow::empty_ref() + } + + fn is_first_row(&self) -> Self::Expr { + Felt::ZERO + } + + fn is_last_row(&self) -> Self::Expr { + Felt::ZERO + } + + fn is_transition_window(&self, size: usize) -> Self::Expr { + assert_eq!(size, 2, "stack_arith only uses 2-row transition constraints"); + Felt::ONE + } + + fn assert_zero>(&mut self, x: I) { + self.evaluations.push(QuadFelt::from(x.into())); + } + + fn public_values(&self) -> &[Self::PublicVar] { + &[] + } +} + +impl ExtensionBuilder for ConstraintEvalBuilder { + type EF = QuadFelt; + type ExprEF = QuadFelt; + type VarEF = QuadFelt; + + fn assert_zero_ext(&mut self, x: I) + where + I: Into, + { + self.evaluations.push(x.into()); + } +} + +impl PermutationAirBuilder for ConstraintEvalBuilder { + type MP = RowMajorMatrix; + type RandomVar = QuadFelt; + type PermutationVar = QuadFelt; + + fn permutation(&self) -> Self::MP { + self.aux.clone() + } + + fn permutation_randomness(&self) -> &[Self::RandomVar] { + &self.randomness + } + + fn permutation_values(&self) -> &[Self::PermutationVar] { + &self.permutation_values + } +} + +impl PeriodicAirBuilder for ConstraintEvalBuilder { + type PeriodicVar = Felt; + + fn periodic_values(&self) -> &[Self::PeriodicVar] { + &self.periodic_values + } +} + +/// Sets the u32 helper registers (hasher_state[2..7]) in the decoder. +fn set_u32_helpers(row: &mut MainCols, lo: u32, hi: u32) { + row.decoder.hasher_state[2] = Felt::new(lo as u64 & 0xffff); + row.decoder.hasher_state[3] = Felt::new((lo as u64) >> 16); + row.decoder.hasher_state[4] = Felt::new(hi as u64 & 0xffff); + row.decoder.hasher_state[5] = Felt::new((hi as u64) >> 16); + row.decoder.hasher_state[6] = Felt::ZERO; +} + +fn eval_stack_arith(local: &MainCols, next: &MainCols) -> Vec { + let mut builder = ConstraintEvalBuilder::new(); + let op_flags = OpFlags::new(&local.decoder, &local.stack, &next.decoder); + enforce_main(&mut builder, local, next, &op_flags); + builder.evaluations +} + +#[test] +fn stack_arith_u32add_constraints_allow_non_u32_operands() { + let non_u32 = Felt::new(Felt::ORDER_U64 - 1); + assert!(non_u32.as_canonical_u64() > u32::MAX as u64); + + let mut local = generate_test_row(opcodes::U32ADD as usize); + local.stack.top[0] = non_u32; + local.stack.top[1] = Felt::ONE; + set_u32_helpers(&mut local, 0, 0); + + let next = generate_test_row(0); + + let op_flags: OpFlags = OpFlags::new(&local.decoder, &local.stack, &next.decoder); + assert_eq!(op_flags.u32add(), Felt::ONE); + assert_eq!(op_flags.u32sub(), Felt::ZERO); + + let evaluations = eval_stack_arith(&local, &next); + assert!( + evaluations.iter().all(|value| *value == QuadFelt::ZERO), + "expected U32ADD constraints to accept a non-u32 operand with forged u32 outputs" + ); +} + +#[test] +fn stack_arith_u32sub_constraints_allow_non_u32_operands() { + let non_u32 = Felt::new(Felt::ORDER_U64 - 1); + let diff = ((1u64 << 32) - 12_290) as u32; + assert!(non_u32.as_canonical_u64() > u32::MAX as u64); + + let mut local = generate_test_row(opcodes::U32SUB as usize); + local.stack.top[0] = Felt::new(12_289); + local.stack.top[1] = non_u32; + set_u32_helpers(&mut local, diff, 0); + + let mut next = generate_test_row(0); + next.stack.top[0] = Felt::ONE; + next.stack.top[1] = Felt::new(diff as u64); + + let op_flags: OpFlags = OpFlags::new(&local.decoder, &local.stack, &next.decoder); + assert_eq!(op_flags.u32sub(), Felt::ONE); + assert_eq!(op_flags.u32add(), Felt::ZERO); + + let evaluations = eval_stack_arith(&local, &next); + assert!( + evaluations.iter().all(|value| *value == QuadFelt::ZERO), + "expected U32SUB constraints to accept a non-u32 operand with forged u32 outputs" + ); +} diff --git a/air/src/constraints/system/columns.rs b/air/src/constraints/system/columns.rs new file mode 100644 index 0000000000..29a3a6f143 --- /dev/null +++ b/air/src/constraints/system/columns.rs @@ -0,0 +1,15 @@ +use miden_core::WORD_SIZE; + +/// System columns in the main execution trace (6 columns). +/// +/// These columns track global execution state: clock cycle, execution context, and +/// the function hash (digest) of the currently executing function. +#[repr(C)] +pub struct SystemCols { + /// Clock cycle counter. + pub clk: T, + /// Context identifier. + pub ctx: T, + /// Function hash (digest) of the currently executing function. + pub fn_hash: [T; WORD_SIZE], +} diff --git a/air/src/constraints/system/mod.rs b/air/src/constraints/system/mod.rs index 9fc00baf1d..a1536fd9be 100644 --- a/air/src/constraints/system/mod.rs +++ b/air/src/constraints/system/mod.rs @@ -29,147 +29,73 @@ //! Note: END operation's restoration is handled by the block stack table (bus-based), //! not by these constraints. These constraints only handle the non-END cases. -use miden_core::field::PrimeCharacteristicRing; -use miden_crypto::stark::air::{AirBuilder, LiftedAirBuilder}; +pub mod columns; + +use miden_crypto::stark::air::AirBuilder; use crate::{ - MainTraceRow, - constraints::{ - op_flags::{ExprDecoderAccess, OpFlags}, - tagging::{ - TaggingAirBuilderExt, - ids::{ - TAG_SYSTEM_CLK_BASE, TAG_SYSTEM_CLK_COUNT, TAG_SYSTEM_CTX_BASE, - TAG_SYSTEM_CTX_COUNT, TAG_SYSTEM_FN_HASH_BASE, - }, - }, - }, - trace::decoder::HASHER_STATE_OFFSET, + MainCols, MidenAirBuilder, + constraints::{constants::F_1, op_flags::OpFlags, utils::BoolNot}, }; -// TAGGING CONSTANTS -// ================================================================================================ - -const SYSTEM_CLK_NAMES: [&str; TAG_SYSTEM_CLK_COUNT] = - ["system.clk.first_row", "system.clk.transition"]; - -const SYSTEM_CTX_NAMES: [&str; TAG_SYSTEM_CTX_COUNT] = - ["system.ctx.call_dyncall", "system.ctx.syscall", "system.ctx.default"]; - -const SYSTEM_FN_HASH_LOAD_NAMESPACE: &str = "system.fn_hash.load"; -const SYSTEM_FN_HASH_PRESERVE_NAMESPACE: &str = "system.fn_hash.preserve"; - // ENTRY POINTS // ================================================================================================ /// Enforces system constraints. pub fn enforce_main( builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, + local: &MainCols, + next: &MainCols, + op_flags: &OpFlags, ) where - AB: LiftedAirBuilder, + AB: MidenAirBuilder, { - enforce_clock_constraint(builder, local, next); - enforce_ctx_constraints(builder, local, next); - enforce_fn_hash_constraints(builder, local, next); -} - -// CONSTRAINT HELPERS -// ================================================================================================ - -/// Enforces the clock constraint: clk' = clk + 1. -pub(crate) fn enforce_clock_constraint( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, -) where - AB: LiftedAirBuilder, -{ - builder.tagged(TAG_SYSTEM_CLK_BASE, SYSTEM_CLK_NAMES[0], |builder| { - builder.when_first_row().assert_zero(local.clk.clone()); - }); - - builder.tagged(TAG_SYSTEM_CLK_BASE + 1, SYSTEM_CLK_NAMES[1], |builder| { - builder - .when_transition() - .assert_eq(next.clk.clone(), local.clk.clone() + AB::Expr::ONE); - }); -} - -/// Enforces execution context transition constraints. -pub(crate) fn enforce_ctx_constraints( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, -) where - AB: LiftedAirBuilder, -{ - let ctx: AB::Expr = local.ctx.clone().into(); - let ctx_next: AB::Expr = next.ctx.clone().into(); - let clk: AB::Expr = local.clk.clone().into(); - - let op_flags = OpFlags::new(ExprDecoderAccess::new(local)); + // Clock: starts at 0, increments by 1 + { + builder.when_first_row().assert_zero(local.system.clk); + builder.when_transition().assert_eq(next.system.clk, local.system.clk + F_1); + } let f_call = op_flags.call(); let f_syscall = op_flags.syscall(); let f_dyncall = op_flags.dyncall(); let f_end = op_flags.end(); - let call_dyncall_flag = f_call.clone() + f_dyncall.clone(); - let expected_new_ctx = clk + AB::Expr::ONE; - builder.tagged(TAG_SYSTEM_CTX_BASE, SYSTEM_CTX_NAMES[0], |builder| { - builder - .when_transition() - .assert_zero(call_dyncall_flag * (ctx_next.clone() - expected_new_ctx)); - }); - - builder.tagged(TAG_SYSTEM_CTX_BASE + 1, SYSTEM_CTX_NAMES[1], |builder| { - builder.when_transition().assert_zero(f_syscall.clone() * ctx_next.clone()); - }); - - let change_ctx_flag = f_call + f_syscall + f_dyncall + f_end; - let default_flag = AB::Expr::ONE - change_ctx_flag; - builder.tagged(TAG_SYSTEM_CTX_BASE + 2, SYSTEM_CTX_NAMES[2], |builder| { - builder.when_transition().assert_zero(default_flag * (ctx_next - ctx)); - }); -} - -/// Enforces function hash transition constraints. -pub(crate) fn enforce_fn_hash_constraints( - builder: &mut AB, - local: &MainTraceRow, - next: &MainTraceRow, -) where - AB: LiftedAirBuilder, -{ - let op_flags = OpFlags::new(ExprDecoderAccess::new(local)); - let f_call = op_flags.call(); - let f_dyncall = op_flags.dyncall(); - let f_end = op_flags.end(); - - let f_load = f_call.clone() + f_dyncall.clone(); - let f_preserve = AB::Expr::ONE - (f_load.clone() + f_end); - - let load_ids: [usize; 4] = core::array::from_fn(|i| TAG_SYSTEM_FN_HASH_BASE + i); - builder.tagged_list(load_ids, SYSTEM_FN_HASH_LOAD_NAMESPACE, |builder| { - builder.when_transition().when(f_load.clone()).assert_zeros( - core::array::from_fn::<_, 4, _>(|i| { - let fn_hash_i_next: AB::Expr = next.fn_hash[i].clone().into(); - let decoder_h_i: AB::Expr = local.decoder[HASHER_STATE_OFFSET + i].clone().into(); - fn_hash_i_next - decoder_h_i - }), - ); - }); - - let preserve_ids: [usize; 4] = core::array::from_fn(|i| TAG_SYSTEM_FN_HASH_BASE + 4 + i); - builder.tagged_list(preserve_ids, SYSTEM_FN_HASH_PRESERVE_NAMESPACE, |builder| { - builder - .when_transition() - .when(f_preserve.clone()) - .assert_zeros(core::array::from_fn::<_, 4, _>(|i| { - let fn_hash_i: AB::Expr = local.fn_hash[i].clone().into(); - let fn_hash_i_next: AB::Expr = next.fn_hash[i].clone().into(); - fn_hash_i_next - fn_hash_i - })); - }); + // Execution context transition constraints (see module doc for transition table) + { + let ctx = local.system.ctx; + let ctx_next = next.system.ctx; + let clk = local.system.clk; + + let call_dyncall_flag = f_call.clone() + f_dyncall.clone(); + let change_ctx_flag = + f_call.clone() + f_syscall.clone() + f_dyncall.clone() + f_end.clone(); + let default_flag = change_ctx_flag.not(); + + let builder = &mut builder.when_transition(); + builder.when(call_dyncall_flag).assert_eq(ctx_next, clk + F_1); + builder.when(f_syscall).assert_zero(ctx_next); + builder.when(default_flag).assert_eq(ctx_next, ctx); + } + + // Function hash transition constraints (see module doc for transition table) + { + let f_load = f_call + f_dyncall; + let f_preserve = (f_load.clone() + f_end).not(); + + let builder = &mut builder.when_transition(); + + { + let builder = &mut builder.when(f_load); + for i in 0..4 { + builder.assert_eq(next.system.fn_hash[i], local.decoder.hasher_state[i]); + } + } + + { + let builder = &mut builder.when(f_preserve); + for i in 0..4 { + builder.assert_eq(next.system.fn_hash[i], local.system.fn_hash[i]); + } + } + } } diff --git a/air/src/constraints/tagging/enabled.rs b/air/src/constraints/tagging/enabled.rs deleted file mode 100644 index 975ea83359..0000000000 --- a/air/src/constraints/tagging/enabled.rs +++ /dev/null @@ -1,45 +0,0 @@ -//! Constraint tagging helpers for stable numeric IDs. -//! -//! This module is compiled in tests or when the `testing` feature is enabled, with `std` available. -//! Non-testing or no-std builds use a no-op stub. This keeps call sites clean and avoids `std` -//! machinery in production. - -use miden_crypto::stark::air::LiftedAirBuilder; - -/// Extension methods for tagging constraints. -/// -/// These helpers wrap blocks that should emit a fixed number of assertions. Each assertion -/// consumes one ID from the active tagged block, and the block panics if the count mismatches. -pub trait TaggingAirBuilderExt: LiftedAirBuilder { - /// Tag exactly one asserted constraint. - /// - /// Panics if the wrapped block emits zero or multiple assertions when tagging is enabled. - fn tagged( - &mut self, - id: usize, - namespace: &'static str, - f: impl FnOnce(&mut Self) -> R, - ) -> R { - if !super::state::is_enabled() { - return f(self); - } - super::state::with_tag(vec![id], namespace, || f(self)) - } - - /// Tag a list of asserted constraints (e.g., `assert_zeros` or per-iteration loops). - /// - /// Panics if the wrapped block does not emit exactly `N` assertions when tagging is enabled. - fn tagged_list( - &mut self, - ids: [usize; N], - namespace: &'static str, - f: impl FnOnce(&mut Self) -> R, - ) -> R { - if !super::state::is_enabled() { - return f(self); - } - super::state::with_tag(ids.to_vec(), namespace, || f(self)) - } -} - -impl TaggingAirBuilderExt for T {} diff --git a/air/src/constraints/tagging/fallback.rs b/air/src/constraints/tagging/fallback.rs deleted file mode 100644 index 40c93de45f..0000000000 --- a/air/src/constraints/tagging/fallback.rs +++ /dev/null @@ -1,28 +0,0 @@ -//! No-op tagging helpers for non-testing or no-std builds. - -use miden_crypto::stark::air::LiftedAirBuilder; -/// No-op tagging extension for non-testing builds. -/// -/// The methods call the provided closure directly so they have no runtime overhead beyond -/// the call itself (which the optimizer should inline away). -pub trait TaggingAirBuilderExt: LiftedAirBuilder { - fn tagged( - &mut self, - _id: usize, - _namespace: &'static str, - f: impl FnOnce(&mut Self) -> R, - ) -> R { - f(self) - } - - fn tagged_list( - &mut self, - _ids: [usize; N], - _namespace: &'static str, - f: impl FnOnce(&mut Self) -> R, - ) -> R { - f(self) - } -} - -impl TaggingAirBuilderExt for T {} diff --git a/air/src/constraints/tagging/fixtures.rs b/air/src/constraints/tagging/fixtures.rs deleted file mode 100644 index 84ad557964..0000000000 --- a/air/src/constraints/tagging/fixtures.rs +++ /dev/null @@ -1,2369 +0,0 @@ -//! Test fixtures for constraint tagging. - -use alloc::vec::Vec; - -use miden_core::{Felt, field::QuadFelt}; - -use super::ood_eval::EvalRecord; - -/// Seed used for OOD evaluation fixtures. -pub const OOD_SEED: u64 = 0xc0ffee; - -/// Expected OOD evaluations for the current group. -/// -/// These values are captured from the Rust constraints with seed 0xC0FFEE. -pub fn current_group_expected() -> Vec { - vec![ - EvalRecord { - id: 0, - namespace: "system.clk.first_row", - value: QuadFelt::new([Felt::new(1065013626484053923), Felt::new(0)]), - }, - EvalRecord { - id: 1, - namespace: "system.clk.transition", - value: QuadFelt::new([Felt::new(5561241394822338942), Felt::new(0)]), - }, - EvalRecord { - id: 2, - namespace: "system.ctx.call_dyncall", - value: QuadFelt::new([Felt::new(8631524473419082362), Felt::new(0)]), - }, - EvalRecord { - id: 3, - namespace: "system.ctx.syscall", - value: QuadFelt::new([Felt::new(3242942367983627164), Felt::new(0)]), - }, - EvalRecord { - id: 4, - namespace: "system.ctx.default", - value: QuadFelt::new([Felt::new(2699910395066589652), Felt::new(0)]), - }, - EvalRecord { - id: 5, - namespace: "system.fn_hash.load", - value: QuadFelt::new([Felt::new(5171717963692258605), Felt::new(0)]), - }, - EvalRecord { - id: 6, - namespace: "system.fn_hash.load", - value: QuadFelt::new([Felt::new(8961147296413400172), Felt::new(0)]), - }, - EvalRecord { - id: 7, - namespace: "system.fn_hash.load", - value: QuadFelt::new([Felt::new(11894020196642675053), Felt::new(0)]), - }, - EvalRecord { - id: 8, - namespace: "system.fn_hash.load", - value: QuadFelt::new([Felt::new(16889079421217525114), Felt::new(0)]), - }, - EvalRecord { - id: 9, - namespace: "system.fn_hash.preserve", - value: QuadFelt::new([Felt::new(11909329801663906014), Felt::new(0)]), - }, - EvalRecord { - id: 10, - namespace: "system.fn_hash.preserve", - value: QuadFelt::new([Felt::new(6717961555159342431), Felt::new(0)]), - }, - EvalRecord { - id: 11, - namespace: "system.fn_hash.preserve", - value: QuadFelt::new([Felt::new(3950851291570048124), Felt::new(0)]), - }, - EvalRecord { - id: 12, - namespace: "system.fn_hash.preserve", - value: QuadFelt::new([Felt::new(11146653144264413142), Felt::new(0)]), - }, - EvalRecord { - id: 13, - namespace: "range.main.v.first_row", - value: QuadFelt::new([Felt::new(1112338059331632069), Felt::new(0)]), - }, - EvalRecord { - id: 14, - namespace: "range.main.v.last_row", - value: QuadFelt::new([Felt::new(13352757668188868927), Felt::new(0)]), - }, - EvalRecord { - id: 15, - namespace: "range.main.v.transition", - value: QuadFelt::new([Felt::new(12797082443503681195), Felt::new(0)]), - }, - EvalRecord { - id: 16, - namespace: "stack.general.transition.0", - value: QuadFelt::new([Felt::new(2617308096902219240), Felt::new(0)]), - }, - EvalRecord { - id: 17, - namespace: "stack.general.transition.1", - value: QuadFelt::new([Felt::new(4439102810547612775), Felt::new(0)]), - }, - EvalRecord { - id: 18, - namespace: "stack.general.transition.2", - value: QuadFelt::new([Felt::new(15221140463513662734), Felt::new(0)]), - }, - EvalRecord { - id: 19, - namespace: "stack.general.transition.3", - value: QuadFelt::new([Felt::new(4910128267170087966), Felt::new(0)]), - }, - EvalRecord { - id: 20, - namespace: "stack.general.transition.4", - value: QuadFelt::new([Felt::new(8221884229886405628), Felt::new(0)]), - }, - EvalRecord { - id: 21, - namespace: "stack.general.transition.5", - value: QuadFelt::new([Felt::new(87491100192562680), Felt::new(0)]), - }, - EvalRecord { - id: 22, - namespace: "stack.general.transition.6", - value: QuadFelt::new([Felt::new(11411892308848385202), Felt::new(0)]), - }, - EvalRecord { - id: 23, - namespace: "stack.general.transition.7", - value: QuadFelt::new([Felt::new(2425094460891103256), Felt::new(0)]), - }, - EvalRecord { - id: 24, - namespace: "stack.general.transition.8", - value: QuadFelt::new([Felt::new(2767534397043537043), Felt::new(0)]), - }, - EvalRecord { - id: 25, - namespace: "stack.general.transition.9", - value: QuadFelt::new([Felt::new(11686523590994044007), Felt::new(0)]), - }, - EvalRecord { - id: 26, - namespace: "stack.general.transition.10", - value: QuadFelt::new([Felt::new(15000969044032170777), Felt::new(0)]), - }, - EvalRecord { - id: 27, - namespace: "stack.general.transition.11", - value: QuadFelt::new([Felt::new(17422355615541008592), Felt::new(0)]), - }, - EvalRecord { - id: 28, - namespace: "stack.general.transition.12", - value: QuadFelt::new([Felt::new(2555448945580115158), Felt::new(0)]), - }, - EvalRecord { - id: 29, - namespace: "stack.general.transition.13", - value: QuadFelt::new([Felt::new(8864896307613509), Felt::new(0)]), - }, - EvalRecord { - id: 30, - namespace: "stack.general.transition.14", - value: QuadFelt::new([Felt::new(3997062422665481459), Felt::new(0)]), - }, - EvalRecord { - id: 31, - namespace: "stack.general.transition.15", - value: QuadFelt::new([Felt::new(6149720027324442163), Felt::new(0)]), - }, - EvalRecord { - id: 32, - namespace: "stack.overflow.depth.first_row", - value: QuadFelt::new([Felt::new(1820735510664294085), Felt::new(0)]), - }, - EvalRecord { - id: 33, - namespace: "stack.overflow.depth.last_row", - value: QuadFelt::new([Felt::new(12520055704510454391), Felt::new(0)]), - }, - EvalRecord { - id: 34, - namespace: "stack.overflow.addr.first_row", - value: QuadFelt::new([Felt::new(9235172344178625178), Felt::new(0)]), - }, - EvalRecord { - id: 35, - namespace: "stack.overflow.addr.last_row", - value: QuadFelt::new([Felt::new(6001883085148683205), Felt::new(0)]), - }, - EvalRecord { - id: 36, - namespace: "stack.overflow.depth.transition", - value: QuadFelt::new([Felt::new(6706883717633639596), Felt::new(0)]), - }, - EvalRecord { - id: 37, - namespace: "stack.overflow.flag.transition", - value: QuadFelt::new([Felt::new(5309566436521762910), Felt::new(0)]), - }, - EvalRecord { - id: 38, - namespace: "stack.overflow.addr.transition", - value: QuadFelt::new([Felt::new(13739720401332236216), Felt::new(0)]), - }, - EvalRecord { - id: 39, - namespace: "stack.overflow.zero_insert.transition", - value: QuadFelt::new([Felt::new(15830245309845547857), Felt::new(0)]), - }, - EvalRecord { - id: 40, - namespace: "stack.ops.pad", - value: QuadFelt::new([Felt::new(13331629930659656176), Felt::new(0)]), - }, - EvalRecord { - id: 41, - namespace: "stack.ops.dup", - value: QuadFelt::new([Felt::new(756650319667756050), Felt::new(0)]), - }, - EvalRecord { - id: 42, - namespace: "stack.ops.dup1", - value: QuadFelt::new([Felt::new(8866275161884692697), Felt::new(0)]), - }, - EvalRecord { - id: 43, - namespace: "stack.ops.dup2", - value: QuadFelt::new([Felt::new(3836534398031583164), Felt::new(0)]), - }, - EvalRecord { - id: 44, - namespace: "stack.ops.dup3", - value: QuadFelt::new([Felt::new(14027345575708861734), Felt::new(0)]), - }, - EvalRecord { - id: 45, - namespace: "stack.ops.dup4", - value: QuadFelt::new([Felt::new(6758311777121484896), Felt::new(0)]), - }, - EvalRecord { - id: 46, - namespace: "stack.ops.dup5", - value: QuadFelt::new([Felt::new(3070735592903657788), Felt::new(0)]), - }, - EvalRecord { - id: 47, - namespace: "stack.ops.dup6", - value: QuadFelt::new([Felt::new(7754656097784875208), Felt::new(0)]), - }, - EvalRecord { - id: 48, - namespace: "stack.ops.dup7", - value: QuadFelt::new([Felt::new(6720121361576140513), Felt::new(0)]), - }, - EvalRecord { - id: 49, - namespace: "stack.ops.dup9", - value: QuadFelt::new([Felt::new(17539764796672551158), Felt::new(0)]), - }, - EvalRecord { - id: 50, - namespace: "stack.ops.dup11", - value: QuadFelt::new([Felt::new(10804911883091000860), Felt::new(0)]), - }, - EvalRecord { - id: 51, - namespace: "stack.ops.dup13", - value: QuadFelt::new([Felt::new(9611708950007293491), Felt::new(0)]), - }, - EvalRecord { - id: 52, - namespace: "stack.ops.dup15", - value: QuadFelt::new([Felt::new(8853070398648442411), Felt::new(0)]), - }, - EvalRecord { - id: 53, - namespace: "stack.ops.clk", - value: QuadFelt::new([Felt::new(9109734313690111543), Felt::new(0)]), - }, - EvalRecord { - id: 54, - namespace: "stack.ops.swap", - value: QuadFelt::new([Felt::new(3018402783504114630), Felt::new(0)]), - }, - EvalRecord { - id: 55, - namespace: "stack.ops.swap", - value: QuadFelt::new([Felt::new(17272825861332302734), Felt::new(0)]), - }, - EvalRecord { - id: 56, - namespace: "stack.ops.movup2", - value: QuadFelt::new([Felt::new(6365383181668196029), Felt::new(0)]), - }, - EvalRecord { - id: 57, - namespace: "stack.ops.movup3", - value: QuadFelt::new([Felt::new(11479712264864576587), Felt::new(0)]), - }, - EvalRecord { - id: 58, - namespace: "stack.ops.movup4", - value: QuadFelt::new([Felt::new(12050324136647260589), Felt::new(0)]), - }, - EvalRecord { - id: 59, - namespace: "stack.ops.movup5", - value: QuadFelt::new([Felt::new(4842889514271599822), Felt::new(0)]), - }, - EvalRecord { - id: 60, - namespace: "stack.ops.movup6", - value: QuadFelt::new([Felt::new(7388624400246275858), Felt::new(0)]), - }, - EvalRecord { - id: 61, - namespace: "stack.ops.movup7", - value: QuadFelt::new([Felt::new(10382124953564405655), Felt::new(0)]), - }, - EvalRecord { - id: 62, - namespace: "stack.ops.movup8", - value: QuadFelt::new([Felt::new(14668661130070444298), Felt::new(0)]), - }, - EvalRecord { - id: 63, - namespace: "stack.ops.movdn2", - value: QuadFelt::new([Felt::new(7617911967740804399), Felt::new(0)]), - }, - EvalRecord { - id: 64, - namespace: "stack.ops.movdn3", - value: QuadFelt::new([Felt::new(10587498815844952065), Felt::new(0)]), - }, - EvalRecord { - id: 65, - namespace: "stack.ops.movdn4", - value: QuadFelt::new([Felt::new(6234074065813353677), Felt::new(0)]), - }, - EvalRecord { - id: 66, - namespace: "stack.ops.movdn5", - value: QuadFelt::new([Felt::new(8228745571736556881), Felt::new(0)]), - }, - EvalRecord { - id: 67, - namespace: "stack.ops.movdn6", - value: QuadFelt::new([Felt::new(1255130201489737978), Felt::new(0)]), - }, - EvalRecord { - id: 68, - namespace: "stack.ops.movdn7", - value: QuadFelt::new([Felt::new(4861541115171604729), Felt::new(0)]), - }, - EvalRecord { - id: 69, - namespace: "stack.ops.movdn8", - value: QuadFelt::new([Felt::new(7218300239612772413), Felt::new(0)]), - }, - EvalRecord { - id: 70, - namespace: "stack.ops.swapw", - value: QuadFelt::new([Felt::new(1397391365707566947), Felt::new(0)]), - }, - EvalRecord { - id: 71, - namespace: "stack.ops.swapw", - value: QuadFelt::new([Felt::new(15192275354424729852), Felt::new(0)]), - }, - EvalRecord { - id: 72, - namespace: "stack.ops.swapw", - value: QuadFelt::new([Felt::new(8991791753517007572), Felt::new(0)]), - }, - EvalRecord { - id: 73, - namespace: "stack.ops.swapw", - value: QuadFelt::new([Felt::new(6845904526592099338), Felt::new(0)]), - }, - EvalRecord { - id: 74, - namespace: "stack.ops.swapw", - value: QuadFelt::new([Felt::new(14405008868848810993), Felt::new(0)]), - }, - EvalRecord { - id: 75, - namespace: "stack.ops.swapw", - value: QuadFelt::new([Felt::new(14818059880037013402), Felt::new(0)]), - }, - EvalRecord { - id: 76, - namespace: "stack.ops.swapw", - value: QuadFelt::new([Felt::new(12858781526955010288), Felt::new(0)]), - }, - EvalRecord { - id: 77, - namespace: "stack.ops.swapw", - value: QuadFelt::new([Felt::new(4346525868099676574), Felt::new(0)]), - }, - EvalRecord { - id: 78, - namespace: "stack.ops.swapw2", - value: QuadFelt::new([Felt::new(12020803221700843056), Felt::new(0)]), - }, - EvalRecord { - id: 79, - namespace: "stack.ops.swapw2", - value: QuadFelt::new([Felt::new(5905514554571101818), Felt::new(0)]), - }, - EvalRecord { - id: 80, - namespace: "stack.ops.swapw2", - value: QuadFelt::new([Felt::new(13967530246007855218), Felt::new(0)]), - }, - EvalRecord { - id: 81, - namespace: "stack.ops.swapw2", - value: QuadFelt::new([Felt::new(1745280905200466463), Felt::new(0)]), - }, - EvalRecord { - id: 82, - namespace: "stack.ops.swapw2", - value: QuadFelt::new([Felt::new(8273384627661819419), Felt::new(0)]), - }, - EvalRecord { - id: 83, - namespace: "stack.ops.swapw2", - value: QuadFelt::new([Felt::new(17907212562142949954), Felt::new(0)]), - }, - EvalRecord { - id: 84, - namespace: "stack.ops.swapw2", - value: QuadFelt::new([Felt::new(10641837676859047674), Felt::new(0)]), - }, - EvalRecord { - id: 85, - namespace: "stack.ops.swapw2", - value: QuadFelt::new([Felt::new(5696399439164028901), Felt::new(0)]), - }, - EvalRecord { - id: 86, - namespace: "stack.ops.swapw3", - value: QuadFelt::new([Felt::new(261758456050090541), Felt::new(0)]), - }, - EvalRecord { - id: 87, - namespace: "stack.ops.swapw3", - value: QuadFelt::new([Felt::new(13783565204182644984), Felt::new(0)]), - }, - EvalRecord { - id: 88, - namespace: "stack.ops.swapw3", - value: QuadFelt::new([Felt::new(8373199292442046895), Felt::new(0)]), - }, - EvalRecord { - id: 89, - namespace: "stack.ops.swapw3", - value: QuadFelt::new([Felt::new(17987956356814792948), Felt::new(0)]), - }, - EvalRecord { - id: 90, - namespace: "stack.ops.swapw3", - value: QuadFelt::new([Felt::new(15863165148623313437), Felt::new(0)]), - }, - EvalRecord { - id: 91, - namespace: "stack.ops.swapw3", - value: QuadFelt::new([Felt::new(15873554387396407564), Felt::new(0)]), - }, - EvalRecord { - id: 92, - namespace: "stack.ops.swapw3", - value: QuadFelt::new([Felt::new(13572800254923888612), Felt::new(0)]), - }, - EvalRecord { - id: 93, - namespace: "stack.ops.swapw3", - value: QuadFelt::new([Felt::new(37494485778659889), Felt::new(0)]), - }, - EvalRecord { - id: 94, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(5468305410596890575), Felt::new(0)]), - }, - EvalRecord { - id: 95, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(8148573700621797018), Felt::new(0)]), - }, - EvalRecord { - id: 96, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(174223531403505930), Felt::new(0)]), - }, - EvalRecord { - id: 97, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(7472429897136677074), Felt::new(0)]), - }, - EvalRecord { - id: 98, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(9085995615849733227), Felt::new(0)]), - }, - EvalRecord { - id: 99, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(17751305329307070351), Felt::new(0)]), - }, - EvalRecord { - id: 100, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(12464875440922891257), Felt::new(0)]), - }, - EvalRecord { - id: 101, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(7381981033510767101), Felt::new(0)]), - }, - EvalRecord { - id: 102, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(14206386269299463916), Felt::new(0)]), - }, - EvalRecord { - id: 103, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(5165712881513112310), Felt::new(0)]), - }, - EvalRecord { - id: 104, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(9505024677507267655), Felt::new(0)]), - }, - EvalRecord { - id: 105, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(7199235098885318815), Felt::new(0)]), - }, - EvalRecord { - id: 106, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(14863071265127885763), Felt::new(0)]), - }, - EvalRecord { - id: 107, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(7964997496183729586), Felt::new(0)]), - }, - EvalRecord { - id: 108, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(17447611484236572336), Felt::new(0)]), - }, - EvalRecord { - id: 109, - namespace: "stack.ops.swapdw", - value: QuadFelt::new([Felt::new(7663698430658282360), Felt::new(0)]), - }, - EvalRecord { - id: 110, - namespace: "stack.ops.cswap", - value: QuadFelt::new([Felt::new(7787471015064615045), Felt::new(0)]), - }, - EvalRecord { - id: 111, - namespace: "stack.ops.cswap", - value: QuadFelt::new([Felt::new(18107469477286194402), Felt::new(0)]), - }, - EvalRecord { - id: 112, - namespace: "stack.ops.cswap", - value: QuadFelt::new([Felt::new(8228755909294702214), Felt::new(0)]), - }, - EvalRecord { - id: 113, - namespace: "stack.ops.cswapw", - value: QuadFelt::new([Felt::new(4517595434872149482), Felt::new(0)]), - }, - EvalRecord { - id: 114, - namespace: "stack.ops.cswapw", - value: QuadFelt::new([Felt::new(7382517392819628451), Felt::new(0)]), - }, - EvalRecord { - id: 115, - namespace: "stack.ops.cswapw", - value: QuadFelt::new([Felt::new(4827417633003237585), Felt::new(0)]), - }, - EvalRecord { - id: 116, - namespace: "stack.ops.cswapw", - value: QuadFelt::new([Felt::new(17779390882653606052), Felt::new(0)]), - }, - EvalRecord { - id: 117, - namespace: "stack.ops.cswapw", - value: QuadFelt::new([Felt::new(16587491652407655425), Felt::new(0)]), - }, - EvalRecord { - id: 118, - namespace: "stack.ops.cswapw", - value: QuadFelt::new([Felt::new(6936098212561125534), Felt::new(0)]), - }, - EvalRecord { - id: 119, - namespace: "stack.ops.cswapw", - value: QuadFelt::new([Felt::new(5094958697700743127), Felt::new(0)]), - }, - EvalRecord { - id: 120, - namespace: "stack.ops.cswapw", - value: QuadFelt::new([Felt::new(189412762651021203), Felt::new(0)]), - }, - EvalRecord { - id: 121, - namespace: "stack.ops.cswapw", - value: QuadFelt::new([Felt::new(8308993958309806023), Felt::new(0)]), - }, - EvalRecord { - id: 122, - namespace: "stack.system.assert", - value: QuadFelt::new([Felt::new(8348363779099446030), Felt::new(0)]), - }, - EvalRecord { - id: 123, - namespace: "stack.system.caller", - value: QuadFelt::new([Felt::new(16674981897661760210), Felt::new(0)]), - }, - EvalRecord { - id: 124, - namespace: "stack.system.caller", - value: QuadFelt::new([Felt::new(14361028107722480662), Felt::new(0)]), - }, - EvalRecord { - id: 125, - namespace: "stack.system.caller", - value: QuadFelt::new([Felt::new(9738252875195915138), Felt::new(0)]), - }, - EvalRecord { - id: 126, - namespace: "stack.system.caller", - value: QuadFelt::new([Felt::new(15161342143096572193), Felt::new(0)]), - }, - EvalRecord { - id: 127, - namespace: "stack.io.sdepth", - value: QuadFelt::new([Felt::new(9690568048381717864), Felt::new(0)]), - }, - EvalRecord { - id: 128, - namespace: "stack.crypto.cryptostream", - value: QuadFelt::new([Felt::new(12685385640397555155), Felt::new(0)]), - }, - EvalRecord { - id: 129, - namespace: "stack.crypto.cryptostream", - value: QuadFelt::new([Felt::new(17365149299857381549), Felt::new(0)]), - }, - EvalRecord { - id: 130, - namespace: "stack.crypto.cryptostream", - value: QuadFelt::new([Felt::new(7455833729327549495), Felt::new(0)]), - }, - EvalRecord { - id: 131, - namespace: "stack.crypto.cryptostream", - value: QuadFelt::new([Felt::new(15687115573708323478), Felt::new(0)]), - }, - EvalRecord { - id: 132, - namespace: "stack.crypto.cryptostream", - value: QuadFelt::new([Felt::new(7143356749732107964), Felt::new(0)]), - }, - EvalRecord { - id: 133, - namespace: "stack.crypto.cryptostream", - value: QuadFelt::new([Felt::new(16804762938330714938), Felt::new(0)]), - }, - EvalRecord { - id: 134, - namespace: "stack.crypto.cryptostream", - value: QuadFelt::new([Felt::new(11562801811268566657), Felt::new(0)]), - }, - EvalRecord { - id: 135, - namespace: "stack.crypto.cryptostream", - value: QuadFelt::new([Felt::new(6374246579471617400), Felt::new(0)]), - }, - EvalRecord { - id: 136, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(6682735393816016083), Felt::new(0)]), - }, - EvalRecord { - id: 137, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(15946014808270501272), Felt::new(0)]), - }, - EvalRecord { - id: 138, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(15603944589931385962), Felt::new(0)]), - }, - EvalRecord { - id: 139, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(9275882712531701258), Felt::new(0)]), - }, - EvalRecord { - id: 140, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(2477075229563534723), Felt::new(0)]), - }, - EvalRecord { - id: 141, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(5290505604769958968), Felt::new(0)]), - }, - EvalRecord { - id: 142, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(2851265439044985455), Felt::new(0)]), - }, - EvalRecord { - id: 143, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(18383212236849004064), Felt::new(0)]), - }, - EvalRecord { - id: 144, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(1727422736811819477), Felt::new(0)]), - }, - EvalRecord { - id: 145, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(8661298711862814846), Felt::new(0)]), - }, - EvalRecord { - id: 146, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(4909615103768362856), Felt::new(0)]), - }, - EvalRecord { - id: 147, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(6313538606129191078), Felt::new(0)]), - }, - EvalRecord { - id: 148, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(16477933543947236322), Felt::new(0)]), - }, - EvalRecord { - id: 149, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(8923348207341089911), Felt::new(0)]), - }, - EvalRecord { - id: 150, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(8415559196869506674), Felt::new(0)]), - }, - EvalRecord { - id: 151, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(12374820114184953398), Felt::new(0)]), - }, - EvalRecord { - id: 152, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(2975290982061044481), Felt::new(0)]), - }, - EvalRecord { - id: 153, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(13487726821146861348), Felt::new(0)]), - }, - EvalRecord { - id: 154, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(9982904041042376807), Felt::new(0)]), - }, - EvalRecord { - id: 155, - namespace: "stack.crypto.hornerbase", - value: QuadFelt::new([Felt::new(5949627607219451329), Felt::new(0)]), - }, - EvalRecord { - id: 156, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(4258650708569289369), Felt::new(0)]), - }, - EvalRecord { - id: 157, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(10623987720748853996), Felt::new(0)]), - }, - EvalRecord { - id: 158, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(7214338718283715042), Felt::new(0)]), - }, - EvalRecord { - id: 159, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(11353293984106841353), Felt::new(0)]), - }, - EvalRecord { - id: 160, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(13021994910061529075), Felt::new(0)]), - }, - EvalRecord { - id: 161, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(16890098475354732519), Felt::new(0)]), - }, - EvalRecord { - id: 162, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(17909680271515252883), Felt::new(0)]), - }, - EvalRecord { - id: 163, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(17436574006020893038), Felt::new(0)]), - }, - EvalRecord { - id: 164, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(11510839286135128168), Felt::new(0)]), - }, - EvalRecord { - id: 165, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(5781748113887851533), Felt::new(0)]), - }, - EvalRecord { - id: 166, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(14599010851776253883), Felt::new(0)]), - }, - EvalRecord { - id: 167, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(9495625123030210045), Felt::new(0)]), - }, - EvalRecord { - id: 168, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(7672904073310511358), Felt::new(0)]), - }, - EvalRecord { - id: 169, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(775511618954631186), Felt::new(0)]), - }, - EvalRecord { - id: 170, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(1082901338727409004), Felt::new(0)]), - }, - EvalRecord { - id: 171, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(13302599741550075590), Felt::new(0)]), - }, - EvalRecord { - id: 172, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(4231043957658294146), Felt::new(0)]), - }, - EvalRecord { - id: 173, - namespace: "stack.crypto.hornerext", - value: QuadFelt::new([Felt::new(16476104241930761470), Felt::new(0)]), - }, - EvalRecord { - id: 174, - namespace: "stack.arith.add", - value: QuadFelt::new([Felt::new(12162183238628940886), Felt::new(0)]), - }, - EvalRecord { - id: 175, - namespace: "stack.arith.neg", - value: QuadFelt::new([Felt::new(5581128975715924145), Felt::new(0)]), - }, - EvalRecord { - id: 176, - namespace: "stack.arith.mul", - value: QuadFelt::new([Felt::new(8554389406737436796), Felt::new(0)]), - }, - EvalRecord { - id: 177, - namespace: "stack.arith.inv", - value: QuadFelt::new([Felt::new(5063887741998958642), Felt::new(0)]), - }, - EvalRecord { - id: 178, - namespace: "stack.arith.incr", - value: QuadFelt::new([Felt::new(4639763508506743987), Felt::new(0)]), - }, - EvalRecord { - id: 179, - namespace: "stack.arith.not", - value: QuadFelt::new([Felt::new(4035466692403055130), Felt::new(0)]), - }, - EvalRecord { - id: 180, - namespace: "stack.arith.not", - value: QuadFelt::new([Felt::new(13177116281714227608), Felt::new(0)]), - }, - EvalRecord { - id: 181, - namespace: "stack.arith.and", - value: QuadFelt::new([Felt::new(3385806455961392573), Felt::new(0)]), - }, - EvalRecord { - id: 182, - namespace: "stack.arith.and", - value: QuadFelt::new([Felt::new(10970170501742489729), Felt::new(0)]), - }, - EvalRecord { - id: 183, - namespace: "stack.arith.and", - value: QuadFelt::new([Felt::new(2412459788431241921), Felt::new(0)]), - }, - EvalRecord { - id: 184, - namespace: "stack.arith.or", - value: QuadFelt::new([Felt::new(3841745486638047933), Felt::new(0)]), - }, - EvalRecord { - id: 185, - namespace: "stack.arith.or", - value: QuadFelt::new([Felt::new(3504719246524046533), Felt::new(0)]), - }, - EvalRecord { - id: 186, - namespace: "stack.arith.or", - value: QuadFelt::new([Felt::new(8108995209839065445), Felt::new(0)]), - }, - EvalRecord { - id: 187, - namespace: "stack.arith.eq", - value: QuadFelt::new([Felt::new(14385477599012828093), Felt::new(0)]), - }, - EvalRecord { - id: 188, - namespace: "stack.arith.eq", - value: QuadFelt::new([Felt::new(17777414138310332081), Felt::new(0)]), - }, - EvalRecord { - id: 189, - namespace: "stack.arith.eqz", - value: QuadFelt::new([Felt::new(1585550152724577414), Felt::new(0)]), - }, - EvalRecord { - id: 190, - namespace: "stack.arith.eqz", - value: QuadFelt::new([Felt::new(8914500005861323211), Felt::new(0)]), - }, - EvalRecord { - id: 191, - namespace: "stack.arith.expacc", - value: QuadFelt::new([Felt::new(10821948734140194924), Felt::new(0)]), - }, - EvalRecord { - id: 192, - namespace: "stack.arith.expacc", - value: QuadFelt::new([Felt::new(18138155306684050585), Felt::new(0)]), - }, - EvalRecord { - id: 193, - namespace: "stack.arith.expacc", - value: QuadFelt::new([Felt::new(11221181362690184920), Felt::new(0)]), - }, - EvalRecord { - id: 194, - namespace: "stack.arith.expacc", - value: QuadFelt::new([Felt::new(9522158304362954603), Felt::new(0)]), - }, - EvalRecord { - id: 195, - namespace: "stack.arith.expacc", - value: QuadFelt::new([Felt::new(13901486800460794091), Felt::new(0)]), - }, - EvalRecord { - id: 196, - namespace: "stack.arith.ext2mul", - value: QuadFelt::new([Felt::new(7911065669822474568), Felt::new(0)]), - }, - EvalRecord { - id: 197, - namespace: "stack.arith.ext2mul", - value: QuadFelt::new([Felt::new(3598619357058098113), Felt::new(0)]), - }, - EvalRecord { - id: 198, - namespace: "stack.arith.ext2mul", - value: QuadFelt::new([Felt::new(996509971607279275), Felt::new(0)]), - }, - EvalRecord { - id: 199, - namespace: "stack.arith.ext2mul", - value: QuadFelt::new([Felt::new(13600174711341153155), Felt::new(0)]), - }, - EvalRecord { - id: 200, - namespace: "stack.arith.u32.shared", - value: QuadFelt::new([Felt::new(1597821177308476955), Felt::new(0)]), - }, - EvalRecord { - id: 201, - namespace: "stack.arith.u32.output", - value: QuadFelt::new([Felt::new(13697666666561534208), Felt::new(0)]), - }, - EvalRecord { - id: 202, - namespace: "stack.arith.u32.output", - value: QuadFelt::new([Felt::new(18192033048549134928), Felt::new(0)]), - }, - EvalRecord { - id: 203, - namespace: "stack.arith.u32.split", - value: QuadFelt::new([Felt::new(15868014234137212529), Felt::new(0)]), - }, - EvalRecord { - id: 204, - namespace: "stack.arith.u32.add", - value: QuadFelt::new([Felt::new(3877846355380377379), Felt::new(0)]), - }, - EvalRecord { - id: 205, - namespace: "stack.arith.u32.add3", - value: QuadFelt::new([Felt::new(14996475617734368887), Felt::new(0)]), - }, - EvalRecord { - id: 206, - namespace: "stack.arith.u32.sub", - value: QuadFelt::new([Felt::new(3623920048867462270), Felt::new(0)]), - }, - EvalRecord { - id: 207, - namespace: "stack.arith.u32.sub", - value: QuadFelt::new([Felt::new(5319755831391255333), Felt::new(0)]), - }, - EvalRecord { - id: 208, - namespace: "stack.arith.u32.sub", - value: QuadFelt::new([Felt::new(15655064156696355905), Felt::new(0)]), - }, - EvalRecord { - id: 209, - namespace: "stack.arith.u32.mul", - value: QuadFelt::new([Felt::new(10932857720351146657), Felt::new(0)]), - }, - EvalRecord { - id: 210, - namespace: "stack.arith.u32.madd", - value: QuadFelt::new([Felt::new(5677672016010321812), Felt::new(0)]), - }, - EvalRecord { - id: 211, - namespace: "stack.arith.u32.div", - value: QuadFelt::new([Felt::new(40380517428295215), Felt::new(0)]), - }, - EvalRecord { - id: 212, - namespace: "stack.arith.u32.div", - value: QuadFelt::new([Felt::new(15350419499859122435), Felt::new(0)]), - }, - EvalRecord { - id: 213, - namespace: "stack.arith.u32.div", - value: QuadFelt::new([Felt::new(14341334560480736404), Felt::new(0)]), - }, - EvalRecord { - id: 214, - namespace: "stack.arith.u32.assert2", - value: QuadFelt::new([Felt::new(6089961092604608348), Felt::new(0)]), - }, - EvalRecord { - id: 215, - namespace: "stack.arith.u32.assert2", - value: QuadFelt::new([Felt::new(3427128116590576361), Felt::new(0)]), - }, - EvalRecord { - id: 216, - namespace: "decoder.in_span.first_row", - value: QuadFelt::new([Felt::new(14927496178105230921), Felt::new(0)]), - }, - EvalRecord { - id: 217, - namespace: "decoder.in_span.binary", - value: QuadFelt::new([Felt::new(14486244054610710736), Felt::new(0)]), - }, - EvalRecord { - id: 218, - namespace: "decoder.in_span.span", - value: QuadFelt::new([Felt::new(466300909996410452), Felt::new(0)]), - }, - EvalRecord { - id: 219, - namespace: "decoder.in_span.respan", - value: QuadFelt::new([Felt::new(3338971954421326066), Felt::new(0)]), - }, - EvalRecord { - id: 220, - namespace: "decoder.op_bits.b0.binary", - value: QuadFelt::new([Felt::new(13628791071868321124), Felt::new(0)]), - }, - EvalRecord { - id: 221, - namespace: "decoder.op_bits.b1.binary", - value: QuadFelt::new([Felt::new(2117480814916000258), Felt::new(0)]), - }, - EvalRecord { - id: 222, - namespace: "decoder.op_bits.b2.binary", - value: QuadFelt::new([Felt::new(16926933246570374887), Felt::new(0)]), - }, - EvalRecord { - id: 223, - namespace: "decoder.op_bits.b3.binary", - value: QuadFelt::new([Felt::new(9176310969543325496), Felt::new(0)]), - }, - EvalRecord { - id: 224, - namespace: "decoder.op_bits.b4.binary", - value: QuadFelt::new([Felt::new(7537316481676351991), Felt::new(0)]), - }, - EvalRecord { - id: 225, - namespace: "decoder.op_bits.b5.binary", - value: QuadFelt::new([Felt::new(2144456409708417452), Felt::new(0)]), - }, - EvalRecord { - id: 226, - namespace: "decoder.op_bits.b6.binary", - value: QuadFelt::new([Felt::new(4533994350960751386), Felt::new(0)]), - }, - EvalRecord { - id: 227, - namespace: "decoder.extra.e0", - value: QuadFelt::new([Felt::new(8133745730975361882), Felt::new(0)]), - }, - EvalRecord { - id: 228, - namespace: "decoder.extra.e1", - value: QuadFelt::new([Felt::new(1382945310839592478), Felt::new(0)]), - }, - EvalRecord { - id: 229, - namespace: "decoder.op_bits.u32_prefix.b0", - value: QuadFelt::new([Felt::new(3295186688501169293), Felt::new(0)]), - }, - EvalRecord { - id: 230, - namespace: "decoder.op_bits.very_high.b0", - value: QuadFelt::new([Felt::new(1492924210658182178), Felt::new(0)]), - }, - EvalRecord { - id: 231, - namespace: "decoder.op_bits.very_high.b1", - value: QuadFelt::new([Felt::new(11514104647859742926), Felt::new(0)]), - }, - EvalRecord { - id: 232, - namespace: "decoder.batch_flags.c0.binary", - value: QuadFelt::new([Felt::new(5362129305222679805), Felt::new(0)]), - }, - EvalRecord { - id: 233, - namespace: "decoder.batch_flags.c1.binary", - value: QuadFelt::new([Felt::new(7857195453682114326), Felt::new(0)]), - }, - EvalRecord { - id: 234, - namespace: "decoder.batch_flags.c2.binary", - value: QuadFelt::new([Felt::new(7691051559149421836), Felt::new(0)]), - }, - EvalRecord { - id: 235, - namespace: "decoder.general.split_loop.s0.binary", - value: QuadFelt::new([Felt::new(14496120396244092127), Felt::new(0)]), - }, - EvalRecord { - id: 236, - namespace: "decoder.general.dyn.h4.zero", - value: QuadFelt::new([Felt::new(1277805081675897337), Felt::new(0)]), - }, - EvalRecord { - id: 237, - namespace: "decoder.general.dyn.h5.zero", - value: QuadFelt::new([Felt::new(4194588350245381799), Felt::new(0)]), - }, - EvalRecord { - id: 238, - namespace: "decoder.general.dyn.h6.zero", - value: QuadFelt::new([Felt::new(16022182314963541978), Felt::new(0)]), - }, - EvalRecord { - id: 239, - namespace: "decoder.general.dyn.h7.zero", - value: QuadFelt::new([Felt::new(8836314757936512908), Felt::new(0)]), - }, - EvalRecord { - id: 240, - namespace: "decoder.general.repeat.s0.one", - value: QuadFelt::new([Felt::new(12665553195229242113), Felt::new(0)]), - }, - EvalRecord { - id: 241, - namespace: "decoder.general.repeat.h4.one", - value: QuadFelt::new([Felt::new(7110671376227656729), Felt::new(0)]), - }, - EvalRecord { - id: 242, - namespace: "decoder.general.end.loop.s0.zero", - value: QuadFelt::new([Felt::new(17349561739015487668), Felt::new(0)]), - }, - EvalRecord { - id: 243, - namespace: "decoder.general.end_repeat.h0.carry", - value: QuadFelt::new([Felt::new(14675084366068366020), Felt::new(0)]), - }, - EvalRecord { - id: 244, - namespace: "decoder.general.end_repeat.h1.carry", - value: QuadFelt::new([Felt::new(7206936627190077403), Felt::new(0)]), - }, - EvalRecord { - id: 245, - namespace: "decoder.general.end_repeat.h2.carry", - value: QuadFelt::new([Felt::new(6718740807857903289), Felt::new(0)]), - }, - EvalRecord { - id: 246, - namespace: "decoder.general.end_repeat.h3.carry", - value: QuadFelt::new([Felt::new(17516850364483319430), Felt::new(0)]), - }, - EvalRecord { - id: 247, - namespace: "decoder.general.end_repeat.h4.carry", - value: QuadFelt::new([Felt::new(6539200550348860466), Felt::new(0)]), - }, - EvalRecord { - id: 248, - namespace: "decoder.general.halt.next", - value: QuadFelt::new([Felt::new(46417891308149319), Felt::new(0)]), - }, - EvalRecord { - id: 249, - namespace: "decoder.group_count.delta.binary", - value: QuadFelt::new([Felt::new(14515312709656548917), Felt::new(0)]), - }, - EvalRecord { - id: 250, - namespace: "decoder.group_count.decrement.h0_or_imm", - value: QuadFelt::new([Felt::new(13182337539042779943), Felt::new(0)]), - }, - EvalRecord { - id: 251, - namespace: "decoder.group_count.span_decrement", - value: QuadFelt::new([Felt::new(6058211846758132294), Felt::new(0)]), - }, - EvalRecord { - id: 252, - namespace: "decoder.group_count.end_or_respan.hold", - value: QuadFelt::new([Felt::new(11052268645110095431), Felt::new(0)]), - }, - EvalRecord { - id: 253, - namespace: "decoder.group_count.end.zero", - value: QuadFelt::new([Felt::new(8085923270334721350), Felt::new(0)]), - }, - EvalRecord { - id: 254, - namespace: "decoder.op_group.shift", - value: QuadFelt::new([Felt::new(1312737539633457020), Felt::new(0)]), - }, - EvalRecord { - id: 255, - namespace: "decoder.op_group.end_or_respan.h0.zero", - value: QuadFelt::new([Felt::new(12951763225475877068), Felt::new(0)]), - }, - EvalRecord { - id: 256, - namespace: "decoder.op_index.span_respan.reset", - value: QuadFelt::new([Felt::new(10573491584444022281), Felt::new(0)]), - }, - EvalRecord { - id: 257, - namespace: "decoder.op_index.new_group.reset", - value: QuadFelt::new([Felt::new(6175768744156945971), Felt::new(0)]), - }, - EvalRecord { - id: 258, - namespace: "decoder.op_index.increment", - value: QuadFelt::new([Felt::new(11099022161747498050), Felt::new(0)]), - }, - EvalRecord { - id: 259, - namespace: "decoder.op_index.range", - value: QuadFelt::new([Felt::new(10884671635123915786), Felt::new(0)]), - }, - EvalRecord { - id: 260, - namespace: "decoder.batch_flags.span_sum", - value: QuadFelt::new([Felt::new(3694838697400308733), Felt::new(0)]), - }, - EvalRecord { - id: 261, - namespace: "decoder.batch_flags.zero_when_not_span", - value: QuadFelt::new([Felt::new(3630764990867231714), Felt::new(0)]), - }, - EvalRecord { - id: 262, - namespace: "decoder.batch_flags.h4.zero", - value: QuadFelt::new([Felt::new(2244382601531916648), Felt::new(0)]), - }, - EvalRecord { - id: 263, - namespace: "decoder.batch_flags.h5.zero", - value: QuadFelt::new([Felt::new(15434877991581266285), Felt::new(0)]), - }, - EvalRecord { - id: 264, - namespace: "decoder.batch_flags.h6.zero", - value: QuadFelt::new([Felt::new(7419023179375721027), Felt::new(0)]), - }, - EvalRecord { - id: 265, - namespace: "decoder.batch_flags.h7.zero", - value: QuadFelt::new([Felt::new(7459745966287177285), Felt::new(0)]), - }, - EvalRecord { - id: 266, - namespace: "decoder.batch_flags.h2.zero", - value: QuadFelt::new([Felt::new(11698744832781440772), Felt::new(0)]), - }, - EvalRecord { - id: 267, - namespace: "decoder.batch_flags.h3.zero", - value: QuadFelt::new([Felt::new(8586259512688079232), Felt::new(0)]), - }, - EvalRecord { - id: 268, - namespace: "decoder.batch_flags.h1.zero", - value: QuadFelt::new([Felt::new(7969602088154595265), Felt::new(0)]), - }, - EvalRecord { - id: 269, - namespace: "decoder.addr.hold_in_span", - value: QuadFelt::new([Felt::new(5569758276797826136), Felt::new(0)]), - }, - EvalRecord { - id: 270, - namespace: "decoder.addr.respan.increment", - value: QuadFelt::new([Felt::new(7010123233147094271), Felt::new(0)]), - }, - EvalRecord { - id: 271, - namespace: "decoder.addr.halt.zero", - value: QuadFelt::new([Felt::new(571992094937652912), Felt::new(0)]), - }, - EvalRecord { - id: 272, - namespace: "decoder.control_flow.sp_complement", - value: QuadFelt::new([Felt::new(2368373158779190039), Felt::new(0)]), - }, - EvalRecord { - id: 273, - namespace: "chiplets.selectors.s0.binary", - value: QuadFelt::new([Felt::new(13339369523717109295), Felt::new(0)]), - }, - EvalRecord { - id: 274, - namespace: "chiplets.selectors.s1.binary", - value: QuadFelt::new([Felt::new(5399081030326323264), Felt::new(0)]), - }, - EvalRecord { - id: 275, - namespace: "chiplets.selectors.s2.binary", - value: QuadFelt::new([Felt::new(12423271937388024622), Felt::new(0)]), - }, - EvalRecord { - id: 276, - namespace: "chiplets.selectors.s3.binary", - value: QuadFelt::new([Felt::new(6104289749728022881), Felt::new(0)]), - }, - EvalRecord { - id: 277, - namespace: "chiplets.selectors.s4.binary", - value: QuadFelt::new([Felt::new(1241452016395320053), Felt::new(0)]), - }, - EvalRecord { - id: 278, - namespace: "chiplets.selectors.s0.stability", - value: QuadFelt::new([Felt::new(14729701512419667041), Felt::new(0)]), - }, - EvalRecord { - id: 279, - namespace: "chiplets.selectors.s1.stability", - value: QuadFelt::new([Felt::new(8909164618174988456), Felt::new(0)]), - }, - EvalRecord { - id: 280, - namespace: "chiplets.selectors.s2.stability", - value: QuadFelt::new([Felt::new(17247285692427399965), Felt::new(0)]), - }, - EvalRecord { - id: 281, - namespace: "chiplets.selectors.s3.stability", - value: QuadFelt::new([Felt::new(18202363660063267394), Felt::new(0)]), - }, - EvalRecord { - id: 282, - namespace: "chiplets.selectors.s4.stability", - value: QuadFelt::new([Felt::new(6610185862666795331), Felt::new(0)]), - }, - EvalRecord { - id: 283, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(4099164774137728313), Felt::new(0)]), - }, - EvalRecord { - id: 284, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(14454658395404025559), Felt::new(0)]), - }, - EvalRecord { - id: 285, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(14045750606291612344), Felt::new(0)]), - }, - EvalRecord { - id: 286, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(4962577616206122596), Felt::new(0)]), - }, - EvalRecord { - id: 287, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(17693281290536116739), Felt::new(0)]), - }, - EvalRecord { - id: 288, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(2566307954601069485), Felt::new(0)]), - }, - EvalRecord { - id: 289, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(7014825251917345868), Felt::new(0)]), - }, - EvalRecord { - id: 290, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(12643485402937350728), Felt::new(0)]), - }, - EvalRecord { - id: 291, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(13773518984372045426), Felt::new(0)]), - }, - EvalRecord { - id: 292, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(12725128195760136818), Felt::new(0)]), - }, - EvalRecord { - id: 293, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(12789485480014529422), Felt::new(0)]), - }, - EvalRecord { - id: 294, - namespace: "chiplets.hasher.permutation.init", - value: QuadFelt::new([Felt::new(2064555680622899263), Felt::new(0)]), - }, - EvalRecord { - id: 295, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(14965667877036435255), Felt::new(0)]), - }, - EvalRecord { - id: 296, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(8649163745447702544), Felt::new(0)]), - }, - EvalRecord { - id: 297, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(1871614405591673138), Felt::new(0)]), - }, - EvalRecord { - id: 298, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(3904379054162154278), Felt::new(0)]), - }, - EvalRecord { - id: 299, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(14269032524621289009), Felt::new(0)]), - }, - EvalRecord { - id: 300, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(819271014970897034), Felt::new(0)]), - }, - EvalRecord { - id: 301, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(7445347300254257143), Felt::new(0)]), - }, - EvalRecord { - id: 302, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(18264241495848405505), Felt::new(0)]), - }, - EvalRecord { - id: 303, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(4022419953426403986), Felt::new(0)]), - }, - EvalRecord { - id: 304, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(16556927457681327599), Felt::new(0)]), - }, - EvalRecord { - id: 305, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(7630095839895141032), Felt::new(0)]), - }, - EvalRecord { - id: 306, - namespace: "chiplets.hasher.permutation.external", - value: QuadFelt::new([Felt::new(17073915086247210099), Felt::new(0)]), - }, - EvalRecord { - id: 307, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(12354414453280530108), Felt::new(0)]), - }, - EvalRecord { - id: 308, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(15162996181146864722), Felt::new(0)]), - }, - EvalRecord { - id: 309, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(3799802584325483032), Felt::new(0)]), - }, - EvalRecord { - id: 310, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(7503666179952416559), Felt::new(0)]), - }, - EvalRecord { - id: 311, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(5195105242383400264), Felt::new(0)]), - }, - EvalRecord { - id: 312, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(2672184473444251603), Felt::new(0)]), - }, - EvalRecord { - id: 313, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(1545887997090789749), Felt::new(0)]), - }, - EvalRecord { - id: 314, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(212978569305465235), Felt::new(0)]), - }, - EvalRecord { - id: 315, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(7828622218965306157), Felt::new(0)]), - }, - EvalRecord { - id: 316, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(15313472288808367905), Felt::new(0)]), - }, - EvalRecord { - id: 317, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(1544567903496578828), Felt::new(0)]), - }, - EvalRecord { - id: 318, - namespace: "chiplets.hasher.permutation.internal", - value: QuadFelt::new([Felt::new(6950222684787745222), Felt::new(0)]), - }, - EvalRecord { - id: 319, - namespace: "chiplets.hasher.selectors.binary", - value: QuadFelt::new([Felt::new(17059167507535516774), Felt::new(0)]), - }, - EvalRecord { - id: 320, - namespace: "chiplets.hasher.selectors.binary", - value: QuadFelt::new([Felt::new(2543200120204459519), Felt::new(0)]), - }, - EvalRecord { - id: 321, - namespace: "chiplets.hasher.selectors.binary", - value: QuadFelt::new([Felt::new(17534396985644786691), Felt::new(0)]), - }, - EvalRecord { - id: 322, - namespace: "chiplets.hasher.selectors.stability", - value: QuadFelt::new([Felt::new(6479352521221779748), Felt::new(0)]), - }, - EvalRecord { - id: 323, - namespace: "chiplets.hasher.selectors.stability", - value: QuadFelt::new([Felt::new(210512107158412246), Felt::new(0)]), - }, - EvalRecord { - id: 324, - namespace: "chiplets.hasher.selectors.continuation", - value: QuadFelt::new([Felt::new(15715623607701353500), Felt::new(0)]), - }, - EvalRecord { - id: 325, - namespace: "chiplets.hasher.selectors.invalid", - value: QuadFelt::new([Felt::new(13405975868755856198), Felt::new(0)]), - }, - EvalRecord { - id: 326, - namespace: "chiplets.hasher.abp.capacity", - value: QuadFelt::new([Felt::new(1899048554833837921), Felt::new(0)]), - }, - EvalRecord { - id: 327, - namespace: "chiplets.hasher.abp.capacity", - value: QuadFelt::new([Felt::new(12437244811220538952), Felt::new(0)]), - }, - EvalRecord { - id: 328, - namespace: "chiplets.hasher.abp.capacity", - value: QuadFelt::new([Felt::new(10139411892992277524), Felt::new(0)]), - }, - EvalRecord { - id: 329, - namespace: "chiplets.hasher.abp.capacity", - value: QuadFelt::new([Felt::new(15737189571305100043), Felt::new(0)]), - }, - EvalRecord { - id: 330, - namespace: "chiplets.hasher.output.index", - value: QuadFelt::new([Felt::new(16881983815653283540), Felt::new(0)]), - }, - EvalRecord { - id: 331, - namespace: "chiplets.hasher.merkle.index.binary", - value: QuadFelt::new([Felt::new(13143318647927561805), Felt::new(0)]), - }, - EvalRecord { - id: 332, - namespace: "chiplets.hasher.merkle.index.stability", - value: QuadFelt::new([Felt::new(13941205471766075471), Felt::new(0)]), - }, - EvalRecord { - id: 333, - namespace: "chiplets.hasher.merkle.capacity", - value: QuadFelt::new([Felt::new(5486621160745001548), Felt::new(0)]), - }, - EvalRecord { - id: 334, - namespace: "chiplets.hasher.merkle.capacity", - value: QuadFelt::new([Felt::new(15134096900702524735), Felt::new(0)]), - }, - EvalRecord { - id: 335, - namespace: "chiplets.hasher.merkle.capacity", - value: QuadFelt::new([Felt::new(17576701782509621064), Felt::new(0)]), - }, - EvalRecord { - id: 336, - namespace: "chiplets.hasher.merkle.capacity", - value: QuadFelt::new([Felt::new(14561117990313963177), Felt::new(0)]), - }, - EvalRecord { - id: 337, - namespace: "chiplets.hasher.merkle.digest.rate0", - value: QuadFelt::new([Felt::new(8725087617587926550), Felt::new(0)]), - }, - EvalRecord { - id: 338, - namespace: "chiplets.hasher.merkle.digest.rate0", - value: QuadFelt::new([Felt::new(12515088494833138961), Felt::new(0)]), - }, - EvalRecord { - id: 339, - namespace: "chiplets.hasher.merkle.digest.rate0", - value: QuadFelt::new([Felt::new(6965398204541535664), Felt::new(0)]), - }, - EvalRecord { - id: 340, - namespace: "chiplets.hasher.merkle.digest.rate0", - value: QuadFelt::new([Felt::new(11433229023120737569), Felt::new(0)]), - }, - EvalRecord { - id: 341, - namespace: "chiplets.hasher.merkle.digest.rate1", - value: QuadFelt::new([Felt::new(4884394573065500633), Felt::new(0)]), - }, - EvalRecord { - id: 342, - namespace: "chiplets.hasher.merkle.digest.rate1", - value: QuadFelt::new([Felt::new(16805257998005939804), Felt::new(0)]), - }, - EvalRecord { - id: 343, - namespace: "chiplets.hasher.merkle.digest.rate1", - value: QuadFelt::new([Felt::new(55029178798193706), Felt::new(0)]), - }, - EvalRecord { - id: 344, - namespace: "chiplets.hasher.merkle.digest.rate1", - value: QuadFelt::new([Felt::new(17219870521967201546), Felt::new(0)]), - }, - EvalRecord { - id: 345, - namespace: "chiplets.bitwise.op.binary", - value: QuadFelt::new([Felt::new(15474882094825938582), Felt::new(0)]), - }, - EvalRecord { - id: 346, - namespace: "chiplets.bitwise.op.stability", - value: QuadFelt::new([Felt::new(654157308496499224), Felt::new(0)]), - }, - EvalRecord { - id: 347, - namespace: "chiplets.bitwise.a_bits.binary", - value: QuadFelt::new([Felt::new(1034651076143976640), Felt::new(0)]), - }, - EvalRecord { - id: 348, - namespace: "chiplets.bitwise.a_bits.binary", - value: QuadFelt::new([Felt::new(4003142075320695647), Felt::new(0)]), - }, - EvalRecord { - id: 349, - namespace: "chiplets.bitwise.a_bits.binary", - value: QuadFelt::new([Felt::new(303909215511455897), Felt::new(0)]), - }, - EvalRecord { - id: 350, - namespace: "chiplets.bitwise.a_bits.binary", - value: QuadFelt::new([Felt::new(5362728732691526694), Felt::new(0)]), - }, - EvalRecord { - id: 351, - namespace: "chiplets.bitwise.b_bits.binary", - value: QuadFelt::new([Felt::new(11650758097842027858), Felt::new(0)]), - }, - EvalRecord { - id: 352, - namespace: "chiplets.bitwise.b_bits.binary", - value: QuadFelt::new([Felt::new(7007196355931725843), Felt::new(0)]), - }, - EvalRecord { - id: 353, - namespace: "chiplets.bitwise.b_bits.binary", - value: QuadFelt::new([Felt::new(11561896106611918266), Felt::new(0)]), - }, - EvalRecord { - id: 354, - namespace: "chiplets.bitwise.b_bits.binary", - value: QuadFelt::new([Felt::new(4060803575635852640), Felt::new(0)]), - }, - EvalRecord { - id: 355, - namespace: "chiplets.bitwise.first_row", - value: QuadFelt::new([Felt::new(14840226897639012209), Felt::new(0)]), - }, - EvalRecord { - id: 356, - namespace: "chiplets.bitwise.first_row", - value: QuadFelt::new([Felt::new(15513879563001185502), Felt::new(0)]), - }, - EvalRecord { - id: 357, - namespace: "chiplets.bitwise.first_row", - value: QuadFelt::new([Felt::new(5652235828559265944), Felt::new(0)]), - }, - EvalRecord { - id: 358, - namespace: "chiplets.bitwise.input.transition", - value: QuadFelt::new([Felt::new(12380774213272670463), Felt::new(0)]), - }, - EvalRecord { - id: 359, - namespace: "chiplets.bitwise.input.transition", - value: QuadFelt::new([Felt::new(7940993120185857575), Felt::new(0)]), - }, - EvalRecord { - id: 360, - namespace: "chiplets.bitwise.output.prev", - value: QuadFelt::new([Felt::new(7984380758996607942), Felt::new(0)]), - }, - EvalRecord { - id: 361, - namespace: "chiplets.bitwise.output.aggregate", - value: QuadFelt::new([Felt::new(11338003127856250266), Felt::new(0)]), - }, - EvalRecord { - id: 362, - namespace: "chiplets.memory.binary", - value: QuadFelt::new([Felt::new(6518050416979602887), Felt::new(0)]), - }, - EvalRecord { - id: 363, - namespace: "chiplets.memory.binary", - value: QuadFelt::new([Felt::new(5143376107998730535), Felt::new(0)]), - }, - EvalRecord { - id: 364, - namespace: "chiplets.memory.binary", - value: QuadFelt::new([Felt::new(1931814968789928617), Felt::new(0)]), - }, - EvalRecord { - id: 365, - namespace: "chiplets.memory.binary", - value: QuadFelt::new([Felt::new(15470079227779320896), Felt::new(0)]), - }, - EvalRecord { - id: 366, - namespace: "chiplets.memory.word_idx.zero", - value: QuadFelt::new([Felt::new(15459815149111314868), Felt::new(0)]), - }, - EvalRecord { - id: 367, - namespace: "chiplets.memory.word_idx.zero", - value: QuadFelt::new([Felt::new(15800347411094406640), Felt::new(0)]), - }, - EvalRecord { - id: 368, - namespace: "chiplets.memory.first_row.zero", - value: QuadFelt::new([Felt::new(16535341688150290637), Felt::new(0)]), - }, - EvalRecord { - id: 369, - namespace: "chiplets.memory.first_row.zero", - value: QuadFelt::new([Felt::new(10335801429662869046), Felt::new(0)]), - }, - EvalRecord { - id: 370, - namespace: "chiplets.memory.first_row.zero", - value: QuadFelt::new([Felt::new(17069212044771710732), Felt::new(0)]), - }, - EvalRecord { - id: 371, - namespace: "chiplets.memory.first_row.zero", - value: QuadFelt::new([Felt::new(2325691270454543127), Felt::new(0)]), - }, - EvalRecord { - id: 372, - namespace: "chiplets.memory.delta.inv", - value: QuadFelt::new([Felt::new(3175424288859001789), Felt::new(0)]), - }, - EvalRecord { - id: 373, - namespace: "chiplets.memory.delta.inv", - value: QuadFelt::new([Felt::new(2653406619128719065), Felt::new(0)]), - }, - EvalRecord { - id: 374, - namespace: "chiplets.memory.delta.inv", - value: QuadFelt::new([Felt::new(17858142172042463544), Felt::new(0)]), - }, - EvalRecord { - id: 375, - namespace: "chiplets.memory.delta.inv", - value: QuadFelt::new([Felt::new(6206863499132972446), Felt::new(0)]), - }, - EvalRecord { - id: 376, - namespace: "chiplets.memory.delta.transition", - value: QuadFelt::new([Felt::new(5078351230126014060), Felt::new(0)]), - }, - EvalRecord { - id: 377, - namespace: "chiplets.memory.scw.flag", - value: QuadFelt::new([Felt::new(18433800756547531428), Felt::new(0)]), - }, - EvalRecord { - id: 378, - namespace: "chiplets.memory.scw.reads", - value: QuadFelt::new([Felt::new(1473872865192822987), Felt::new(0)]), - }, - EvalRecord { - id: 379, - namespace: "chiplets.memory.value.consistency", - value: QuadFelt::new([Felt::new(11685142466069024125), Felt::new(0)]), - }, - EvalRecord { - id: 380, - namespace: "chiplets.memory.value.consistency", - value: QuadFelt::new([Felt::new(15197055428524072106), Felt::new(0)]), - }, - EvalRecord { - id: 381, - namespace: "chiplets.memory.value.consistency", - value: QuadFelt::new([Felt::new(14617718835619740558), Felt::new(0)]), - }, - EvalRecord { - id: 382, - namespace: "chiplets.memory.value.consistency", - value: QuadFelt::new([Felt::new(12293856690108503135), Felt::new(0)]), - }, - EvalRecord { - id: 383, - namespace: "chiplets.ace.selector.binary", - value: QuadFelt::new([Felt::new(2923257613600653893), Felt::new(0)]), - }, - EvalRecord { - id: 384, - namespace: "chiplets.ace.selector.binary", - value: QuadFelt::new([Felt::new(4182752542556273997), Felt::new(0)]), - }, - EvalRecord { - id: 385, - namespace: "chiplets.ace.section.flags", - value: QuadFelt::new([Felt::new(6988234832692930146), Felt::new(0)]), - }, - EvalRecord { - id: 386, - namespace: "chiplets.ace.section.flags", - value: QuadFelt::new([Felt::new(835405595669725766), Felt::new(0)]), - }, - EvalRecord { - id: 387, - namespace: "chiplets.ace.section.flags", - value: QuadFelt::new([Felt::new(17586531527103856415), Felt::new(0)]), - }, - EvalRecord { - id: 388, - namespace: "chiplets.ace.section.flags", - value: QuadFelt::new([Felt::new(17554338302334456122), Felt::new(0)]), - }, - EvalRecord { - id: 389, - namespace: "chiplets.ace.section.flags", - value: QuadFelt::new([Felt::new(7430977299237244825), Felt::new(0)]), - }, - EvalRecord { - id: 390, - namespace: "chiplets.ace.section.transition", - value: QuadFelt::new([Felt::new(9634147153406944231), Felt::new(0)]), - }, - EvalRecord { - id: 391, - namespace: "chiplets.ace.section.transition", - value: QuadFelt::new([Felt::new(3218972305890399047), Felt::new(0)]), - }, - EvalRecord { - id: 392, - namespace: "chiplets.ace.section.transition", - value: QuadFelt::new([Felt::new(13940329983080013930), Felt::new(0)]), - }, - EvalRecord { - id: 393, - namespace: "chiplets.ace.section.transition", - value: QuadFelt::new([Felt::new(10279516906957804027), Felt::new(0)]), - }, - EvalRecord { - id: 394, - namespace: "chiplets.ace.read.ids", - value: QuadFelt::new([Felt::new(12585176929173957399), Felt::new(0)]), - }, - EvalRecord { - id: 395, - namespace: "chiplets.ace.read.to_eval", - value: QuadFelt::new([Felt::new(30354383937781757), Felt::new(0)]), - }, - EvalRecord { - id: 396, - namespace: "chiplets.ace.eval.op", - value: QuadFelt::new([Felt::new(12481984196006840571), Felt::new(0)]), - }, - EvalRecord { - id: 397, - namespace: "chiplets.ace.eval.result", - value: QuadFelt::new([Felt::new(10009759308289170950), Felt::new(0)]), - }, - EvalRecord { - id: 398, - namespace: "chiplets.ace.eval.result", - value: QuadFelt::new([Felt::new(9663557940632289707), Felt::new(0)]), - }, - EvalRecord { - id: 399, - namespace: "chiplets.ace.final.zero", - value: QuadFelt::new([Felt::new(13957751954200526468), Felt::new(0)]), - }, - EvalRecord { - id: 400, - namespace: "chiplets.ace.final.zero", - value: QuadFelt::new([Felt::new(13589615335587828352), Felt::new(0)]), - }, - EvalRecord { - id: 401, - namespace: "chiplets.ace.final.zero", - value: QuadFelt::new([Felt::new(6818409555600730615), Felt::new(0)]), - }, - EvalRecord { - id: 402, - namespace: "chiplets.ace.first_row.start", - value: QuadFelt::new([Felt::new(613969461051885369), Felt::new(0)]), - }, - EvalRecord { - id: 403, - namespace: "chiplets.kernel_rom.sfirst.binary", - value: QuadFelt::new([Felt::new(9960038227923904827), Felt::new(0)]), - }, - EvalRecord { - id: 404, - namespace: "chiplets.kernel_rom.digest.contiguity", - value: QuadFelt::new([Felt::new(12113043600978981430), Felt::new(0)]), - }, - EvalRecord { - id: 405, - namespace: "chiplets.kernel_rom.digest.contiguity", - value: QuadFelt::new([Felt::new(15559322172686928295), Felt::new(0)]), - }, - EvalRecord { - id: 406, - namespace: "chiplets.kernel_rom.digest.contiguity", - value: QuadFelt::new([Felt::new(12593211604980696045), Felt::new(0)]), - }, - EvalRecord { - id: 407, - namespace: "chiplets.kernel_rom.digest.contiguity", - value: QuadFelt::new([Felt::new(4420066076215265302), Felt::new(0)]), - }, - EvalRecord { - id: 408, - namespace: "chiplets.kernel_rom.first_row.start", - value: QuadFelt::new([Felt::new(3652575802134874675), Felt::new(0)]), - }, - EvalRecord { - id: 409, - namespace: "bus.boundary.first_row", - value: QuadFelt::new([Felt::new(9595061266498737687), Felt::new(12539219129346040916)]), - }, - EvalRecord { - id: 410, - namespace: "bus.boundary.first_row", - value: QuadFelt::new([Felt::new(9906922257952985525), Felt::new(7135908125271346815)]), - }, - EvalRecord { - id: 411, - namespace: "bus.boundary.first_row", - value: QuadFelt::new([ - Felt::new(12010012593361720439), - Felt::new(12696089236309457996), - ]), - }, - EvalRecord { - id: 412, - namespace: "bus.boundary.first_row", - value: QuadFelt::new([Felt::new(15694046535368016026), Felt::new(2643587524945520847)]), - }, - EvalRecord { - id: 413, - namespace: "bus.boundary.first_row", - value: QuadFelt::new([ - Felt::new(14293326901983424168), - Felt::new(17664958916890505700), - ]), - }, - EvalRecord { - id: 414, - namespace: "bus.boundary.first_row", - value: QuadFelt::new([Felt::new(7543823668837069064), Felt::new(1474978857022258416)]), - }, - EvalRecord { - id: 415, - namespace: "bus.boundary.first_row", - value: QuadFelt::new([Felt::new(12608813705579209032), Felt::new(3989096837606726344)]), - }, - EvalRecord { - id: 416, - namespace: "bus.boundary.first_row", - value: QuadFelt::new([Felt::new(9950426725853620663), Felt::new(6907538708340539779)]), - }, - EvalRecord { - id: 417, - namespace: "bus.boundary.last_row", - value: QuadFelt::new([Felt::new(16755949710966147218), Felt::new(3829676215971849169)]), - }, - EvalRecord { - id: 418, - namespace: "bus.boundary.last_row", - value: QuadFelt::new([Felt::new(3258168421295425687), Felt::new(11322075087561196224)]), - }, - EvalRecord { - id: 419, - namespace: "bus.boundary.last_row", - value: QuadFelt::new([Felt::new(7867249080765390980), Felt::new(6932757161403890473)]), - }, - EvalRecord { - id: 420, - namespace: "bus.boundary.last_row", - value: QuadFelt::new([Felt::new(10129458707234267975), Felt::new(5812206347609968155)]), - }, - EvalRecord { - id: 421, - namespace: "bus.boundary.last_row", - value: QuadFelt::new([Felt::new(3253668216479680364), Felt::new(9725218274111543600)]), - }, - EvalRecord { - id: 422, - namespace: "bus.boundary.last_row", - value: QuadFelt::new([ - Felt::new(10901759410743368556), - Felt::new(10824838696757528120), - ]), - }, - EvalRecord { - id: 423, - namespace: "bus.boundary.last_row", - value: QuadFelt::new([ - Felt::new(11130917779834521749), - Felt::new(17051345074679664416), - ]), - }, - EvalRecord { - id: 424, - namespace: "bus.boundary.last_row", - value: QuadFelt::new([Felt::new(5654815015773734620), Felt::new(8487995846868635892)]), - }, - EvalRecord { - id: 425, - namespace: "range.bus.transition", - value: QuadFelt::new([ - Felt::new(10365289165200035540), - Felt::new(16469718665506609592), - ]), - }, - EvalRecord { - id: 426, - namespace: "stack.overflow.bus.transition", - value: QuadFelt::new([Felt::new(7384164985445418427), Felt::new(3858806565449404456)]), - }, - EvalRecord { - id: 427, - namespace: "decoder.bus.p1.transition", - value: QuadFelt::new([ - Felt::new(11611432650982424455), - Felt::new(10377793451000863001), - ]), - }, - EvalRecord { - id: 428, - namespace: "decoder.bus.p2.transition", - value: QuadFelt::new([ - Felt::new(15040597896341508305), - Felt::new(11465419388996005277), - ]), - }, - EvalRecord { - id: 429, - namespace: "decoder.bus.p3.transition", - value: QuadFelt::new([Felt::new(9395869302542898577), Felt::new(6472917827183803848)]), - }, - EvalRecord { - id: 430, - namespace: "chiplets.bus.hash_kernel.transition", - value: QuadFelt::new([Felt::new(4291070431816775519), Felt::new(7576850277917859979)]), - }, - EvalRecord { - id: 431, - namespace: "chiplets.bus.chiplets.transition", - value: QuadFelt::new([Felt::new(7990980974626587792), Felt::new(5675027937982935418)]), - }, - EvalRecord { - id: 432, - namespace: "chiplets.bus.wiring.transition", - value: QuadFelt::new([Felt::new(7613678356270986878), Felt::new(10445474671979834467)]), - }, - EvalRecord { - id: 433, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(15272471560572797098), Felt::new(0)]), - }, - EvalRecord { - id: 434, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(6210121216967517740), Felt::new(0)]), - }, - EvalRecord { - id: 435, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(6183121070077706579), Felt::new(0)]), - }, - EvalRecord { - id: 436, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(9532591940374591279), Felt::new(0)]), - }, - EvalRecord { - id: 437, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(6543026845990824540), Felt::new(0)]), - }, - EvalRecord { - id: 438, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(12968646586941648028), Felt::new(0)]), - }, - EvalRecord { - id: 439, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(15417838146196464330), Felt::new(0)]), - }, - EvalRecord { - id: 440, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(13833104913151358010), Felt::new(0)]), - }, - EvalRecord { - id: 441, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(16618206067970158350), Felt::new(0)]), - }, - EvalRecord { - id: 442, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(4151771141262045661), Felt::new(0)]), - }, - EvalRecord { - id: 443, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(10573320072889417521), Felt::new(0)]), - }, - EvalRecord { - id: 444, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(10186179372804063393), Felt::new(0)]), - }, - EvalRecord { - id: 445, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(4590904619046098580), Felt::new(0)]), - }, - EvalRecord { - id: 446, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(4720108777520454648), Felt::new(0)]), - }, - EvalRecord { - id: 447, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(1104703905961606104), Felt::new(0)]), - }, - EvalRecord { - id: 448, - namespace: "public_inputs.stack_input", - value: QuadFelt::new([Felt::new(4555570289354185559), Felt::new(0)]), - }, - EvalRecord { - id: 449, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(4934304800106382014), Felt::new(0)]), - }, - EvalRecord { - id: 450, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(5378514856609319392), Felt::new(0)]), - }, - EvalRecord { - id: 451, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(17190327489693035335), Felt::new(0)]), - }, - EvalRecord { - id: 452, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(12600879734326452251), Felt::new(0)]), - }, - EvalRecord { - id: 453, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(5557099402378706294), Felt::new(0)]), - }, - EvalRecord { - id: 454, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(13124668006842155196), Felt::new(0)]), - }, - EvalRecord { - id: 455, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(17115224159882577972), Felt::new(0)]), - }, - EvalRecord { - id: 456, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(329687429495640731), Felt::new(0)]), - }, - EvalRecord { - id: 457, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(17291436379366401128), Felt::new(0)]), - }, - EvalRecord { - id: 458, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(6803320890344610422), Felt::new(0)]), - }, - EvalRecord { - id: 459, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(11244089584150196777), Felt::new(0)]), - }, - EvalRecord { - id: 460, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(4009248599872349722), Felt::new(0)]), - }, - EvalRecord { - id: 461, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(16110944964025361102), Felt::new(0)]), - }, - EvalRecord { - id: 462, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(15140047176671544897), Felt::new(0)]), - }, - EvalRecord { - id: 463, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(16756664313597184040), Felt::new(0)]), - }, - EvalRecord { - id: 464, - namespace: "public_inputs.stack_output", - value: QuadFelt::new([Felt::new(2298685071572703448), Felt::new(0)]), - }, - ] -} - -/// Returns the active expected OOD evaluations for the current tagged group. -pub fn active_expected_ood_evals() -> Vec { - current_group_expected() -} diff --git a/air/src/constraints/tagging/ids.rs b/air/src/constraints/tagging/ids.rs deleted file mode 100644 index 4e72b15173..0000000000 --- a/air/src/constraints/tagging/ids.rs +++ /dev/null @@ -1,110 +0,0 @@ -//! Tag group base IDs and sizes. - -/// Base ID for the system constraint group. -pub const TAG_SYSTEM_BASE: usize = 0; -/// Number of system clock constraints. -pub const TAG_SYSTEM_CLK_COUNT: usize = 2; -/// Number of system context constraints. -pub const TAG_SYSTEM_CTX_COUNT: usize = 3; -/// Number of system function-hash constraints. -pub const TAG_SYSTEM_FN_HASH_COUNT: usize = 8; - -/// Base ID for the system clock constraints. -pub const TAG_SYSTEM_CLK_BASE: usize = TAG_SYSTEM_BASE; -/// Base ID for the system context constraints. -pub const TAG_SYSTEM_CTX_BASE: usize = TAG_SYSTEM_CLK_BASE + TAG_SYSTEM_CLK_COUNT; -/// Base ID for the system function-hash constraints. -pub const TAG_SYSTEM_FN_HASH_BASE: usize = TAG_SYSTEM_CTX_BASE + TAG_SYSTEM_CTX_COUNT; - -/// Total number of system constraints in this group. -pub const TAG_SYSTEM_COUNT: usize = - TAG_SYSTEM_CLK_COUNT + TAG_SYSTEM_CTX_COUNT + TAG_SYSTEM_FN_HASH_COUNT; - -/// Base ID for the range checker main constraint group. -pub const TAG_RANGE_MAIN_BASE: usize = TAG_SYSTEM_BASE + TAG_SYSTEM_COUNT; -/// Number of range checker main constraints in this group. -pub const TAG_RANGE_MAIN_COUNT: usize = 3; - -/// Base ID for the stack general constraint group. -pub const TAG_STACK_GENERAL_BASE: usize = TAG_RANGE_MAIN_BASE + TAG_RANGE_MAIN_COUNT; -/// Number of stack general constraints in this group. -pub const TAG_STACK_GENERAL_COUNT: usize = 16; - -/// Base ID for the stack overflow constraint group. -pub const TAG_STACK_OVERFLOW_BASE: usize = TAG_STACK_GENERAL_BASE + TAG_STACK_GENERAL_COUNT; -/// Number of stack overflow constraints in this group. -pub const TAG_STACK_OVERFLOW_COUNT: usize = 8; - -/// Base ID for the stack ops constraint group. -pub const TAG_STACK_OPS_BASE: usize = TAG_STACK_OVERFLOW_BASE + TAG_STACK_OVERFLOW_COUNT; -/// Number of stack ops constraints in this group. -pub const TAG_STACK_OPS_COUNT: usize = 88; - -/// Base ID for the stack crypto constraint group. -pub const TAG_STACK_CRYPTO_BASE: usize = TAG_STACK_OPS_BASE + TAG_STACK_OPS_COUNT; -/// Number of stack crypto constraints in this group. -pub const TAG_STACK_CRYPTO_COUNT: usize = 46; - -/// Base ID for the stack arith/u32 constraint group. -pub const TAG_STACK_ARITH_BASE: usize = TAG_STACK_CRYPTO_BASE + TAG_STACK_CRYPTO_COUNT; -/// Number of stack arith/u32 constraints in this group. -pub const TAG_STACK_ARITH_COUNT: usize = 42; - -/// Base ID for the decoder constraint group. -pub const TAG_DECODER_BASE: usize = TAG_STACK_ARITH_BASE + TAG_STACK_ARITH_COUNT; -/// Number of decoder constraints in this group. -pub const TAG_DECODER_COUNT: usize = 57; - -/// Base ID for the chiplets constraint group. -pub const TAG_CHIPLETS_BASE: usize = TAG_DECODER_BASE + TAG_DECODER_COUNT; -/// Number of chiplets constraints in this group. -pub const TAG_CHIPLETS_COUNT: usize = 136; - -/// Base ID for the bus boundary constraint group. -/// 8 first-row (aux columns pinned to identity) + 8 last-row (aux columns bound to finals) = 16. -pub const TAG_BUS_BOUNDARY_BASE: usize = TAG_CHIPLETS_BASE + TAG_CHIPLETS_COUNT; -pub const TAG_BUS_BOUNDARY_FIRST_ROW_COUNT: usize = 8; -pub const TAG_BUS_BOUNDARY_LAST_ROW_COUNT: usize = 8; -pub const TAG_BUS_BOUNDARY_COUNT: usize = - TAG_BUS_BOUNDARY_FIRST_ROW_COUNT + TAG_BUS_BOUNDARY_LAST_ROW_COUNT; - -/// Base ID for the range bus constraint. -pub const TAG_RANGE_BUS_BASE: usize = TAG_BUS_BOUNDARY_BASE + TAG_BUS_BOUNDARY_COUNT; -/// Number of range bus constraints in this group. -pub const TAG_RANGE_BUS_COUNT: usize = 1; - -/// Base ID for the stack overflow bus constraint group. -pub const TAG_STACK_OVERFLOW_BUS_BASE: usize = TAG_RANGE_BUS_BASE + TAG_RANGE_BUS_COUNT; -/// Number of stack overflow bus constraints in this group. -pub const TAG_STACK_OVERFLOW_BUS_COUNT: usize = 1; - -/// Base ID for the decoder bus constraint group. -pub const TAG_DECODER_BUS_BASE: usize = TAG_STACK_OVERFLOW_BUS_BASE + TAG_STACK_OVERFLOW_BUS_COUNT; -/// Number of decoder bus constraints in this group. -pub const TAG_DECODER_BUS_COUNT: usize = 3; - -/// Base ID for the hash-kernel bus constraint. -pub const TAG_HASH_KERNEL_BUS_BASE: usize = TAG_DECODER_BUS_BASE + TAG_DECODER_BUS_COUNT; -/// Number of hash-kernel bus constraints in this group. -pub const TAG_HASH_KERNEL_BUS_COUNT: usize = 1; - -/// Base ID for the chiplets bus constraint. -pub const TAG_CHIPLETS_BUS_BASE: usize = TAG_HASH_KERNEL_BUS_BASE + TAG_HASH_KERNEL_BUS_COUNT; -/// Number of chiplets bus constraints in this group. -pub const TAG_CHIPLETS_BUS_COUNT: usize = 1; - -/// Base ID for the wiring bus constraint. -pub const TAG_WIRING_BUS_BASE: usize = TAG_CHIPLETS_BUS_BASE + TAG_CHIPLETS_BUS_COUNT; -/// Number of wiring bus constraints in this group. -pub const TAG_WIRING_BUS_COUNT: usize = 1; - -/// Base ID for the public inputs boundary constraint group. -pub const TAG_PUBLIC_INPUTS_BASE: usize = TAG_WIRING_BUS_BASE + TAG_WIRING_BUS_COUNT; -/// Number of public input boundary constraints. -/// 16 stack input first-row + 16 stack output last-row = 32. -#[cfg(all(test, feature = "std"))] -pub const TAG_PUBLIC_INPUTS_COUNT: usize = 32; - -/// Total number of tagged constraints in the current group set. -#[cfg(all(test, feature = "std"))] -pub const TAG_TOTAL_COUNT: usize = TAG_PUBLIC_INPUTS_BASE + TAG_PUBLIC_INPUTS_COUNT; diff --git a/air/src/constraints/tagging/mod.rs b/air/src/constraints/tagging/mod.rs deleted file mode 100644 index b1f55e70e5..0000000000 --- a/air/src/constraints/tagging/mod.rs +++ /dev/null @@ -1,112 +0,0 @@ -//! Constraint tagging helpers for stable numeric IDs. -//! -//! This module dispatches to the full tagging implementation in test/`testing` builds -//! and a no-op fallback in production/no-std builds. - -use miden_crypto::stark::air::{AirBuilder, ExtensionBuilder}; - -pub mod ids; - -#[cfg(all(any(test, feature = "testing"), feature = "std"))] -mod enabled; -#[cfg(not(all(any(test, feature = "testing"), feature = "std")))] -mod fallback; - -#[cfg(all(test, feature = "std"))] -mod fixtures; -#[cfg(all(test, feature = "std"))] -mod ood_eval; -#[cfg(all(any(test, feature = "testing"), feature = "std"))] -mod state; - -#[cfg(all(any(test, feature = "testing"), feature = "std"))] -pub use enabled::*; -#[cfg(not(all(any(test, feature = "testing"), feature = "std")))] -pub use fallback::*; - -/// Tag metadata for a constraint group (base ID + ordered names). -#[derive(Clone, Copy)] -pub struct TagGroup { - pub base: usize, - pub names: &'static [&'static str], -} - -/// Tag and assert a single constraint, advancing the per-group index. -pub fn tagged_assert_zero( - builder: &mut AB, - group: &TagGroup, - idx: &mut usize, - expr: AB::Expr, -) { - debug_assert!(*idx < group.names.len(), "tag index out of bounds"); - let id = group.base + *idx; - let name = group.names[*idx]; - builder.tagged(id, name, |builder| { - builder.when_transition().assert_zero(expr); - }); - *idx += 1; -} - -/// Tag and assert a single integrity constraint, advancing the per-group index. -pub fn tagged_assert_zero_integrity( - builder: &mut AB, - group: &TagGroup, - idx: &mut usize, - expr: AB::Expr, -) { - debug_assert!(*idx < group.names.len(), "tag index out of bounds"); - let id = group.base + *idx; - let name = group.names[*idx]; - builder.tagged(id, name, |builder| { - builder.assert_zero(expr); - }); - *idx += 1; -} - -/// Tag and assert a fixed list of constraints, advancing the per-group index. -pub fn tagged_assert_zeros( - builder: &mut AB, - group: &TagGroup, - idx: &mut usize, - namespace: &'static str, - exprs: [AB::Expr; N], -) { - debug_assert!(*idx + N <= group.names.len(), "tag index out of bounds"); - let ids: [usize; N] = core::array::from_fn(|i| group.base + *idx + i); - builder.tagged_list(ids, namespace, |builder| { - builder.when_transition().assert_zeros(exprs); - }); - *idx += N; -} - -/// Tag and assert a fixed list of integrity constraints, advancing the per-group index. -pub fn tagged_assert_zeros_integrity( - builder: &mut AB, - group: &TagGroup, - idx: &mut usize, - namespace: &'static str, - exprs: [AB::Expr; N], -) { - debug_assert!(*idx + N <= group.names.len(), "tag index out of bounds"); - let ids: [usize; N] = core::array::from_fn(|i| group.base + *idx + i); - builder.tagged_list(ids, namespace, |builder| { - builder.assert_zeros(exprs); - }); - *idx += N; -} - -/// Tag and assert a single extension-field constraint, advancing the per-group index. -pub fn tagged_assert_zero_ext( - builder: &mut AB, - group: &TagGroup, - idx: &mut usize, - expr: AB::ExprEF, -) { - debug_assert!(*idx < group.names.len(), "tag index out of bounds"); - let id = group.base + *idx; - let name = group.names[*idx]; - builder.tagged(id, name, |builder| { - builder.when_transition().assert_zero_ext(expr); - }); - *idx += 1; -} diff --git a/air/src/constraints/tagging/ood_eval.rs b/air/src/constraints/tagging/ood_eval.rs deleted file mode 100644 index d325539bdf..0000000000 --- a/air/src/constraints/tagging/ood_eval.rs +++ /dev/null @@ -1,289 +0,0 @@ -//! OOD evaluation helper for tagged constraint parity tests. - -use alloc::vec::Vec; - -use miden_core::{Felt, field::QuadFelt}; -use miden_crypto::stark::{ - air::{AirBuilder, EmptyWindow, ExtensionBuilder, PeriodicAirBuilder, PermutationAirBuilder}, - matrix::RowMajorMatrix, -}; - -use super::state; -use crate::constraints::{chiplets::bitwise, tagging::ids::TAG_TOTAL_COUNT}; - -/// Captured evaluation for a single tagged constraint. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct EvalRecord { - /// Stable numeric ID (zero-based). - pub id: usize, - /// Human-readable namespace for debugging. - pub namespace: &'static str, - /// Constraint evaluation in the quadratic extension field. - pub value: QuadFelt, -} - -/// AIR builder that evaluates each constraint at a random OOD point. -/// -/// All main/aux trace values, row flags, and challenges are pseudo-random but deterministic -/// for a given seed. Each constraint's evaluation is recorded in ID order. -pub struct OodEvalAirBuilder { - main: RowMajorMatrix, - permutation: RowMajorMatrix, - permutation_randomness: Vec, - permutation_values: Vec, - public_values: Vec, - periodic_values: Vec, - first_row: Felt, - last_row: Felt, - transition: Felt, - records: Vec, - used: Vec>, - prev_enabled: bool, -} - -impl OodEvalAirBuilder { - /// Build an OOD evaluator seeded with `seed`. - /// - /// The seed deterministically fills the trace matrices, row flags, and random challenges. - pub fn new(seed: u64) -> Self { - let prev_enabled = state::is_enabled(); - state::set_enabled(true); - - let mut rng = SeededRng::new(seed); - let main = RowMajorMatrix::new( - (0..crate::trace::TRACE_WIDTH * 2).map(|_| rng.next_felt()).collect(), - crate::trace::TRACE_WIDTH, - ); - let permutation = RowMajorMatrix::new( - (0..crate::trace::AUX_TRACE_WIDTH * 2).map(|_| rng.next_quad()).collect(), - crate::trace::AUX_TRACE_WIDTH, - ); - // Only store the actually used (alpha and beta), but consume MAX_MESSAGE_WIDTH - // from the RNG to keep the seed state stable and ensure that the fixtures - // remain unchanged. - let all_randomness: Vec = - (0..crate::trace::MAX_MESSAGE_WIDTH).map(|_| rng.next_quad()).collect(); - let permutation_randomness: Vec = - all_randomness[..crate::trace::AUX_TRACE_RAND_CHALLENGES].to_vec(); - let permutation_values: Vec = - (0..crate::trace::AUX_TRACE_WIDTH).map(|_| rng.next_quad()).collect(); - let first_row = rng.next_felt(); - let last_row = rng.next_felt(); - let transition = rng.next_felt(); - let periodic_values = (0..bitwise::NUM_PERIODIC_COLUMNS).map(|_| rng.next_felt()).collect(); - - // Generate enough random public values for the boundary constraints. - // Minimum tail: 36 elements (16 SI + 16 SO + 4 PC transcript state) + 4 program hash. - let public_values = (0..40).map(|_| rng.next_felt()).collect(); - - Self { - main, - permutation, - permutation_randomness, - permutation_values, - public_values, - periodic_values, - first_row, - last_row, - transition, - records: Vec::new(), - used: vec![None; TAG_TOTAL_COUNT], - prev_enabled, - } - } - - pub fn records(&self) -> &[EvalRecord] { - &self.records - } - - /// Panics if any expected ID was not recorded. - pub fn assert_complete(&self) { - let missing: Vec = self - .used - .iter() - .enumerate() - .filter_map(|(id, entry)| entry.is_none().then_some(id)) - .collect(); - - if !missing.is_empty() { - panic!("missing constraint ids: {missing:?}"); - } - } - - fn record(&mut self, id: usize, namespace: &'static str, value: QuadFelt) { - let expected = self.records.len(); - if id != expected { - panic!("constraint id {} out of order (expected {})", id, expected); - } - if id >= self.used.len() { - panic!("constraint id {} is out of range (max {})", id, self.used.len() - 1); - } - if let Some(prev) = self.used[id] { - panic!("constraint id {} already used (previous namespace: {})", id, prev); - } - self.used[id] = Some(namespace); - self.records.push(EvalRecord { id, namespace, value }); - } -} - -impl Drop for OodEvalAirBuilder { - fn drop(&mut self) { - state::set_enabled(self.prev_enabled); - } -} - -// --- Individual trait impls so the blanket LiftedAirBuilder applies --- - -impl AirBuilder for OodEvalAirBuilder { - type F = Felt; - type Expr = Felt; - type Var = Felt; - type PreprocessedWindow = EmptyWindow; - type MainWindow = RowMajorMatrix; - type PublicVar = Felt; - - fn main(&self) -> Self::MainWindow { - self.main.clone() - } - - fn preprocessed(&self) -> &Self::PreprocessedWindow { - EmptyWindow::empty_ref() - } - - fn is_first_row(&self) -> Self::Expr { - self.first_row - } - - fn is_last_row(&self) -> Self::Expr { - self.last_row - } - - fn is_transition_window(&self, size: usize) -> Self::Expr { - if size == 2 { - self.transition - } else { - panic!("OOD eval only supports a window size of 2"); - } - } - - fn assert_zero>(&mut self, x: I) { - let (id, namespace) = state::consume_tag(); - let value = QuadFelt::from(x.into()); - self.record(id, namespace, value); - } - - fn public_values(&self) -> &[Self::PublicVar] { - &self.public_values - } -} - -impl ExtensionBuilder for OodEvalAirBuilder { - type EF = QuadFelt; - type ExprEF = QuadFelt; - type VarEF = QuadFelt; - - fn assert_zero_ext(&mut self, x: I) - where - I: Into, - { - let (id, namespace) = state::consume_tag(); - let value = x.into(); - self.record(id, namespace, value); - } -} - -impl PermutationAirBuilder for OodEvalAirBuilder { - type MP = RowMajorMatrix; - type RandomVar = QuadFelt; - type PermutationVar = QuadFelt; - - fn permutation(&self) -> Self::MP { - self.permutation.clone() - } - - fn permutation_randomness(&self) -> &[Self::RandomVar] { - &self.permutation_randomness - } - - fn permutation_values(&self) -> &[Self::PermutationVar] { - &self.permutation_values - } -} - -impl PeriodicAirBuilder for OodEvalAirBuilder { - type PeriodicVar = Felt; - - fn periodic_values(&self) -> &[Self::PeriodicVar] { - &self.periodic_values - } -} - -/// Deterministic RNG based on a seed and counter. -struct SeededRng { - seed: u64, - counter: u64, -} - -impl SeededRng { - fn new(seed: u64) -> Self { - Self { seed, counter: 0 } - } - - fn next_felt(&mut self) -> Felt { - let bytes = self.next_seed_bytes(); - miden_crypto::rand::test_utils::prng_value::(bytes) - } - - fn next_quad(&mut self) -> QuadFelt { - QuadFelt::new([self.next_felt(), self.next_felt()]) - } - - fn next_seed_bytes(&mut self) -> [u8; 32] { - let counter = self.counter; - self.counter = self.counter.wrapping_add(1); - let mix = self.seed ^ counter; - let sum = self.seed.wrapping_add(counter); - let mut out = [0u8; 32]; - out[0..8].copy_from_slice(&self.seed.to_le_bytes()); - out[8..16].copy_from_slice(&counter.to_le_bytes()); - out[16..24].copy_from_slice(&mix.to_le_bytes()); - out[24..32].copy_from_slice(&sum.to_le_bytes()); - out - } -} - -#[cfg(test)] -mod tests { - use alloc::vec::Vec; - - use miden_core::{Felt, field::QuadFelt}; - - use super::{ - super::{ - fixtures::{OOD_SEED, active_expected_ood_evals}, - ids::TAG_TOTAL_COUNT, - }, - EvalRecord, OodEvalAirBuilder, - }; - use crate::{LiftedAir, ProcessorAir}; - - fn run_group_parity_test(expected: Vec) { - assert_eq!(expected.len(), TAG_TOTAL_COUNT); - let mut builder = OodEvalAirBuilder::new(OOD_SEED); - LiftedAir::::eval(&ProcessorAir, &mut builder); - builder.assert_complete(); - - let actual = builder.records(); - assert_eq!(actual.len(), expected.len()); - for (actual, expected) in actual.iter().zip(expected.iter()) { - assert_eq!(actual.id, expected.id); - assert_eq!(actual.namespace, expected.namespace); - assert_eq!(actual.value, expected.value); - } - } - - #[test] - fn test_miden_vm_ood_evals_match() { - run_group_parity_test(active_expected_ood_evals()); - } -} diff --git a/air/src/constraints/tagging/state.rs b/air/src/constraints/tagging/state.rs deleted file mode 100644 index dcde383102..0000000000 --- a/air/src/constraints/tagging/state.rs +++ /dev/null @@ -1,87 +0,0 @@ -//! Thread-local tagging state for enforcing tag ordering and counts. - -use alloc::vec::Vec; -use std::{ - cell::{Cell, RefCell}, - thread_local, -}; -/// Active tagged block metadata. -#[derive(Debug)] -struct TagContext { - namespace: &'static str, - ids: Vec, - next: usize, -} - -thread_local! { - static TAGGING_ENABLED: Cell = const { Cell::new(false) }; - static TAG_STACK: RefCell> = const { RefCell::new(Vec::new()) }; -} - -/// Returns `true` when tagging is enabled for the current thread. -pub fn is_enabled() -> bool { - TAGGING_ENABLED.with(|flag| flag.get()) -} - -/// Enables or disables tagging for the current thread. -#[cfg(test)] -pub fn set_enabled(enabled: bool) { - TAGGING_ENABLED.with(|flag| flag.set(enabled)); -} - -/// Run `f` under a tagged context with the provided IDs. -/// -/// This enforces: -/// - exactly one tagged context at a time (no nesting), -/// - at least one ID, -/// - and the number of emitted assertions matches the ID list length. -pub fn with_tag(ids: Vec, namespace: &'static str, f: impl FnOnce() -> R) -> R { - if ids.is_empty() { - panic!("tagged block '{namespace}' must include at least one id"); - } - TAG_STACK.with(|stack| { - let mut stack = stack.borrow_mut(); - if !stack.is_empty() { - panic!("nested tagged blocks are not allowed"); - } - stack.push(TagContext { namespace, ids, next: 0 }); - }); - - let result = f(); - - TAG_STACK.with(|stack| { - let mut stack = stack.borrow_mut(); - let ctx = stack.pop().expect("tag stack underflow"); - if ctx.next != ctx.ids.len() { - panic!( - "tagged block '{}' expected {} asserts, saw {}", - ctx.namespace, - ctx.ids.len(), - ctx.next - ); - } - }); - - result -} - -/// Consume the next tag ID for the current tagged context. -/// -/// Panics if called outside a tagged block or if the block emits too many assertions. -#[cfg(test)] -pub fn consume_tag() -> (usize, &'static str) { - TAG_STACK.with(|stack| { - let mut stack = stack.borrow_mut(); - let ctx = stack.last_mut().expect("assertion made without an active tagged block"); - if ctx.next >= ctx.ids.len() { - panic!( - "tagged block '{}' exceeded expected asserts ({})", - ctx.namespace, - ctx.ids.len() - ); - } - let id = ctx.ids[ctx.next]; - ctx.next += 1; - (id, ctx.namespace) - }) -} diff --git a/air/src/constraints/utils.rs b/air/src/constraints/utils.rs new file mode 100644 index 0000000000..2e4173a729 --- /dev/null +++ b/air/src/constraints/utils.rs @@ -0,0 +1,31 @@ +//! Utility extension traits for constraint code. + +use miden_core::field::PrimeCharacteristicRing; + +/// Extension trait adding `.not()` for boolean negation (`1 - self`). +pub trait BoolNot: PrimeCharacteristicRing { + fn not(&self) -> Self { + Self::ONE - self.clone() + } +} + +impl BoolNot for T {} + +/// Aggregate bits into a value (little-endian) using Horner's method: `sum(2^i * limbs[i])`. +/// +/// Evaluates as `((limbs[N-1]*2 + limbs[N-2])*2 + ...)*2 + limbs[0]`. +#[inline] +pub fn horner_eval_bits, E: PrimeCharacteristicRing>( + limbs: &[T; N], +) -> E { + const { + assert! { N >= 1}; + } + limbs + .iter() + .rev() + .cloned() + .map(Into::into) + .reduce(|acc, bit| acc.double() + bit) + .expect("non-empty array") +} diff --git a/air/src/lib.rs b/air/src/lib.rs index 32640228cd..187fe7dfde 100644 --- a/air/src/lib.rs +++ b/air/src/lib.rs @@ -19,11 +19,13 @@ use miden_crypto::stark::air::{ ReducedAuxValues, ReductionError, VarLenPublicInputs, WindowAccess, }; +pub mod ace; pub mod config; mod constraints; pub mod trace; -use trace::{AUX_TRACE_WIDTH, MainTraceRow, TRACE_WIDTH}; +use constraints::columns::MainCols; +use trace::{AUX_TRACE_WIDTH, TRACE_WIDTH, bus_types}; // RE-EXPORTS // ================================================================================================ @@ -44,6 +46,16 @@ mod export { pub use export::*; +// MIDEN AIR BUILDER +// ================================================================================================ + +/// Convenience super-trait that pins `LiftedAirBuilder` to our field. +/// +/// All constraint functions in this crate should be generic over `AB: MidenAirBuilder` +/// instead of spelling out the full `LiftedAirBuilder` bound. +pub trait MidenAirBuilder: LiftedAirBuilder {} +impl> MidenAirBuilder for T {} + // PUBLIC INPUTS // ================================================================================================ @@ -198,9 +210,7 @@ impl BaseAir for ProcessorAir { impl> LiftedAir for ProcessorAir { fn periodic_columns(&self) -> Vec> { - let mut cols = constraints::chiplets::hasher::periodic_columns(); - cols.extend(constraints::chiplets::bitwise::periodic_columns()); - cols + constraints::chiplets::columns::PeriodicCols::periodic_columns() } fn num_randomness(&self) -> usize { @@ -329,7 +339,7 @@ impl> LiftedAir for ProcessorAir { Ok(ReducedAuxValues { prod, sum }) } - fn eval>(&self, builder: &mut AB) { + fn eval(&self, builder: &mut AB) { use crate::constraints; let main = builder.main(); @@ -339,14 +349,20 @@ impl> LiftedAir for ProcessorAir { let next = main.next_slice(); // Use structured column access via MainTraceCols - let local: &MainTraceRow = (*local).borrow(); - let next: &MainTraceRow = (*next).borrow(); + let local: &MainCols = (*local).borrow(); + let next: &MainCols = (*next).borrow(); + + // Build chiplet selectors and op flags once, shared by main and bus constraints. + let selectors = + constraints::chiplets::selectors::build_chiplet_selectors(builder, local, next); + let op_flags = + constraints::op_flags::OpFlags::new(&local.decoder, &local.stack, &next.decoder); // Main trace constraints. - constraints::enforce_main(builder, local, next); + constraints::enforce_main(builder, local, next, &selectors, &op_flags); // Auxiliary (bus) constraints. - constraints::enforce_bus(builder, local, next); + constraints::enforce_bus(builder, local, next, &selectors, &op_flags); // Public inputs boundary constraints. constraints::public_inputs::enforce_main(builder, local); @@ -364,15 +380,18 @@ fn program_hash_message>( challenges: &trace::Challenges, program_hash: &Word, ) -> EF { - challenges.encode([ - Felt::ZERO, // parent_id = 0 (root block) - program_hash[0], - program_hash[1], - program_hash[2], - program_hash[3], - Felt::ZERO, // is_first_child = false - Felt::ZERO, // is_loop_body = false - ]) + challenges.encode( + bus_types::BLOCK_HASH_TABLE, + [ + Felt::ZERO, // parent_id = 0 (root block) + program_hash[0], + program_hash[1], + program_hash[2], + program_hash[3], + Felt::ZERO, // is_first_child = false + Felt::ZERO, // is_loop_body = false + ], + ) } /// Returns the pair of (initial, final) log-precompile transcript messages for the @@ -386,13 +405,10 @@ fn transcript_messages>( ) -> (EF, EF) { let encode = |state: PrecompileTranscriptState| { let cap: &[Felt] = state.as_ref(); - challenges.encode([ - Felt::from_u8(trace::LOG_PRECOMPILE_LABEL), - cap[0], - cap[1], - cap[2], - cap[3], - ]) + challenges.encode( + bus_types::LOG_PRECOMPILE_TRANSCRIPT, + [Felt::from_u8(trace::LOG_PRECOMPILE_LABEL), cap[0], cap[1], cap[2], cap[3]], + ) }; (encode(PrecompileTranscriptState::default()), encode(final_state)) } @@ -405,13 +421,16 @@ fn kernel_proc_message>( challenges: &trace::Challenges, digest: &Word, ) -> EF { - challenges.encode([ - trace::chiplets::kernel_rom::KERNEL_PROC_INIT_LABEL, - digest[0], - digest[1], - digest[2], - digest[3], - ]) + challenges.encode( + bus_types::CHIPLETS_BUS, + [ + trace::chiplets::kernel_rom::KERNEL_PROC_INIT_LABEL, + digest[0], + digest[1], + digest[2], + digest[3], + ], + ) } /// Reduces kernel procedure digests from var-len public inputs into a multiset product. diff --git a/air/src/snapshots/miden_air__config__tests__relation_digest_matches_current_air.snap b/air/src/snapshots/miden_air__config__tests__relation_digest_matches_current_air.snap new file mode 100644 index 0000000000..eac11eba5b --- /dev/null +++ b/air/src/snapshots/miden_air__config__tests__relation_digest_matches_current_air.snap @@ -0,0 +1,7 @@ +--- +source: air/src/config.rs +expression: snapshot +--- +num_inputs: 572 +num_eval_gates: 5588 +relation_digest: [7682526984894530630, 13019009422810970716, 16037978224454945133, 1332031755710493241] diff --git a/air/src/trace/challenges.rs b/air/src/trace/challenges.rs index 4ca7537231..31ffb1b813 100644 --- a/air/src/trace/challenges.rs +++ b/air/src/trace/challenges.rs @@ -1,24 +1,30 @@ -//! Unified bus challenge encoding. +//! Unified bus challenge encoding with per-bus domain separation. //! //! Provides [`Challenges`], a single struct for encoding multiset/LogUp bus messages -//! as `alpha + `. This type is used by: +//! as `bus_prefix[bus] + `. Each bus interaction type gets a unique +//! prefix to ensure domain separation. +//! +//! This type is used by: //! //! - **AIR constraints** (symbolic expressions): `Challenges` //! - **Processor aux trace builders** (concrete field elements): `Challenges` //! - **Verifier** (`reduced_aux_values`): `Challenges` //! //! See [`super::bus_message`] for the standard coefficient index layout. +//! See [`super::bus_types`] for the bus interaction type constants. use core::ops::{AddAssign, Mul}; use miden_core::field::PrimeCharacteristicRing; -use super::MAX_MESSAGE_WIDTH; +use super::{MAX_MESSAGE_WIDTH, bus_types::NUM_BUS_TYPES}; -/// Encodes multiset/LogUp contributions as **alpha + **. +/// Encodes multiset/LogUp contributions as **bus_prefix\[bus\] + \**. /// -/// - `alpha`: randomness base +/// - `alpha`: randomness base (kept public for direct access by range checker etc.) /// - `beta_powers`: precomputed powers `[beta^0, beta^1, ..., beta^(MAX_MESSAGE_WIDTH-1)]` +/// - `bus_prefix`: per-bus domain separation constants `bus_prefix[i] = alpha + (i+1) * +/// beta^MAX_MESSAGE_WIDTH` /// /// The challenges are derived from permutation randomness: /// - `alpha = challenges[0]` @@ -28,50 +34,73 @@ use super::MAX_MESSAGE_WIDTH; pub struct Challenges { pub alpha: EF, pub beta_powers: [EF; MAX_MESSAGE_WIDTH], + /// Per-bus prefix: `bus_prefix[i] = alpha + (i+1) * gamma` + /// where `gamma = beta^MAX_MESSAGE_WIDTH` and `(i+1)` is the domain separator. + pub bus_prefix: [EF; NUM_BUS_TYPES], } impl Challenges { - /// Builds `alpha` and precomputed `beta` powers. + /// Builds `alpha`, precomputed `beta` powers, and per-bus prefixes. pub fn new(alpha: EF, beta: EF) -> Self { let mut beta_powers = core::array::from_fn(|_| EF::ONE); for i in 1..MAX_MESSAGE_WIDTH { beta_powers[i] = beta_powers[i - 1].clone() * beta.clone(); } - Self { alpha, beta_powers } + // gamma = beta^MAX_MESSAGE_WIDTH (one power beyond the message range) + let gamma = beta_powers[MAX_MESSAGE_WIDTH - 1].clone() * beta; + let bus_prefix = + core::array::from_fn(|i| alpha.clone() + gamma.clone() * EF::from_u32((i as u32) + 1)); + Self { alpha, beta_powers, bus_prefix } } - /// Encodes as **alpha + sum(beta_powers\[i\] * elem\[i\])** with K consecutive elements. + /// Encodes as **bus_prefix\[bus\] + sum(beta_powers\[i\] * elem\[i\])** with K consecutive + /// elements. + /// + /// The `bus` parameter is the bus index used for domain separation. #[inline(always)] - pub fn encode(&self, elems: [BF; K]) -> EF + pub fn encode(&self, bus: usize, elems: [BF; K]) -> EF where EF: Mul + AddAssign, - BF: Clone, { const { assert!(K <= MAX_MESSAGE_WIDTH, "Message length exceeds beta_powers capacity") }; - let mut acc = self.alpha.clone(); - for (i, elem) in elems.iter().enumerate() { - acc += self.beta_powers[i].clone() * elem.clone(); + debug_assert!( + bus < NUM_BUS_TYPES, + "Bus index {bus} exceeds NUM_BUS_TYPES ({NUM_BUS_TYPES})" + ); + let mut acc = self.bus_prefix[bus].clone(); + for (i, elem) in elems.into_iter().enumerate() { + acc += self.beta_powers[i].clone() * elem; } acc } - /// Encodes as **alpha + sum(beta_powers\[layout\[i\]\] * values\[i\])** using sparse positions. + /// Encodes as **bus_prefix\[bus\] + sum(beta_powers\[layout\[i\]\] * values\[i\])** using + /// sparse positions. + /// + /// The `bus` parameter is the bus index used for domain separation. #[inline(always)] - pub fn encode_sparse(&self, layout: [usize; K], values: [BF; K]) -> EF + pub fn encode_sparse( + &self, + bus: usize, + layout: [usize; K], + values: [BF; K], + ) -> EF where EF: Mul + AddAssign, - BF: Clone, { - let mut acc = self.alpha.clone(); - for i in 0..K { - let idx = layout[i]; + debug_assert!( + bus < NUM_BUS_TYPES, + "Bus index {bus} exceeds NUM_BUS_TYPES ({NUM_BUS_TYPES})" + ); + let mut acc = self.bus_prefix[bus].clone(); + for (idx, value) in layout.into_iter().zip(values) { debug_assert!( idx < self.beta_powers.len(), "encode_sparse index {} exceeds beta_powers length ({})", idx, self.beta_powers.len() ); - acc += self.beta_powers[idx].clone() * values[i].clone(); + acc += self.beta_powers[idx].clone() * value; } acc } diff --git a/air/src/trace/chiplets/hasher.rs b/air/src/trace/chiplets/hasher.rs index 47464327c0..46840af2be 100644 --- a/air/src/trace/chiplets/hasher.rs +++ b/air/src/trace/chiplets/hasher.rs @@ -76,23 +76,53 @@ pub const DIGEST_RANGE: Range = Hasher::DIGEST_RANGE; /// Number of round steps used to complete a single permutation. /// -/// For Poseidon2, we model a permutation as 31 step transitions, resulting in a 32-row cycle. +/// For Poseidon2, the permutation consists of 31 step transitions (1 init linear + 8 external +/// + 22 internal). These are packed into a 16-row cycle. pub const NUM_ROUNDS: usize = miden_core::chiplets::hasher::NUM_ROUNDS; /// Index of the last row in a permutation cycle (0-based). -pub const LAST_CYCLE_ROW: usize = NUM_ROUNDS; +pub const LAST_CYCLE_ROW: usize = HASH_CYCLE_LEN - 1; pub const LAST_CYCLE_ROW_FELT: Felt = Felt::new(LAST_CYCLE_ROW as u64); /// Number of selector columns in the trace. pub const NUM_SELECTORS: usize = 3; /// The number of rows in the execution trace required to compute a permutation of Poseidon2. -/// This is equal to 32. -pub const HASH_CYCLE_LEN: usize = NUM_ROUNDS.next_power_of_two(); +/// +/// The 16-row packed cycle compresses the 31 permutation steps by: +/// - Merging init linear + ext1 into one row +/// - Packing 3 internal rounds per row (7 rows for 21 rounds) +/// - Merging int22 + ext5 into one row Result: 1 + 3 + 7 + 1 + 3 + 1 = 16 rows. +pub const HASH_CYCLE_LEN: usize = 16; pub const HASH_CYCLE_LEN_FELT: Felt = Felt::new(HASH_CYCLE_LEN as u64); -/// Number of columns in Hasher execution trace. There is one additional column for the node index. -pub const TRACE_WIDTH: usize = NUM_SELECTORS + STATE_WIDTH + 1; +/// Index of the node_index column. Holds the Merkle tree node index on controller rows. +/// This column is reused to hold the permutation request multiplicity on perm segment rows. +pub const NODE_INDEX_COL_IDX: usize = NUM_SELECTORS + STATE_WIDTH; + +/// Index of the mrupdate_id column (domain separator for sibling table across MRUPDATE ops). +pub const MRUPDATE_ID_COL_IDX: usize = NODE_INDEX_COL_IDX + 1; + +/// Index of the is_boundary column (1 on boundary rows: first input or last output of each +/// operation, 0 otherwise). +pub const IS_BOUNDARY_COL_IDX: usize = MRUPDATE_ID_COL_IDX + 1; + +/// Index of the direction_bit column. On Merkle controller rows, holds the extracted direction +/// bit from the node index. Zero on non-Merkle rows and perm segment rows. +pub const DIRECTION_BIT_COL_IDX: usize = IS_BOUNDARY_COL_IDX + 1; + +/// Index of the s_perm column (0 = controller region, 1 = permutation segment). +pub const S_PERM_COL_IDX: usize = DIRECTION_BIT_COL_IDX + 1; + +/// Number of columns in Hasher execution trace. +/// 3 selectors + 12 state + node_index + mrupdate_id + is_boundary + direction_bit + s_perm = 20. +pub const TRACE_WIDTH: usize = S_PERM_COL_IDX + 1; + +/// Number of controller rows per permutation request (one input + one output). +pub const CONTROLLER_ROWS_PER_PERMUTATION: usize = 2; + +/// Felt version of [CONTROLLER_ROWS_PER_PERMUTATION] for address arithmetic. +pub const CONTROLLER_ROWS_PER_PERM_FELT: Felt = Felt::new(CONTROLLER_ROWS_PER_PERMUTATION as u64); // --- Transition selectors ----------------------------------------------------------------------- @@ -140,6 +170,8 @@ pub const RETURN_STATE: Selectors = [ZERO, ZERO, ONE]; /// `selector = [0 | 0, 0, 1]`, `flag = rev(selector) + 1 = [1, 0, 0 | 0] + 1 = 9` pub const RETURN_STATE_LABEL: u8 = 0b1000 + 1; +// NOTE: Selectors s0/s1/s2 are unconstrained on perm segment rows. + // --- Column accessors in the auxiliary trace ---------------------------------------------------- /// Index of the auxiliary trace column tracking the state of the sibling table. diff --git a/air/src/trace/chiplets/memory.rs b/air/src/trace/chiplets/memory.rs index 8b2475ce76..c66ca75190 100644 --- a/air/src/trace/chiplets/memory.rs +++ b/air/src/trace/chiplets/memory.rs @@ -6,7 +6,7 @@ use super::{Felt, ONE, Range, ZERO, create_range}; // ================================================================================================ /// Number of columns needed to record an execution trace of the memory chiplet. -pub const TRACE_WIDTH: usize = 15; +pub const TRACE_WIDTH: usize = 17; // --- OPERATION SELECTORS ------------------------------------------------------------------------ @@ -78,3 +78,11 @@ pub const D_INV_COL_IDX: usize = D1_COL_IDX + 1; /// Column to hold the flag indicating whether the current memory operation is in the same word and /// same context as the previous operation. pub const FLAG_SAME_CONTEXT_AND_WORD: usize = D_INV_COL_IDX + 1; + +/// Column for the lower 16 bits of the word index (word_addr / 4). +/// Used for range-checking that memory addresses are valid 32-bit values. +pub const WORD_ADDR_LO_COL_IDX: usize = FLAG_SAME_CONTEXT_AND_WORD + 1; + +/// Column for the upper 16 bits of the word index (word_addr / 4). +/// Used for range-checking that memory addresses are valid 32-bit values. +pub const WORD_ADDR_HI_COL_IDX: usize = WORD_ADDR_LO_COL_IDX + 1; diff --git a/air/src/trace/chiplets/mod.rs b/air/src/trace/chiplets/mod.rs index bf2fec08ec..c25a236d21 100644 --- a/air/src/trace/chiplets/mod.rs +++ b/air/src/trace/chiplets/mod.rs @@ -53,6 +53,14 @@ pub const HASHER_RATE_COL_RANGE: Range = Range { }; /// The index of the hasher's node index column in the execution trace. pub const HASHER_NODE_INDEX_COL_IDX: usize = HASHER_STATE_COL_RANGE.end; +/// The index of the hasher's mrupdate_id column in the execution trace. +pub const HASHER_MRUPDATE_ID_COL_IDX: usize = HASHER_TRACE_OFFSET + hasher::MRUPDATE_ID_COL_IDX; +/// The index of the hasher's is_boundary column in the execution trace. +pub const HASHER_IS_BOUNDARY_COL_IDX: usize = HASHER_TRACE_OFFSET + hasher::IS_BOUNDARY_COL_IDX; +/// The index of the hasher's direction_bit column in the execution trace. +pub const HASHER_DIRECTION_BIT_COL_IDX: usize = HASHER_TRACE_OFFSET + hasher::DIRECTION_BIT_COL_IDX; +/// The index of the hasher's s_perm column in the execution trace. +pub const HASHER_S_PERM_COL_IDX: usize = HASHER_TRACE_OFFSET + hasher::S_PERM_COL_IDX; // --- GLOBALLY-INDEXED CHIPLET COLUMN ACCESSORS: BITWISE ----------------------------------------- @@ -123,3 +131,7 @@ pub const MEMORY_D_INV_COL_IDX: usize = MEMORY_TRACE_OFFSET + memory::D_INV_COL_ /// and same word as the previous operation. pub const MEMORY_FLAG_SAME_CONTEXT_AND_WORD: usize = MEMORY_TRACE_OFFSET + memory::FLAG_SAME_CONTEXT_AND_WORD; +/// The index of the memory's word address low 16-bit limb column in the execution trace. +pub const MEMORY_WORD_ADDR_LO_COL_IDX: usize = MEMORY_TRACE_OFFSET + memory::WORD_ADDR_LO_COL_IDX; +/// The index of the memory's word address high 16-bit limb column in the execution trace. +pub const MEMORY_WORD_ADDR_HI_COL_IDX: usize = MEMORY_TRACE_OFFSET + memory::WORD_ADDR_HI_COL_IDX; diff --git a/air/src/trace/main_trace.rs b/air/src/trace/main_trace.rs index a6e6c81850..933b2e9299 100644 --- a/air/src/trace/main_trace.rs +++ b/air/src/trace/main_trace.rs @@ -1,29 +1,31 @@ use alloc::vec::Vec; use core::{ borrow::{Borrow, BorrowMut}, - ops::{Deref, Range}, + ops::Range, }; use miden_core::{ Felt, ONE, WORD_SIZE, Word, ZERO, field::PrimeCharacteristicRing, - utils::{ColMatrix, RowMajorMatrix, range}, + utils::{Matrix, RowMajorMatrix, range}, }; use super::{ CHIPLETS_OFFSET, CHIPLETS_WIDTH, CLK_COL_IDX, CTX_COL_IDX, DECODER_TRACE_OFFSET, - DECODER_TRACE_WIDTH, FN_HASH_OFFSET, RANGE_CHECK_TRACE_WIDTH, RowIndex, STACK_TRACE_OFFSET, - STACK_TRACE_WIDTH, + DECODER_TRACE_WIDTH, FN_HASH_OFFSET, PADDED_TRACE_WIDTH, RANGE_CHECK_TRACE_OFFSET, + RANGE_CHECK_TRACE_WIDTH, RowIndex, STACK_TRACE_OFFSET, STACK_TRACE_WIDTH, chiplets::{ - BITWISE_A_COL_IDX, BITWISE_B_COL_IDX, BITWISE_OUTPUT_COL_IDX, HASHER_NODE_INDEX_COL_IDX, - HASHER_STATE_COL_RANGE, MEMORY_CLK_COL_IDX, MEMORY_CTX_COL_IDX, MEMORY_IDX0_COL_IDX, - MEMORY_IDX1_COL_IDX, MEMORY_V_COL_RANGE, MEMORY_WORD_COL_IDX, NUM_ACE_SELECTORS, + BITWISE_A_COL_IDX, BITWISE_B_COL_IDX, BITWISE_OUTPUT_COL_IDX, HASHER_DIRECTION_BIT_COL_IDX, + HASHER_IS_BOUNDARY_COL_IDX, HASHER_MRUPDATE_ID_COL_IDX, HASHER_NODE_INDEX_COL_IDX, + HASHER_S_PERM_COL_IDX, HASHER_STATE_COL_RANGE, MEMORY_CLK_COL_IDX, MEMORY_CTX_COL_IDX, + MEMORY_IDX0_COL_IDX, MEMORY_IDX1_COL_IDX, MEMORY_V_COL_RANGE, MEMORY_WORD_ADDR_HI_COL_IDX, + MEMORY_WORD_ADDR_LO_COL_IDX, MEMORY_WORD_COL_IDX, NUM_ACE_SELECTORS, ace::{ CLK_IDX, CTX_IDX, EVAL_OP_IDX, ID_0_IDX, ID_1_IDX, ID_2_IDX, M_0_IDX, M_1_IDX, PTR_IDX, READ_NUM_EVAL_IDX, SELECTOR_BLOCK_IDX, SELECTOR_START_IDX, V_0_0_IDX, V_0_1_IDX, V_1_0_IDX, V_1_1_IDX, V_2_0_IDX, V_2_1_IDX, }, - hasher::{DIGEST_LEN, HASH_CYCLE_LEN, LAST_CYCLE_ROW, STATE_WIDTH}, + hasher::{DIGEST_LEN, STATE_WIDTH}, }, decoder::{ GROUP_COUNT_COL_IDX, HASHER_STATE_OFFSET, IN_SPAN_COL_IDX, IS_CALL_FLAG_COL_IDX, @@ -90,49 +92,405 @@ impl BorrowMut> for [T] { // MAIN TRACE MATRIX // ================================================================================================ +/// Storage backing [`MainTrace`]: `Parts` from `build_trace`, `RowMajor` from the prover, or +/// `Transposed` (`W×N` row-major of an `N×W` trace) for aux trace construction. +#[derive(Debug)] +enum TraceStorage { + Parts { + core_rm: Vec, + chiplets_rm: Vec, + range_checker_cols: [Vec; 2], + num_rows: usize, + }, + RowMajor(RowMajorMatrix), + Transposed { + matrix: RowMajorMatrix, + num_cols: usize, + num_rows: usize, + }, +} + #[derive(Debug)] pub struct MainTrace { - columns: ColMatrix, + storage: TraceStorage, last_program_row: RowIndex, } -impl Deref for MainTrace { - type Target = ColMatrix; +/// Number of columns in the core (row-major) part of [`TraceStorage::Parts`]. +const CORE_WIDTH: usize = RANGE_CHECK_TRACE_OFFSET; - fn deref(&self) -> &Self::Target { - &self.columns - } -} +// TODO: Could be tailored more efficiently? +#[cfg(feature = "concurrent")] +const ROW_MAJOR_CHUNK_SIZE: usize = 512; impl MainTrace { - pub fn new(main_trace: ColMatrix, last_program_row: RowIndex) -> Self { - Self { columns: main_trace, last_program_row } + /// Creates a `MainTrace` from a [`RowMajorMatrix`]. + pub fn new(matrix: RowMajorMatrix, last_program_row: RowIndex) -> Self { + Self { + storage: TraceStorage::RowMajor(matrix), + last_program_row, + } + } + + /// Builds from `build_trace` outputs: core and chiplets row-major, range checker column + /// vectors. + pub fn from_parts( + core_rm: Vec, + chiplets_rm: Vec, + range_checker_cols: [Vec; 2], + num_rows: usize, + last_program_row: RowIndex, + ) -> Self { + assert_eq!(core_rm.len(), num_rows * CORE_WIDTH); + assert_eq!(chiplets_rm.len(), num_rows * CHIPLETS_WIDTH); + assert_eq!(range_checker_cols[0].len(), num_rows); + assert_eq!(range_checker_cols[1].len(), num_rows); + Self { + storage: TraceStorage::Parts { + core_rm, + chiplets_rm, + range_checker_cols, + num_rows, + }, + last_program_row, + } + } + + /// `transposed` is `main.transpose()` where `main` was `num_rows × num_cols`. + pub fn from_transposed(transposed: RowMajorMatrix, last_program_row: RowIndex) -> Self { + let num_cols = transposed.height(); + let num_rows = transposed.width(); + Self { + storage: TraceStorage::Transposed { matrix: transposed, num_cols, num_rows }, + last_program_row, + } + } + + /// Get matrix element at `(row, col)`. + /// + /// # Panics + /// Panics if the row or column is out of bounds. + #[inline] + pub fn get(&self, row: RowIndex, col: usize) -> Felt { + let r = row.as_usize(); + match &self.storage { + TraceStorage::Parts { + core_rm, + chiplets_rm, + range_checker_cols, + num_rows, + } => { + assert!(r < *num_rows, "main trace row index in bounds"); + assert!(col < PADDED_TRACE_WIDTH, "main trace column index in bounds"); + + if col < CORE_WIDTH { + core_rm[r * CORE_WIDTH + col] + } else { + let nc = col - CORE_WIDTH; + if nc < RANGE_CHECK_TRACE_WIDTH { + range_checker_cols[nc][r] + } else if nc < RANGE_CHECK_TRACE_WIDTH + CHIPLETS_WIDTH { + chiplets_rm[r * CHIPLETS_WIDTH + (nc - RANGE_CHECK_TRACE_WIDTH)] + } else { + ZERO + } + } + }, + TraceStorage::RowMajor(matrix) => { + let row_slice = matrix.row_slice(r).expect("main trace row index in bounds"); + assert!(col < row_slice.len(), "main trace column index in bounds"); + row_slice[col] + }, + TraceStorage::Transposed { matrix, num_cols, .. } => { + let col_slice = matrix.row_slice(col).expect("main trace column index in bounds"); + assert!(r < col_slice.len(), "main trace row index in bounds"); + debug_assert_eq!(col_slice.len(), matrix.width()); + debug_assert_eq!(matrix.height(), *num_cols); + col_slice[r] + }, + } } - /// Converts this column-major `MainTrace` into a row-major matrix. + /// Returns the stored width (number of columns). + #[inline] + pub fn width(&self) -> usize { + match &self.storage { + TraceStorage::Parts { .. } => PADDED_TRACE_WIDTH, + TraceStorage::RowMajor(matrix) => matrix.width(), + TraceStorage::Transposed { num_cols, .. } => *num_cols, + } + } + + /// Row-major matrix of this trace. pub fn to_row_major(&self) -> RowMajorMatrix { - let num_rows = self.columns.num_rows(); - let mut col_major_data = Vec::with_capacity(num_rows * self.columns.num_cols()); - for col in self.columns.columns() { - col_major_data.extend_from_slice(col); + match &self.storage { + TraceStorage::RowMajor(matrix) => matrix.clone(), + TraceStorage::Transposed { matrix, .. } => matrix.transpose(), + TraceStorage::Parts { + core_rm, + chiplets_rm, + range_checker_cols, + num_rows, + } => { + let h = *num_rows; + let w = PADDED_TRACE_WIDTH; + let cw = CHIPLETS_WIDTH; + let num_pad = PADDED_TRACE_WIDTH - CORE_WIDTH - 2 - cw; + + let total = h * w; + let mut data = Vec::with_capacity(total); + // SAFETY: the loop below writes exactly `h * w` elements. + #[allow(clippy::uninit_vec)] + unsafe { + data.set_len(total); + } + + let fill_rows = |chunk: &mut [Felt], start_row: usize| { + let chunk_rows = chunk.len() / w; + for i in 0..chunk_rows { + let row = start_row + i; + let dst = &mut chunk[i * w..(i + 1) * w]; + dst[..CORE_WIDTH] + .copy_from_slice(&core_rm[row * CORE_WIDTH..(row + 1) * CORE_WIDTH]); + dst[CORE_WIDTH] = range_checker_cols[0][row]; + dst[CORE_WIDTH + 1] = range_checker_cols[1][row]; + dst[CORE_WIDTH + 2..CORE_WIDTH + 2 + cw] + .copy_from_slice(&chiplets_rm[row * cw..(row + 1) * cw]); + for p in 0..num_pad { + dst[CORE_WIDTH + 2 + cw + p] = ZERO; + } + } + }; + + #[cfg(not(feature = "concurrent"))] + fill_rows(&mut data, 0); + + #[cfg(feature = "concurrent")] + { + use miden_crypto::parallel::*; + let rows_per_chunk = ROW_MAJOR_CHUNK_SIZE; + data.par_chunks_mut(rows_per_chunk * w).enumerate().for_each( + |(chunk_idx, chunk)| { + fill_rows(chunk, chunk_idx * rows_per_chunk); + }, + ); + } + + RowMajorMatrix::new(data, w) + }, + } + } + + /// Like [`to_row_major`](Self::to_row_major) but only the first `target_width` columns. + pub fn to_row_major_stripped(&self, target_width: usize) -> RowMajorMatrix { + match &self.storage { + TraceStorage::RowMajor(matrix) => { + let h = matrix.height(); + let w = matrix.width(); + debug_assert!(target_width <= w); + if target_width == w { + return matrix.clone(); + } + let total = h * target_width; + let mut data = Vec::with_capacity(total); + // SAFETY: the loop below writes exactly `h * target_width` elements. + #[allow(clippy::uninit_vec)] + unsafe { + data.set_len(total); + } + + #[cfg(not(feature = "concurrent"))] + for row in 0..h { + let src = matrix.row_slice(row).expect("row index in bounds"); + data[row * target_width..(row + 1) * target_width] + .copy_from_slice(&src[..target_width]); + } + + #[cfg(feature = "concurrent")] + { + use miden_crypto::parallel::*; + let rows_per_chunk = ROW_MAJOR_CHUNK_SIZE; + data.par_chunks_mut(rows_per_chunk * target_width).enumerate().for_each( + |(chunk_idx, chunk)| { + let chunk_rows = chunk.len() / target_width; + for i in 0..chunk_rows { + let row = chunk_idx * rows_per_chunk + i; + let src = matrix.row_slice(row).expect("row index in bounds"); + chunk[i * target_width..(i + 1) * target_width] + .copy_from_slice(&src[..target_width]); + } + }, + ); + } + + RowMajorMatrix::new(data, target_width) + }, + TraceStorage::Transposed { .. } => { + let full = self.to_row_major(); + if target_width == full.width() { + return full; + } + let h = full.height(); + let total = h * target_width; + let mut data = Vec::with_capacity(total); + // SAFETY: the loop below writes exactly `h * target_width` elements. + #[allow(clippy::uninit_vec)] + unsafe { + data.set_len(total); + } + for row in 0..h { + let src = full.row_slice(row).expect("row index in bounds"); + data[row * target_width..(row + 1) * target_width] + .copy_from_slice(&src[..target_width]); + } + RowMajorMatrix::new(data, target_width) + }, + TraceStorage::Parts { + core_rm, + chiplets_rm, + range_checker_cols, + num_rows, + } => { + let h = *num_rows; + let cw = CHIPLETS_WIDTH; + debug_assert!(target_width >= CORE_WIDTH); + let nc_needed = target_width - CORE_WIDTH; + + let total = h * target_width; + let mut data = Vec::with_capacity(total); + // SAFETY: the loop below writes exactly `h * target_width` elements. + #[allow(clippy::uninit_vec)] + unsafe { + data.set_len(total); + } + + let fill_rows = |chunk: &mut [Felt], start_row: usize| { + let chunk_rows = chunk.len() / target_width; + for i in 0..chunk_rows { + let row = start_row + i; + let dst = &mut chunk[i * target_width..(i + 1) * target_width]; + dst[..CORE_WIDTH] + .copy_from_slice(&core_rm[row * CORE_WIDTH..(row + 1) * CORE_WIDTH]); + let nc_dst = &mut dst[CORE_WIDTH..]; + let mut nc_pos = 0; + for col in &range_checker_cols[..RANGE_CHECK_TRACE_WIDTH.min(nc_needed)] { + nc_dst[nc_pos] = col[row]; + nc_pos += 1; + } + if nc_pos < nc_needed { + let chip_cols = (nc_needed - nc_pos).min(cw); + nc_dst[nc_pos..nc_pos + chip_cols] + .copy_from_slice(&chiplets_rm[row * cw..row * cw + chip_cols]); + nc_pos += chip_cols; + } + for dst in &mut dst[nc_pos..nc_needed] { + *dst = ZERO; + } + } + }; + + #[cfg(not(feature = "concurrent"))] + fill_rows(&mut data, 0); + + #[cfg(feature = "concurrent")] + { + use miden_crypto::parallel::*; + let rows_per_chunk = ROW_MAJOR_CHUNK_SIZE; + data.par_chunks_mut(rows_per_chunk * target_width).enumerate().for_each( + |(chunk_idx, chunk)| { + fill_rows(chunk, chunk_idx * rows_per_chunk); + }, + ); + } + + RowMajorMatrix::new(data, target_width) + }, } - // Treat the flat column-major data as a "row-major" matrix with width = num_rows - // (i.e. each "row" is one original column), then transpose to get true row-major. - RowMajorMatrix::new(col_major_data, num_rows).transpose() } pub fn num_rows(&self) -> usize { - self.columns.num_rows() + match &self.storage { + TraceStorage::Parts { num_rows, .. } => *num_rows, + TraceStorage::RowMajor(matrix) => matrix.height(), + TraceStorage::Transposed { num_rows, .. } => *num_rows, + } } pub fn last_program_row(&self) -> RowIndex { self.last_program_row } + /// Copies one logical row into `row` (must be at least as long as the stored width). + pub fn read_row_into(&self, row_idx: usize, row: &mut [Felt]) { + let w = self.width(); + assert!(row.len() >= w, "row buffer too small for main trace"); + match &self.storage { + TraceStorage::RowMajor(matrix) => { + let slice = matrix.row_slice(row_idx).expect("row index in bounds"); + row[..w].copy_from_slice(&slice); + }, + TraceStorage::Parts { + core_rm, chiplets_rm, range_checker_cols, .. + } => { + row[..CORE_WIDTH] + .copy_from_slice(&core_rm[row_idx * CORE_WIDTH..(row_idx + 1) * CORE_WIDTH]); + row[CORE_WIDTH] = range_checker_cols[0][row_idx]; + row[CORE_WIDTH + 1] = range_checker_cols[1][row_idx]; + row[CORE_WIDTH + 2..CORE_WIDTH + 2 + CHIPLETS_WIDTH].copy_from_slice( + &chiplets_rm[row_idx * CHIPLETS_WIDTH..(row_idx + 1) * CHIPLETS_WIDTH], + ); + for dst in &mut row[CORE_WIDTH + 2 + CHIPLETS_WIDTH..w] { + *dst = ZERO; + } + }, + TraceStorage::Transposed { matrix, num_cols, .. } => { + for (col_idx, cell) in row[..*num_cols].iter_mut().enumerate() { + *cell = unsafe { matrix.get_unchecked(col_idx, row_idx) }; + } + }, + } + } + + /// Returns one column as a new vector. + pub fn get_column(&self, col_idx: usize) -> Vec { + let h = self.num_rows(); + match &self.storage { + TraceStorage::Parts { + core_rm, chiplets_rm, range_checker_cols, .. + } => { + if col_idx < CORE_WIDTH { + (0..h).map(|r| core_rm[r * CORE_WIDTH + col_idx]).collect() + } else { + let nc = col_idx - CORE_WIDTH; + if nc < 2 { + range_checker_cols[nc].clone() + } else if nc < 2 + CHIPLETS_WIDTH { + let cc = nc - 2; + (0..h).map(|r| chiplets_rm[r * CHIPLETS_WIDTH + cc]).collect() + } else { + vec![ZERO; h] + } + } + }, + TraceStorage::RowMajor(_) => { + (0..h).map(|r| self.get(RowIndex::from(r), col_idx)).collect() + }, + TraceStorage::Transposed { matrix, .. } => { + let row_slice = matrix.row_slice(col_idx).expect("column index in bounds"); + row_slice[..h].to_vec() + }, + } + } + + /// Iterates over all columns (materialises each one). + pub fn columns(&self) -> impl Iterator> + '_ { + (0..self.width()).map(|c| self.get_column(c)) + } + #[cfg(any(test, feature = "testing"))] pub fn get_column_range(&self, range: Range) -> Vec> { range.fold(vec![], |mut acc, col_idx| { - acc.push(self.get_column(col_idx).to_vec()); + acc.push(self.get_column(col_idx)); acc }) } @@ -142,12 +500,12 @@ impl MainTrace { /// Returns the value of the clk column at row i. pub fn clk(&self, i: RowIndex) -> Felt { - self.columns.get_column(CLK_COL_IDX)[i] + self.get(i, CLK_COL_IDX) } /// Returns the value of the ctx column at row i. pub fn ctx(&self, i: RowIndex) -> Felt { - self.columns.get_column(CTX_COL_IDX)[i] + self.get(i, CTX_COL_IDX) } // DECODER COLUMNS @@ -155,7 +513,7 @@ impl MainTrace { /// Returns the value in the block address column at the row i. pub fn addr(&self, i: RowIndex) -> Felt { - self.columns.get_column(DECODER_TRACE_OFFSET)[i] + self.get(i, DECODER_TRACE_OFFSET) } /// Helper method to detect change of address. @@ -165,15 +523,14 @@ impl MainTrace { /// The i-th decoder helper register at `row`. pub fn helper_register(&self, i: usize, row: RowIndex) -> Felt { - self.columns.get_column(DECODER_TRACE_OFFSET + USER_OP_HELPERS_OFFSET + i)[row] + self.get(row, DECODER_TRACE_OFFSET + USER_OP_HELPERS_OFFSET + i) } /// Returns the hasher state at row i. pub fn decoder_hasher_state(&self, i: RowIndex) -> [Felt; NUM_HASHER_COLUMNS] { let mut state = [ZERO; NUM_HASHER_COLUMNS]; for (idx, col_idx) in DECODER_HASHER_RANGE.enumerate() { - let column = self.columns.get_column(col_idx); - state[idx] = column[i]; + state[idx] = self.get(i, col_idx); } state } @@ -182,7 +539,7 @@ impl MainTrace { pub fn decoder_hasher_state_first_half(&self, i: RowIndex) -> Word { let mut state = [ZERO; DIGEST_LEN]; for (col, s) in state.iter_mut().enumerate() { - *s = self.columns.get_column(DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + col)[i]; + *s = self.get(i, DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + col); } state.into() } @@ -192,62 +549,59 @@ impl MainTrace { const SECOND_WORD_OFFSET: usize = 4; let mut state = [ZERO; DIGEST_LEN]; for (col, s) in state.iter_mut().enumerate() { - *s = self - .columns - .get_column(DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + SECOND_WORD_OFFSET + col) - [i]; + *s = self.get(i, DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + SECOND_WORD_OFFSET + col); } state.into() } /// Returns a specific element from the hasher state at row i. pub fn decoder_hasher_state_element(&self, element: usize, i: RowIndex) -> Felt { - self.columns.get_column(DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + element)[i] + self.get(i, DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + element) } /// Returns the current function hash (i.e., root) at row i. pub fn fn_hash(&self, i: RowIndex) -> [Felt; DIGEST_LEN] { let mut state = [ZERO; DIGEST_LEN]; for (col, s) in state.iter_mut().enumerate() { - *s = self.columns.get_column(FN_HASH_OFFSET + col)[i]; + *s = self.get(i, FN_HASH_OFFSET + col); } state } /// Returns the `is_loop_body` flag at row i. pub fn is_loop_body_flag(&self, i: RowIndex) -> Felt { - self.columns.get_column(DECODER_TRACE_OFFSET + IS_LOOP_BODY_FLAG_COL_IDX)[i] + self.get(i, DECODER_TRACE_OFFSET + IS_LOOP_BODY_FLAG_COL_IDX) } /// Returns the `is_loop` flag at row i. pub fn is_loop_flag(&self, i: RowIndex) -> Felt { - self.columns.get_column(DECODER_TRACE_OFFSET + IS_LOOP_FLAG_COL_IDX)[i] + self.get(i, DECODER_TRACE_OFFSET + IS_LOOP_FLAG_COL_IDX) } /// Returns the `is_call` flag at row i. pub fn is_call_flag(&self, i: RowIndex) -> Felt { - self.columns.get_column(DECODER_TRACE_OFFSET + IS_CALL_FLAG_COL_IDX)[i] + self.get(i, DECODER_TRACE_OFFSET + IS_CALL_FLAG_COL_IDX) } /// Returns the `is_syscall` flag at row i. pub fn is_syscall_flag(&self, i: RowIndex) -> Felt { - self.columns.get_column(DECODER_TRACE_OFFSET + IS_SYSCALL_FLAG_COL_IDX)[i] + self.get(i, DECODER_TRACE_OFFSET + IS_SYSCALL_FLAG_COL_IDX) } /// Returns the operation batch flags at row i. This indicates the number of op groups in /// the current batch that is being processed. pub fn op_batch_flag(&self, i: RowIndex) -> [Felt; NUM_OP_BATCH_FLAGS] { [ - self.columns.get(DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET, i.into()), - self.columns.get(DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET + 1, i.into()), - self.columns.get(DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET + 2, i.into()), + self.get(i, DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET), + self.get(i, DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET + 1), + self.get(i, DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET + 2), ] } /// Returns the operation group count. This indicates the number of operation that remain /// to be executed in the current span block. pub fn group_count(&self, i: RowIndex) -> Felt { - self.columns.get_column(DECODER_TRACE_OFFSET + GROUP_COUNT_COL_IDX)[i] + self.get(i, DECODER_TRACE_OFFSET + GROUP_COUNT_COL_IDX) } /// Returns the delta between the current and next group counts. @@ -257,20 +611,18 @@ impl MainTrace { /// Returns the `in_span` flag at row i. pub fn is_in_span(&self, i: RowIndex) -> Felt { - self.columns.get_column(DECODER_TRACE_OFFSET + IN_SPAN_COL_IDX)[i] + self.get(i, DECODER_TRACE_OFFSET + IN_SPAN_COL_IDX) } /// Constructs the i-th op code value from its individual bits. pub fn get_op_code(&self, i: RowIndex) -> Felt { - let col_b0 = self.columns.get_column(DECODER_TRACE_OFFSET + 1); - let col_b1 = self.columns.get_column(DECODER_TRACE_OFFSET + 2); - let col_b2 = self.columns.get_column(DECODER_TRACE_OFFSET + 3); - let col_b3 = self.columns.get_column(DECODER_TRACE_OFFSET + 4); - let col_b4 = self.columns.get_column(DECODER_TRACE_OFFSET + 5); - let col_b5 = self.columns.get_column(DECODER_TRACE_OFFSET + 6); - let col_b6 = self.columns.get_column(DECODER_TRACE_OFFSET + 7); - let [b0, b1, b2, b3, b4, b5, b6] = - [col_b0[i], col_b1[i], col_b2[i], col_b3[i], col_b4[i], col_b5[i], col_b6[i]]; + let b0 = self.get(i, DECODER_TRACE_OFFSET + 1); + let b1 = self.get(i, DECODER_TRACE_OFFSET + 2); + let b2 = self.get(i, DECODER_TRACE_OFFSET + 3); + let b3 = self.get(i, DECODER_TRACE_OFFSET + 4); + let b4 = self.get(i, DECODER_TRACE_OFFSET + 5); + let b5 = self.get(i, DECODER_TRACE_OFFSET + 6); + let b6 = self.get(i, DECODER_TRACE_OFFSET + 7); b0 + b1 * Felt::from_u64(2) + b2 * Felt::from_u64(4) + b3 * Felt::from_u64(8) @@ -287,15 +639,15 @@ impl MainTrace { /// Returns a flag indicating whether the current operation induces a left shift of the operand /// stack. pub fn is_left_shift(&self, i: RowIndex) -> bool { - let b0 = self.columns.get(DECODER_TRACE_OFFSET + 1, i.into()); - let b1 = self.columns.get(DECODER_TRACE_OFFSET + 2, i.into()); - let b2 = self.columns.get(DECODER_TRACE_OFFSET + 3, i.into()); - let b3 = self.columns.get(DECODER_TRACE_OFFSET + 4, i.into()); - let b4 = self.columns.get(DECODER_TRACE_OFFSET + 5, i.into()); - let b5 = self.columns.get(DECODER_TRACE_OFFSET + 6, i.into()); - let b6 = self.columns.get(DECODER_TRACE_OFFSET + 7, i.into()); - let e0 = self.columns.get(DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET, i.into()); - let h5 = self.columns.get(DECODER_TRACE_OFFSET + IS_LOOP_FLAG_COL_IDX, i.into()); + let b0 = self.get(i, DECODER_TRACE_OFFSET + 1); + let b1 = self.get(i, DECODER_TRACE_OFFSET + 2); + let b2 = self.get(i, DECODER_TRACE_OFFSET + 3); + let b3 = self.get(i, DECODER_TRACE_OFFSET + 4); + let b4 = self.get(i, DECODER_TRACE_OFFSET + 5); + let b5 = self.get(i, DECODER_TRACE_OFFSET + 6); + let b6 = self.get(i, DECODER_TRACE_OFFSET + 7); + let e0 = self.get(i, DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET); + let h5 = self.get(i, DECODER_TRACE_OFFSET + IS_LOOP_FLAG_COL_IDX); // group with left shift effect grouped by a common prefix ([b6, b5, b4] == [ZERO, ONE, ZERO])|| @@ -314,13 +666,13 @@ impl MainTrace { /// Returns a flag indicating whether the current operation induces a right shift of the operand /// stack. pub fn is_right_shift(&self, i: RowIndex) -> bool { - let b0 = self.columns.get(DECODER_TRACE_OFFSET + 1, i.into()); - let b1 = self.columns.get(DECODER_TRACE_OFFSET + 2, i.into()); - let b2 = self.columns.get(DECODER_TRACE_OFFSET + 3, i.into()); - let b3 = self.columns.get(DECODER_TRACE_OFFSET + 4, i.into()); - let b4 = self.columns.get(DECODER_TRACE_OFFSET + 5, i.into()); - let b5 = self.columns.get(DECODER_TRACE_OFFSET + 6, i.into()); - let b6 = self.columns.get(DECODER_TRACE_OFFSET + 7, i.into()); + let b0 = self.get(i, DECODER_TRACE_OFFSET + 1); + let b1 = self.get(i, DECODER_TRACE_OFFSET + 2); + let b2 = self.get(i, DECODER_TRACE_OFFSET + 3); + let b3 = self.get(i, DECODER_TRACE_OFFSET + 4); + let b4 = self.get(i, DECODER_TRACE_OFFSET + 5); + let b5 = self.get(i, DECODER_TRACE_OFFSET + 6); + let b6 = self.get(i, DECODER_TRACE_OFFSET + 7); // group with right shift effect grouped by a common prefix [b6, b5, b4] == [ZERO, ONE, ONE]|| @@ -335,12 +687,12 @@ impl MainTrace { /// Returns the value of the stack depth column at row i. pub fn stack_depth(&self, i: RowIndex) -> Felt { - self.columns.get_column(STACK_TRACE_OFFSET + B0_COL_IDX)[i] + self.get(i, STACK_TRACE_OFFSET + B0_COL_IDX) } /// Returns the element at row i in a given stack trace column. pub fn stack_element(&self, column: usize, i: RowIndex) -> Felt { - self.columns.get_column(STACK_TRACE_OFFSET + column)[i] + self.get(i, STACK_TRACE_OFFSET + column) } /// Returns a word from the stack starting at `start` index at row i, in LE order. @@ -358,13 +710,13 @@ impl MainTrace { /// Returns the address of the top element in the stack overflow table at row i. pub fn parent_overflow_address(&self, i: RowIndex) -> Felt { - self.columns.get_column(STACK_TRACE_OFFSET + B1_COL_IDX)[i] + self.get(i, STACK_TRACE_OFFSET + B1_COL_IDX) } /// Returns a flag indicating whether the overflow stack is non-empty. pub fn is_non_empty_overflow(&self, i: RowIndex) -> bool { - let b0 = self.columns.get_column(STACK_TRACE_OFFSET + B0_COL_IDX)[i]; - let h0 = self.columns.get_column(STACK_TRACE_OFFSET + H0_COL_IDX)[i]; + let b0 = self.get(i, STACK_TRACE_OFFSET + B0_COL_IDX); + let h0 = self.get(i, STACK_TRACE_OFFSET + H0_COL_IDX); (b0 - Felt::from_u64(16)) * h0 == ONE } @@ -373,174 +725,210 @@ impl MainTrace { /// Returns chiplet column number 0 at row i. pub fn chiplet_selector_0(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET)[i] + self.get(i, CHIPLETS_OFFSET) } /// Returns chiplet column number 1 at row i. pub fn chiplet_selector_1(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + 1)[i] + self.get(i, CHIPLETS_OFFSET + 1) } /// Returns chiplet column number 2 at row i. pub fn chiplet_selector_2(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + 2)[i] + self.get(i, CHIPLETS_OFFSET + 2) } /// Returns chiplet column number 3 at row i. pub fn chiplet_selector_3(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + 3)[i] + self.get(i, CHIPLETS_OFFSET + 3) } /// Returns chiplet column number 4 at row i. pub fn chiplet_selector_4(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + 4)[i] + self.get(i, CHIPLETS_OFFSET + 4) } /// Returns chiplet column number 5 at row i. pub fn chiplet_selector_5(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + 5)[i] + self.get(i, CHIPLETS_OFFSET + 5) } - /// Returns `true` if a row is part of the hash chiplet. + /// Returns `true` if a row is part of the hash chiplet (controller or permutation). pub fn is_hash_row(&self, i: RowIndex) -> bool { - self.chiplet_selector_0(i) == ZERO + self.chiplet_selector_0(i) == ONE || self.chiplet_s_perm(i) == ONE } /// Returns the (full) state of the hasher chiplet at row i. pub fn chiplet_hasher_state(&self, i: RowIndex) -> [Felt; STATE_WIDTH] { let mut state = [ZERO; STATE_WIDTH]; for (idx, col_idx) in HASHER_STATE_COL_RANGE.enumerate() { - let column = self.columns.get_column(col_idx); - state[idx] = column[i]; + state[idx] = self.get(i, col_idx); } state } /// Returns the hasher's node index column at row i pub fn chiplet_node_index(&self, i: RowIndex) -> Felt { - self.columns.get(HASHER_NODE_INDEX_COL_IDX, i.into()) + self.get(i, HASHER_NODE_INDEX_COL_IDX) + } + + /// Returns the hasher's mrupdate_id column at row i (domain separator for sibling table). + pub fn chiplet_mrupdate_id(&self, i: RowIndex) -> Felt { + self.get(i, HASHER_MRUPDATE_ID_COL_IDX) + } + + /// Returns the hasher's is_boundary column at row i (1 on boundary rows: first input or last + /// output of an operation). + pub fn chiplet_is_boundary(&self, i: RowIndex) -> Felt { + self.get(i, HASHER_IS_BOUNDARY_COL_IDX) + } + + /// Returns the hasher's direction_bit column at row i. On Merkle controller rows this holds + /// the direction bit extracted from the node index; zero on non-Merkle and perm segment rows. + pub fn chiplet_direction_bit(&self, i: RowIndex) -> Felt { + self.get(i, HASHER_DIRECTION_BIT_COL_IDX) + } + + /// Returns the hasher's s_perm column at row i (0=controller, 1=permutation segment). + pub fn chiplet_s_perm(&self, i: RowIndex) -> Felt { + self.get(i, HASHER_S_PERM_COL_IDX) + } + + /// Returns the memory's word address low 16-bit limb at row i. + pub fn chiplet_memory_word_addr_lo(&self, i: RowIndex) -> Felt { + self.get(i, MEMORY_WORD_ADDR_LO_COL_IDX) + } + + /// Returns the memory's word address high 16-bit limb at row i. + pub fn chiplet_memory_word_addr_hi(&self, i: RowIndex) -> Felt { + self.get(i, MEMORY_WORD_ADDR_HI_COL_IDX) } /// Returns `true` if a row is part of the bitwise chiplet. + /// Active when virtual s0=1 (s_ctrl=0, s_perm=0) and s1=0. pub fn is_bitwise_row(&self, i: RowIndex) -> bool { - self.chiplet_selector_0(i) == ONE && self.chiplet_selector_1(i) == ZERO + self.chiplet_selector_0(i) == ZERO + && self.chiplet_s_perm(i) == ZERO + && self.chiplet_selector_1(i) == ZERO } /// Returns the bitwise column holding the aggregated value of input `a` at row i. pub fn chiplet_bitwise_a(&self, i: RowIndex) -> Felt { - self.columns.get_column(BITWISE_A_COL_IDX)[i] + self.get(i, BITWISE_A_COL_IDX) } /// Returns the bitwise column holding the aggregated value of input `b` at row i. pub fn chiplet_bitwise_b(&self, i: RowIndex) -> Felt { - self.columns.get_column(BITWISE_B_COL_IDX)[i] + self.get(i, BITWISE_B_COL_IDX) } /// Returns the bitwise column holding the aggregated value of the output at row i. pub fn chiplet_bitwise_z(&self, i: RowIndex) -> Felt { - self.columns.get_column(BITWISE_OUTPUT_COL_IDX)[i] + self.get(i, BITWISE_OUTPUT_COL_IDX) } /// Returns `true` if a row is part of the memory chiplet. + /// Active when virtual s0=1 (s_ctrl=0, s_perm=0) and s1=1, s2=0. pub fn is_memory_row(&self, i: RowIndex) -> bool { - self.chiplet_selector_0(i) == ONE + self.chiplet_selector_0(i) == ZERO + && self.chiplet_s_perm(i) == ZERO && self.chiplet_selector_1(i) == ONE && self.chiplet_selector_2(i) == ZERO } /// Returns the i-th row of the chiplet column containing memory context. pub fn chiplet_memory_ctx(&self, i: RowIndex) -> Felt { - self.columns.get_column(MEMORY_CTX_COL_IDX)[i] + self.get(i, MEMORY_CTX_COL_IDX) } /// Returns the i-th row of the chiplet column containing memory address. pub fn chiplet_memory_word(&self, i: RowIndex) -> Felt { - self.columns.get_column(MEMORY_WORD_COL_IDX)[i] + self.get(i, MEMORY_WORD_COL_IDX) } /// Returns the i-th row of the chiplet column containing 0th bit of the word index. pub fn chiplet_memory_idx0(&self, i: RowIndex) -> Felt { - self.columns.get_column(MEMORY_IDX0_COL_IDX)[i] + self.get(i, MEMORY_IDX0_COL_IDX) } /// Returns the i-th row of the chiplet column containing 1st bit of the word index. pub fn chiplet_memory_idx1(&self, i: RowIndex) -> Felt { - self.columns.get_column(MEMORY_IDX1_COL_IDX)[i] + self.get(i, MEMORY_IDX1_COL_IDX) } /// Returns the i-th row of the chiplet column containing clock cycle. pub fn chiplet_memory_clk(&self, i: RowIndex) -> Felt { - self.columns.get_column(MEMORY_CLK_COL_IDX)[i] + self.get(i, MEMORY_CLK_COL_IDX) } /// Returns the i-th row of the chiplet column containing the zeroth memory value element. pub fn chiplet_memory_value_0(&self, i: RowIndex) -> Felt { - self.columns.get_column(MEMORY_V_COL_RANGE.start)[i] + self.get(i, MEMORY_V_COL_RANGE.start) } /// Returns the i-th row of the chiplet column containing the first memory value element. pub fn chiplet_memory_value_1(&self, i: RowIndex) -> Felt { - self.columns.get_column(MEMORY_V_COL_RANGE.start + 1)[i] + self.get(i, MEMORY_V_COL_RANGE.start + 1) } /// Returns the i-th row of the chiplet column containing the second memory value element. pub fn chiplet_memory_value_2(&self, i: RowIndex) -> Felt { - self.columns.get_column(MEMORY_V_COL_RANGE.start + 2)[i] + self.get(i, MEMORY_V_COL_RANGE.start + 2) } /// Returns the i-th row of the chiplet column containing the third memory value element. pub fn chiplet_memory_value_3(&self, i: RowIndex) -> Felt { - self.columns.get_column(MEMORY_V_COL_RANGE.start + 3)[i] + self.get(i, MEMORY_V_COL_RANGE.start + 3) } /// Returns `true` if a row is part of the ACE chiplet. + /// Active when virtual s0=1 (s_ctrl=0, s_perm=0) and s1=1, s2=1, s3=0. pub fn is_ace_row(&self, i: RowIndex) -> bool { - self.chiplet_selector_0(i) == ONE + self.chiplet_selector_0(i) == ZERO + && self.chiplet_s_perm(i) == ZERO && self.chiplet_selector_1(i) == ONE && self.chiplet_selector_2(i) == ONE && self.chiplet_selector_3(i) == ZERO } pub fn chiplet_ace_start_selector(&self, i: RowIndex) -> Felt { - self.columns - .get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + SELECTOR_START_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + SELECTOR_START_IDX) } pub fn chiplet_ace_block_selector(&self, i: RowIndex) -> Felt { - self.columns - .get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + SELECTOR_BLOCK_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + SELECTOR_BLOCK_IDX) } pub fn chiplet_ace_ctx(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + CTX_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + CTX_IDX) } pub fn chiplet_ace_ptr(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + PTR_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + PTR_IDX) } pub fn chiplet_ace_clk(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + CLK_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + CLK_IDX) } pub fn chiplet_ace_eval_op(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + EVAL_OP_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + EVAL_OP_IDX) } pub fn chiplet_ace_num_eval_rows(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + READ_NUM_EVAL_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + READ_NUM_EVAL_IDX) } pub fn chiplet_ace_id_0(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + ID_0_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + ID_0_IDX) } pub fn chiplet_ace_v_0_0(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_0_0_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_0_0_IDX) } pub fn chiplet_ace_v_0_1(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_0_1_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_0_1_IDX) } pub fn chiplet_ace_wire_0(&self, i: RowIndex) -> [Felt; 3] { @@ -552,15 +940,15 @@ impl MainTrace { } pub fn chiplet_ace_id_1(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + ID_1_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + ID_1_IDX) } pub fn chiplet_ace_v_1_0(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_1_0_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_1_0_IDX) } pub fn chiplet_ace_v_1_1(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_1_1_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_1_1_IDX) } pub fn chiplet_ace_wire_1(&self, i: RowIndex) -> [Felt; 3] { @@ -572,15 +960,15 @@ impl MainTrace { } pub fn chiplet_ace_id_2(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + ID_2_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + ID_2_IDX) } pub fn chiplet_ace_v_2_0(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_2_0_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_2_0_IDX) } pub fn chiplet_ace_v_2_1(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_2_1_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + V_2_1_IDX) } pub fn chiplet_ace_wire_2(&self, i: RowIndex) -> [Felt; 3] { @@ -592,11 +980,11 @@ impl MainTrace { } pub fn chiplet_ace_m_1(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + M_1_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + M_1_IDX) } pub fn chiplet_ace_m_0(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + NUM_ACE_SELECTORS + M_0_IDX)[i] + self.get(i, CHIPLETS_OFFSET + NUM_ACE_SELECTORS + M_0_IDX) } pub fn chiplet_ace_is_read_row(&self, i: RowIndex) -> bool { @@ -608,8 +996,10 @@ impl MainTrace { } /// Returns `true` if a row is part of the kernel chiplet. + /// Active when virtual s0=1 (s_ctrl=0, s_perm=0) and s1=1, s2=1, s3=1, s4=0. pub fn is_kernel_row(&self, i: RowIndex) -> bool { - self.chiplet_selector_0(i) == ONE + self.chiplet_selector_0(i) == ZERO + && self.chiplet_s_perm(i) == ZERO && self.chiplet_selector_1(i) == ONE && self.chiplet_selector_2(i) == ONE && self.chiplet_selector_3(i) == ONE @@ -619,73 +1009,64 @@ impl MainTrace { /// Returns true when the i-th row of the `s_first` column in the kernel chiplet is one, i.e., /// when this is the first row in a range of rows containing the same kernel proc hash. pub fn chiplet_kernel_is_first_hash_row(&self, i: RowIndex) -> bool { - self.columns.get_column(CHIPLETS_OFFSET + 5)[i] == ONE + self.get(i, CHIPLETS_OFFSET + 5) == ONE } /// Returns the i-th row of the chiplet column containing the zeroth element of the kernel /// procedure root. pub fn chiplet_kernel_root_0(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + 6)[i] + self.get(i, CHIPLETS_OFFSET + 6) } /// Returns the i-th row of the chiplet column containing the first element of the kernel /// procedure root. pub fn chiplet_kernel_root_1(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + 7)[i] + self.get(i, CHIPLETS_OFFSET + 7) } /// Returns the i-th row of the chiplet column containing the second element of the kernel /// procedure root. pub fn chiplet_kernel_root_2(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + 8)[i] + self.get(i, CHIPLETS_OFFSET + 8) } /// Returns the i-th row of the chiplet column containing the third element of the kernel /// procedure root. pub fn chiplet_kernel_root_3(&self, i: RowIndex) -> Felt { - self.columns.get_column(CHIPLETS_OFFSET + 9)[i] + self.get(i, CHIPLETS_OFFSET + 9) } - // MERKLE PATH HASHING SELECTORS + // MERKLE ROOT UPDATE SELECTORS // -------------------------------------------------------------------------------------------- - - /// Returns `true` if the hasher chiplet flags indicate the initialization of verifying - /// a Merkle path to an old node during Merkle root update procedure (MRUPDATE). + // + // The MRUPDATE operation has two legs, each traversing the same Merkle path: + // - MV (Merkle Verify old path): inserts siblings into the sibling table + // - MU (Merkle Update new path): removes siblings from the sibling table + // + // MPVERIFY (read-only path verification) does not interact with the sibling table. + + /// Returns `true` if row `i` is an MR_UPDATE_OLD (Merkle Verify) hasher controller input row. + /// + /// These rows appear during the old-path leg of a Merkle root update (MRUPDATE). Each + /// MV input row inserts a sibling into the virtual sibling table via the hash_kernel bus. pub fn f_mv(&self, i: RowIndex) -> bool { - i.as_usize().is_multiple_of(HASH_CYCLE_LEN) - && self.chiplet_selector_0(i) == ZERO - && self.chiplet_selector_1(i) == ONE - && self.chiplet_selector_2(i) == ONE - && self.chiplet_selector_3(i) == ZERO + self.chiplet_selector_0(i) == ONE // s_ctrl=1 (controller row) + && self.chiplet_s_perm(i) == ZERO // controller region + && self.chiplet_selector_1(i) == ONE // s0=1 (input row) + && self.chiplet_selector_2(i) == ONE // s1=1 (MR_UPDATE_OLD) + && self.chiplet_selector_3(i) == ZERO // s2=0 } - /// Returns `true` if the hasher chiplet flags indicate the continuation of verifying - /// a Merkle path to an old node during Merkle root update procedure (MRUPDATE). - pub fn f_mva(&self, i: RowIndex) -> bool { - (i.as_usize() % HASH_CYCLE_LEN == LAST_CYCLE_ROW) - && self.chiplet_selector_0(i) == ZERO - && self.chiplet_selector_1(i) == ONE - && self.chiplet_selector_2(i) == ONE - && self.chiplet_selector_3(i) == ZERO - } - - /// Returns `true` if the hasher chiplet flags indicate the initialization of verifying - /// a Merkle path to a new node during Merkle root update procedure (MRUPDATE). + /// Returns `true` if row `i` is an MR_UPDATE_NEW (Merkle Update) hasher controller input row. + /// + /// These rows appear during the new-path leg of a Merkle root update (MRUPDATE). Each + /// MU input row removes a sibling from the virtual sibling table via the hash_kernel bus. + /// The sibling table balance ensures the old and new paths use the same siblings. pub fn f_mu(&self, i: RowIndex) -> bool { - i.as_usize().is_multiple_of(HASH_CYCLE_LEN) - && self.chiplet_selector_0(i) == ZERO - && self.chiplet_selector_1(i) == ONE - && self.chiplet_selector_2(i) == ONE - && self.chiplet_selector_3(i) == ONE - } - - /// Returns `true` if the hasher chiplet flags indicate the continuation of verifying - /// a Merkle path to a new node during Merkle root update procedure (MRUPDATE). - pub fn f_mua(&self, i: RowIndex) -> bool { - (i.as_usize() % HASH_CYCLE_LEN == LAST_CYCLE_ROW) - && self.chiplet_selector_0(i) == ZERO - && self.chiplet_selector_1(i) == ONE - && self.chiplet_selector_2(i) == ONE - && self.chiplet_selector_3(i) == ONE + self.chiplet_selector_0(i) == ONE // s_ctrl=1 (controller row) + && self.chiplet_s_perm(i) == ZERO // controller region + && self.chiplet_selector_1(i) == ONE // s0=1 (input row) + && self.chiplet_selector_2(i) == ONE // s1=1 (MR_UPDATE_NEW) + && self.chiplet_selector_3(i) == ONE // s2=1 } } diff --git a/air/src/trace/mod.rs b/air/src/trace/mod.rs index 7086da5430..9845240e6d 100644 --- a/air/src/trace/mod.rs +++ b/air/src/trace/mod.rs @@ -28,7 +28,7 @@ pub const MIN_TRACE_LEN: usize = 64; // ------------------------------------------------------------------------------------------------ // system decoder stack range checks chiplets -// (6 columns) (24 columns) (19 columns) (2 columns) (20 columns) +// (6 columns) (24 columns) (19 columns) (2 columns) (21 columns) // ├───────────────┴───────────────┴───────────────┴───────────────┴─────────────────┤ pub const SYS_TRACE_OFFSET: usize = 0; @@ -114,7 +114,7 @@ pub const RANGE_CHECK_TRACE_RANGE: Range = // Chiplets trace pub const CHIPLETS_OFFSET: usize = RANGE_CHECK_TRACE_RANGE.end; -pub const CHIPLETS_WIDTH: usize = 20; +pub const CHIPLETS_WIDTH: usize = 21; pub const CHIPLETS_RANGE: Range = range(CHIPLETS_OFFSET, CHIPLETS_WIDTH); /// Shared chiplet selector columns at the start of the chiplets segment. @@ -188,11 +188,11 @@ pub const MAX_MESSAGE_WIDTH: usize = 16; /// Bus message coefficient indices. /// /// These define the standard positions for encoding bus messages using the pattern: -/// `alpha + sum(beta_powers\[i\] * elem\[i\])` where: -/// - `alpha` is the randomness base (accessed directly as `.alpha`) +/// `bus_prefix[bus] + sum(beta_powers\[i\] * elem\[i\])` where: +/// - `bus_prefix[bus]` is the per-bus domain-separated base (see [`bus_types`]) /// - `beta_powers\[i\] = beta^i` are the powers of beta /// -/// These indices refer to positions in the `beta_powers` array, not including alpha. +/// These indices refer to positions in the `beta_powers` array, not including the bus prefix. /// /// This layout is shared between: /// - AIR constraint builders (symbolic expressions): `Challenges` @@ -232,3 +232,37 @@ pub mod bus_message { /// block messages). pub const CAPACITY_DOMAIN_IDX: usize = CAPACITY_START_IDX + 1; } + +/// Bus interaction type constants for domain separation. +/// +/// Each constant identifies a distinct bus interaction type. When encoding a message, +/// the bus index is passed to [`Challenges::encode`] or [`Challenges::encode_sparse`], +/// which uses `bus_prefix[bus]` as the additive base instead of bare `alpha`. +/// +/// This ensures messages from different buses are always distinct, even if they share +/// the same coefficient layout and labels. This is a prerequisite for a future unified bus. +pub mod bus_types { + /// All chiplet interactions: hasher, bitwise, memory, ACE, kernel ROM. + pub const CHIPLETS_BUS: usize = 0; + /// Block stack table (decoder p1): tracks control flow block nesting. + pub const BLOCK_STACK_TABLE: usize = 1; + /// Block hash table (decoder p2): tracks block digest computation. + pub const BLOCK_HASH_TABLE: usize = 2; + /// Op group table (decoder p3): tracks operation batch consumption. + pub const OP_GROUP_TABLE: usize = 3; + /// Stack overflow table. + pub const STACK_OVERFLOW_TABLE: usize = 4; + /// Sibling table: shares Merkle tree sibling nodes between old/new root computations. + pub const SIBLING_TABLE: usize = 5; + /// Log-precompile transcript: tracks capacity state transitions for LOGPRECOMPILE. + pub const LOG_PRECOMPILE_TRANSCRIPT: usize = 6; + /// Range checker bus (LogUp): verifies values are in the valid range. + pub const RANGE_CHECK_BUS: usize = 7; + /// ACE wiring bus (LogUp): verifies arithmetic circuit wire connections. + pub const ACE_WIRING_BUS: usize = 8; + /// Hasher perm-link bus: links hasher controller rows to permutation segment rows on + /// `v_wiring`. + pub const HASHER_PERM_LINK: usize = 9; + /// Total number of distinct bus interaction types. + pub const NUM_BUS_TYPES: usize = 10; +} diff --git a/air/src/trace/rows.rs b/air/src/trace/rows.rs index 521f401ad7..b2b3b6870b 100644 --- a/air/src/trace/rows.rs +++ b/air/src/trace/rows.rs @@ -1,4 +1,4 @@ -use alloc::boxed::Box; +use alloc::{boxed::Box, vec::Vec}; use core::{ fmt::{Display, Formatter}, ops::{Add, AddAssign, Bound, Index, IndexMut, Mul, RangeBounds, Sub, SubAssign}, @@ -271,6 +271,13 @@ impl IndexMut for [T] { } } +impl Index for Vec { + type Output = T; + fn index(&self, i: RowIndex) -> &Self::Output { + &self.as_slice()[i] + } +} + impl RangeBounds for RowIndex { fn start_bound(&self) -> Bound<&Self> { Bound::Included(self) diff --git a/air/tests/ace_codegen.rs b/air/tests/ace_codegen.rs new file mode 100644 index 0000000000..dc92fa0d1b --- /dev/null +++ b/air/tests/ace_codegen.rs @@ -0,0 +1,185 @@ +use miden_ace_codegen::{ + AceConfig, AceError, EXT_DEGREE, InputKey, LayoutKind, build_ace_circuit_for_air, + build_ace_dag_for_air, emit_circuit, + testing::{ + eval_dag, eval_folded_constraints, eval_periodic_values, eval_quotient, fill_inputs, + zps_for_chunk, + }, +}; +use miden_air::{LiftedAir, ProcessorAir}; +use miden_core::{Felt, field::QuadFelt}; +use miden_crypto::{ + field::{Field, PrimeCharacteristicRing}, + stark::air::symbolic::{AirLayout, SymbolicAirBuilder}, +}; + +#[test] +fn processor_air_dag_matches_manual_eval() { + let air = ProcessorAir; + let config = AceConfig { + num_quotient_chunks: 2, + num_vlpi_groups: 0, + layout: LayoutKind::Native, + }; + let artifacts = build_ace_dag_for_air::<_, Felt, QuadFelt>(&air, config).unwrap(); + let layout = artifacts.layout.clone(); + let inputs: Vec = fill_inputs(&layout); + let z_k = inputs[layout.index(InputKey::ZK).unwrap()]; + let periodic_values = eval_periodic_values::( + &LiftedAir::::periodic_columns(&air), + z_k, + ); + + let air_layout = AirLayout { + preprocessed_width: 0, + main_width: layout.counts.width, + num_public_values: layout.counts.num_public, + permutation_width: layout.counts.aux_width, + num_permutation_challenges: layout.counts.num_randomness, + num_permutation_values: LiftedAir::::num_aux_values(&air), + num_periodic_columns: layout.counts.num_periodic, + }; + let mut builder = SymbolicAirBuilder::::new(air_layout); + LiftedAir::::eval(&air, &mut builder); + + let acc = eval_folded_constraints( + &builder.base_constraints(), + &builder.extension_constraints(), + &builder.constraint_layout(), + &inputs, + &layout, + &periodic_values, + ); + let z_pow_n = inputs[layout.index(InputKey::ZPowN).unwrap()]; + let vanishing = z_pow_n - QuadFelt::ONE; + let expected = acc - eval_quotient::(&layout, &inputs) * vanishing; + + let actual = eval_dag(&artifacts.dag, &inputs, &layout).unwrap(); + assert_eq!(actual, expected); +} + +#[test] +fn processor_air_dag_rejects_mismatched_layout() { + let air = ProcessorAir; + let dag_config = AceConfig { + num_quotient_chunks: 8, + num_vlpi_groups: 0, + layout: LayoutKind::Native, + }; + let layout_config = AceConfig { + num_quotient_chunks: 1, + num_vlpi_groups: 0, + layout: LayoutKind::Native, + }; + + let dag = build_ace_dag_for_air::<_, Felt, QuadFelt>(&air, dag_config).unwrap().dag; + let wrong_layout = + build_ace_dag_for_air::<_, Felt, QuadFelt>(&air, layout_config).unwrap().layout; + let inputs: Vec = fill_inputs(&wrong_layout); + + let err = eval_dag(&dag, &inputs, &wrong_layout).unwrap_err(); + assert!( + matches!(err, AceError::InvalidInputLayout { .. }), + "expected InvalidInputLayout, got {err:?}" + ); +} + +#[test] +#[allow(clippy::print_stdout)] +fn processor_air_chiplet_rows() { + let air = ProcessorAir; + let config = AceConfig { + num_quotient_chunks: 8, + num_vlpi_groups: 1, + layout: LayoutKind::Masm, + }; + + let circuit = build_ace_circuit_for_air::<_, Felt, QuadFelt>(&air, config).unwrap(); + let encoded = circuit.to_ace().unwrap(); + let read_rows = encoded.num_read_rows(); + let eval_rows = encoded.num_eval_rows(); + let total_rows = read_rows + eval_rows; + + println!( + "ACE chiplet rows (ProcessorAir): read={}, eval={}, total={}, inputs={}, constants={}, nodes={}", + read_rows, + eval_rows, + total_rows, + encoded.num_inputs(), + encoded.num_constants(), + encoded.num_nodes() + ); +} + +#[test] +fn synthetic_ood_adjusts_quotient_to_zero() { + let config = AceConfig { + num_quotient_chunks: 8, + num_vlpi_groups: 0, + layout: LayoutKind::Masm, + }; + + let artifacts = + build_ace_dag_for_air::<_, Felt, QuadFelt>(&ProcessorAir, config).expect("ace dag"); + let circuit = emit_circuit(&artifacts.dag, artifacts.layout.clone()).expect("ace circuit"); + + let mut inputs: Vec = fill_inputs(&artifacts.layout); + let root = circuit.eval(&inputs).expect("circuit eval"); + + let z_pow_n = inputs[artifacts.layout.index(InputKey::ZPowN).unwrap()]; + let vanishing = z_pow_n - QuadFelt::ONE; + let zps_0 = zps_for_chunk::(&artifacts.layout, &inputs, 0); + let delta = root * (zps_0 * vanishing).inverse(); + + let idx = artifacts + .layout + .index(InputKey::QuotientChunkCoord { offset: 0, chunk: 0, coord: 0 }) + .unwrap(); + inputs[idx] += delta; + + let result = circuit.eval(&inputs).expect("circuit eval"); + assert!(result.is_zero(), "ACE circuit must evaluate to zero"); +} + +#[test] +fn quotient_next_inputs_do_not_affect_eval() { + let config = AceConfig { + num_quotient_chunks: 8, + num_vlpi_groups: 0, + layout: LayoutKind::Masm, + }; + + let artifacts = + build_ace_dag_for_air::<_, Felt, QuadFelt>(&ProcessorAir, config).expect("ace dag"); + let circuit = emit_circuit(&artifacts.dag, artifacts.layout.clone()).expect("ace circuit"); + + let mut inputs: Vec = fill_inputs(&artifacts.layout); + + let root = circuit.eval(&inputs).expect("circuit eval"); + let z_pow_n = inputs[artifacts.layout.index(InputKey::ZPowN).unwrap()]; + let vanishing = z_pow_n - QuadFelt::ONE; + let zps_0 = zps_for_chunk::(&artifacts.layout, &inputs, 0); + let delta = root * (zps_0 * vanishing).inverse(); + let idx = artifacts + .layout + .index(InputKey::QuotientChunkCoord { offset: 0, chunk: 0, coord: 0 }) + .unwrap(); + inputs[idx] += delta; + assert!( + circuit.eval(&inputs).expect("circuit eval").is_zero(), + "precondition: zero root" + ); + + for chunk in 0..artifacts.layout.counts.num_quotient_chunks { + for coord in 0..EXT_DEGREE { + let idx = artifacts + .layout + .index(InputKey::QuotientChunkCoord { offset: 1, chunk, coord }) + .unwrap(); + inputs[idx] += QuadFelt::from(Felt::new(123 + (chunk * 7 + coord) as u64)); + } + } + + let result = circuit.eval(&inputs).expect("circuit eval"); + assert!(result.is_zero(), "quotient_next should not affect ACE eval"); +} diff --git a/core/Cargo.toml b/core/Cargo.toml index a20aff1e14..acd5e8631a 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -67,6 +67,6 @@ criterion = { workspace = true } insta.workspace = true miden-test-serde-macros.workspace = true proptest.workspace = true -rstest = { version = "0.26" } +rstest = { workspace = true } serde_json = { workspace = true } miden-utils-testing.workspace = true diff --git a/core/src/chiplets/hasher.rs b/core/src/chiplets/hasher.rs index 067d25bdb8..717335b681 100644 --- a/core/src/chiplets/hasher.rs +++ b/core/src/chiplets/hasher.rs @@ -24,17 +24,19 @@ pub const STATE_WIDTH: usize = Hasher::STATE_WIDTH; /// Number of field elements in the rate portion of the hasher's state. pub const RATE_LEN: usize = 8; -/// Number of "round steps" used by the hasher chiplet per permutation. +/// Number of Poseidon2 step transitions used by the hasher reference schedule. /// /// For Poseidon2, we model the permutation as 31 step transitions. This corresponds to an -/// initial external linear layer, 4 initial external (partial) rounds, 22 internal (full) rounds, -/// and 4 terminal external (partial) rounds: +/// initial external linear layer, 4 initial external rounds, 22 internal rounds, and 4 terminal +/// external rounds: /// - step 0: initial external linear layer /// - steps 1..=4: initial external rounds /// - steps 5..=26: internal rounds /// - steps 27..=30: terminal external rounds /// -/// This yields a 32-row hasher cycle (input row + 31 steps). +/// The hasher chiplet packs this 31-step schedule into a 16-row permutation cycle, but the +/// stepwise reference API keeps the original 31-step numbering because it is convenient for tests +/// and cross-checking against the uncompressed permutation schedule. pub const NUM_ROUNDS: usize = 31; // PASS-THROUGH FUNCTIONS @@ -193,4 +195,83 @@ mod tests { assert_eq!(state_half2, state_full, "split application doesn't match full permutation"); } + + /// Verifies that the 16-row packed permutation schedule produces the same result + /// as the reference `apply_permutation`. + /// + /// The packed schedule: + /// - init + ext1 (merged) + /// - ext2, ext3, ext4 + /// - 7 x (3 packed internal rounds) + /// - int22 + ext5 (merged) + /// - ext6, ext7, ext8 + #[test] + fn packed_16row_matches_permutation() { + let test_states: [_; 3] = [ + [Felt::ZERO; STATE_WIDTH], + core::array::from_fn(|i| Felt::new(i as u64)), + [ + Felt::new(0x123456789abcdef0), + Felt::new(0xfedcba9876543210), + Felt::new(0x0011223344556677), + Felt::new(0x8899aabbccddeeff), + Felt::new(0xdeadbeefcafebabe), + Felt::new(0x1234567890abcdef), + Felt::new(0x1234567890abcdef), + Felt::new(0x0badc0debadf00d0), + Felt::new(0x1111111111111111), + Felt::new(0x2222222222222222), + Felt::new(0x3333333333333333), + Felt::new(0x4444444444444444), + ], + ]; + + for (idx, init_state) in test_states.iter().enumerate() { + let mut state = *init_state; + + // Init + ext1 (merged) + Hasher::apply_matmul_external(&mut state); + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_INITIAL[0]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + + // Ext2, ext3, ext4 + for r in 1..=3 { + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_INITIAL[r]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + } + + // 7 x (3 packed internal rounds) + for triple in 0..7_usize { + let base = triple * 3; + for k in 0..3 { + state[0] += Hasher::ARK_INT[base + k]; + state[0] = state[0].exp_const_u64::<7>(); + Hasher::matmul_internal(&mut state, Hasher::MAT_DIAG); + } + } + + // Int22 + ext5 (merged) + state[0] += Hasher::ARK_INT[21]; + state[0] = state[0].exp_const_u64::<7>(); + Hasher::matmul_internal(&mut state, Hasher::MAT_DIAG); + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_TERMINAL[0]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + + // Ext6, ext7, ext8 + for r in 1..=3 { + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_TERMINAL[r]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + } + + // Compare with reference + let mut reference = *init_state; + apply_permutation(&mut reference); + + assert_eq!(state, reference, "packed schedule mismatch for test state {idx}"); + } + } } diff --git a/core/src/mast/node/basic_block_node/mod.rs b/core/src/mast/node/basic_block_node/mod.rs index cf3d05dbbc..0d37bd1f40 100644 --- a/core/src/mast/node/basic_block_node/mod.rs +++ b/core/src/mast/node/basic_block_node/mod.rs @@ -115,7 +115,7 @@ impl BasicBlockNode { #[cfg(debug_assertions)] validate_decorators(operations.len(), &decorators); - let (op_batches, digest) = batch_and_hash_ops(operations); + let (op_batches, digest) = batch_and_hash_ops(&operations); // the prior line may have inserted some padding Noops in the op_batches // the decorator mapping should still point to the correct operation when that happens let reflowed_decorators = BasicBlockNode::adjust_decorators(decorators, &op_batches); @@ -1345,7 +1345,7 @@ impl core::ops::Index for PaddedToRawPrefix { } /// Groups the provided operations into batches and computes the hash of the block. -fn batch_and_hash_ops(ops: Vec) -> (Vec, Word) { +fn batch_and_hash_ops(ops: &[Operation]) -> (Vec, Word) { // Group the operations into batches. let batches = batch_ops(ops); @@ -1358,11 +1358,11 @@ fn batch_and_hash_ops(ops: Vec) -> (Vec, Word) { /// Groups the provided operations into batches as described in the docs for this module (i.e., up /// to 9 operations per group, and 8 groups per batch). -fn batch_ops(ops: Vec) -> Vec { +fn batch_ops(ops: &[Operation]) -> Vec { let mut batches = Vec::::new(); let mut batch_acc = OpBatchAccumulator::new(); - for op in ops { + for op in ops.iter().copied() { // If the operation cannot be accepted into the current accumulator, add the contents of // the accumulator to the list of batches and start a new accumulator. if !batch_acc.can_accept_op(op) { @@ -1459,7 +1459,7 @@ impl BasicBlockNodeBuilder { #[cfg(debug_assertions)] validate_decorators(operations.len(), &decorators); - let (op_batches, computed_digest) = batch_and_hash_ops(operations); + let (op_batches, computed_digest) = batch_and_hash_ops(&operations); // Batch operations (adds padding NOOPs) // Adjust decorators from raw to padded indices let padded_decorators = BasicBlockNode::adjust_decorators(decorators, &op_batches); @@ -1521,7 +1521,7 @@ impl BasicBlockNodeBuilder { } // Batch operations (adds padding NOOPs) - let (op_batches, computed_digest) = batch_and_hash_ops(operations); + let (op_batches, computed_digest) = batch_and_hash_ops(&operations); // Use the forced digest if provided, otherwise use the computed digest let digest = self.digest.unwrap_or(computed_digest); @@ -1572,7 +1572,7 @@ impl MastForestContributor for BasicBlockNodeBuilder { validate_decorators(operations.len(), &decorators); // Batch operations (adds padding NOOPs) - let (op_batches, computed_digest) = batch_and_hash_ops(operations); + let (op_batches, computed_digest) = batch_and_hash_ops(&operations); // Use the forced digest if provided, otherwise use the computed digest let digest = self.digest.unwrap_or(computed_digest); @@ -1628,7 +1628,7 @@ impl MastForestContributor for BasicBlockNodeBuilder { let (op_batches, digest, raw_decorators) = match &self.operation_data { OperationData::Raw { operations, decorators } => { // Compute digest - use forced digest if available, otherwise compute normally - let (op_batches, computed_digest) = batch_and_hash_ops(operations.clone()); + let (op_batches, computed_digest) = batch_and_hash_ops(operations); let digest = self.digest.unwrap_or(computed_digest); // Decorators are already in raw form - no conversion needed diff --git a/core/src/mast/node/basic_block_node/tests.rs b/core/src/mast/node/basic_block_node/tests.rs index dd0962a8cb..1c8b9976a3 100644 --- a/core/src/mast/node/basic_block_node/tests.rs +++ b/core/src/mast/node/basic_block_node/tests.rs @@ -14,7 +14,7 @@ use crate::{ fn batch_ops_1() { // --- one operation ---------------------------------------------------------------------- let ops = vec![Operation::Add]; - let (batches, hash) = super::batch_and_hash_ops(ops.clone()); + let (batches, hash) = super::batch_and_hash_ops(&ops); insta::assert_debug_snapshot!(batches); insta::assert_debug_snapshot!(build_group_chunks(&batches).collect::>()); @@ -28,7 +28,7 @@ fn batch_ops_1() { fn batch_ops_2() { // --- two operations --------------------------------------------------------------------- let ops = vec![Operation::Add, Operation::Mul]; - let (batches, hash) = super::batch_and_hash_ops(ops.clone()); + let (batches, hash) = super::batch_and_hash_ops(&ops); insta::assert_debug_snapshot!(batches); insta::assert_debug_snapshot!(build_group_chunks(&batches).collect::>()); @@ -42,7 +42,7 @@ fn batch_ops_2() { fn batch_ops_3() { // --- one group with one immediate value ------------------------------------------------- let ops = vec![Operation::Add, Operation::Push(Felt::new(12345678))]; - let (batches, hash) = super::batch_and_hash_ops(ops.clone()); + let (batches, hash) = super::batch_and_hash_ops(&ops); insta::assert_debug_snapshot!(batches); insta::assert_debug_snapshot!(build_group_chunks(&batches).collect::>()); @@ -66,7 +66,7 @@ fn batch_ops_4() { Operation::Push(Felt::new(7)), Operation::Add, ]; - let (batches, hash) = super::batch_and_hash_ops(ops.clone()); + let (batches, hash) = super::batch_and_hash_ops(&ops); insta::assert_debug_snapshot!(batches); insta::assert_debug_snapshot!(build_group_chunks(&batches).collect::>()); @@ -99,7 +99,7 @@ fn batch_ops_5() { Operation::Add, Operation::Push(Felt::new(7)), ]; - let (batches, hash) = super::batch_and_hash_ops(ops.clone()); + let (batches, hash) = super::batch_and_hash_ops(&ops); insta::assert_debug_snapshot!(batches); insta::assert_debug_snapshot!(build_group_chunks(&batches).collect::>()); @@ -137,7 +137,7 @@ fn batch_ops_6() { Operation::Add, ]; - let (batches, hash) = super::batch_and_hash_ops(ops.clone()); + let (batches, hash) = super::batch_and_hash_ops(&ops); insta::assert_debug_snapshot!(batches); insta::assert_debug_snapshot!(build_group_chunks(&batches).collect::>()); @@ -169,7 +169,7 @@ fn batch_ops_7() { Operation::Add, Operation::Push(Felt::new(11)), ]; - let (batches, hash) = super::batch_and_hash_ops(ops.clone()); + let (batches, hash) = super::batch_and_hash_ops(&ops); insta::assert_debug_snapshot!(batches); insta::assert_debug_snapshot!(build_group_chunks(&batches).collect::>()); @@ -201,7 +201,7 @@ fn batch_ops_8() { Operation::Push(ONE), Operation::Push(Felt::new(2)), ]; - let (batches, hash) = super::batch_and_hash_ops(ops.clone()); + let (batches, hash) = super::batch_and_hash_ops(&ops); insta::assert_debug_snapshot!(batches); insta::assert_debug_snapshot!(build_group_chunks(&batches).collect::>()); @@ -244,7 +244,7 @@ fn batch_ops_9() { Operation::Pad, ]; - let (batches, hash) = super::batch_and_hash_ops(ops.clone()); + let (batches, hash) = super::batch_and_hash_ops(&ops); insta::assert_debug_snapshot!(batches); insta::assert_debug_snapshot!(build_group_chunks(&batches).collect::>()); @@ -359,7 +359,7 @@ proptest! { /// - Operations are correctly distributed across batches and groups. #[test] fn test_batch_creation_invariants(ops in op_non_control_sequence_strategy(50)) { - let (batches, _) = super::batch_and_hash_ops(ops.clone()); + let (batches, _) = super::batch_and_hash_ops(&ops); // A basic block contains one or more batches assert!(!batches.is_empty(), "There should be at least one batch"); @@ -399,7 +399,7 @@ proptest! { /// - If no groups available, both operation and immediate move to next batch #[test] fn test_immediate_value_placement(ops in op_non_control_sequence_strategy(50)) { - let (batches, _) = super::batch_and_hash_ops(ops.clone()); + let (batches, _) = super::batch_and_hash_ops(&ops); for batch in batches { let mut op_idx_in_group = 0; diff --git a/core/src/program/mod.rs b/core/src/program/mod.rs index f9a9d0b79e..2108ff4d03 100644 --- a/core/src/program/mod.rs +++ b/core/src/program/mod.rs @@ -155,13 +155,10 @@ impl Program { }, Err(err) => Err(err), }) - .map_err(|p| { - match p.downcast::() { - // SAFETY: It is guaranteed to be safe to read Box - Ok(err) => unsafe { core::ptr::read(&*err) }, - // Propagate unknown panics - Err(err) => std::panic::resume_unwind(err), - } + .map_err(|p| match p.downcast::() { + Ok(err) => *err, + // Propagate unknown panics + Err(err) => std::panic::resume_unwind(err), })? } } diff --git a/crates/ace-codegen/Cargo.toml b/crates/ace-codegen/Cargo.toml index 26507f4a06..c63ea80fbf 100644 --- a/crates/ace-codegen/Cargo.toml +++ b/crates/ace-codegen/Cargo.toml @@ -13,11 +13,13 @@ repository.workspace = true rust-version.workspace = true edition.workspace = true +[features] +testing = [] + [dependencies] miden-core = { workspace = true } miden-crypto = { workspace = true } thiserror = { workspace = true } [dev-dependencies] -miden-air = { workspace = true, features = ["std"] } miden-core = { workspace = true, features = ["std"] } diff --git a/crates/ace-codegen/src/circuit.rs b/crates/ace-codegen/src/circuit.rs index 49b0867533..900b6c52f0 100644 --- a/crates/ace-codegen/src/circuit.rs +++ b/crates/ace-codegen/src/circuit.rs @@ -89,22 +89,21 @@ impl AceCircuit { } /// Emit an ACE circuit from the DAG and input layout. -pub(crate) fn emit_circuit( - dag: &AceDag, - layout: InputLayout, -) -> Result, AceError> +pub fn emit_circuit(dag: &AceDag, layout: InputLayout) -> Result, AceError> where EF: Field, { let mut constants = Vec::new(); let mut constant_map = HashMap::::new(); let mut operations = Vec::new(); - let mut node_map: Vec> = vec![None; dag.nodes.len()]; + let mut node_map: Vec> = vec![None; dag.nodes().len()]; - for (idx, node) in dag.nodes.iter().enumerate() { + for (idx, node) in dag.nodes().iter().enumerate() { let ace_node = match node { NodeKind::Input(key) => { - let input_idx = layout.index(*key).expect("input key must be present in layout"); + let input_idx = layout.index(*key).ok_or_else(|| AceError::InvalidInputLayout { + message: format!("missing input key in layout: {key:?}"), + })?; AceNode::Input(input_idx) }, NodeKind::Constant(value) => { @@ -153,7 +152,7 @@ where node_map[idx] = Some(ace_node); } - let root = lookup_node(&node_map, dag.root); + let root = lookup_node(&node_map, dag.root()); Ok(AceCircuit { layout, constants, operations, root }) } diff --git a/crates/ace-codegen/src/dag/builder.rs b/crates/ace-codegen/src/dag/builder.rs index 25b9a8f0af..5dcbf87456 100644 --- a/crates/ace-codegen/src/dag/builder.rs +++ b/crates/ace-codegen/src/dag/builder.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use miden_crypto::field::Field; -use super::ir::{NodeId, NodeKind}; +use super::ir::{DagId, DagSnapshot, NodeId, NodeKind}; use crate::layout::InputKey; /// A hash-consed DAG builder. @@ -11,8 +11,10 @@ use crate::layout::InputKey; /// compact and deterministic. #[derive(Debug)] pub struct DagBuilder { + dag_id: DagId, nodes: Vec>, cache: HashMap, NodeId>, + imported_dag: Option, } impl DagBuilder @@ -21,7 +23,59 @@ where { /// Create an empty, hash-consed DAG builder. pub fn new() -> Self { - Self { nodes: Vec::new(), cache: HashMap::new() } + Self { + dag_id: DagId::fresh(), + nodes: Vec::new(), + cache: HashMap::new(), + imported_dag: None, + } + } + + /// Resume building from existing nodes using the published 0.23.0 API shape. + /// + /// Imported node ids are rebased onto the new builder, and ids from the source DAG + /// are accepted only when that provenance is encoded in the node graph itself. + pub fn from_nodes(nodes: Vec>) -> Self { + let imported_dag = infer_dag_id(&nodes) + .map(|source_dag_id| ImportedDag { source_dag_id, imported_len: nodes.len() }); + let dag_id = DagId::fresh(); + let nodes = rebase_nodes(nodes, dag_id); + + Self::from_existing_nodes(dag_id, nodes, imported_dag) + } + + /// Resume building from an exported snapshot. + /// + /// This preserves the original DAG id even when the imported nodes are all leaves. + pub fn from_snapshot(snapshot: DagSnapshot) -> Self { + let (source_dag_id, nodes, _) = snapshot.into_parts(); + let dag_id = DagId::fresh(); + let imported_dag = Some(ImportedDag { source_dag_id, imported_len: nodes.len() }); + let nodes = rebase_nodes(nodes, dag_id); + + Self::from_existing_nodes(dag_id, nodes, imported_dag) + } + + /// Resume building from an existing DAG. + /// + /// Rebuilds the deduplication cache so that subsequent operations reuse + /// existing subexpressions. + pub fn from_dag(dag: super::AceDag) -> Self { + let dag_id = dag.dag_id(); + Self::from_existing_nodes(dag_id, dag.into_nodes(), None) + } + + fn from_existing_nodes( + dag_id: DagId, + nodes: Vec>, + imported_dag: Option, + ) -> Self { + let cache = nodes + .iter() + .enumerate() + .map(|(i, n)| (n.clone(), NodeId::in_dag(i, dag_id))) + .collect(); + Self { dag_id, nodes, cache, imported_dag } } /// Consume the builder and return its node list. @@ -29,6 +83,13 @@ where self.nodes } + /// Consume the builder and return a DAG with the provided root. + pub fn build(self, root: NodeId) -> super::AceDag { + let root = self.resolve_id(root, "DAG root must refer to a node built by this DagBuilder"); + + super::AceDag::from_parts(self.dag_id, self.nodes, root) + } + /// Add an input node. pub fn input(&mut self, key: InputKey) -> NodeId { self.intern(NodeKind::Input(key)) @@ -41,6 +102,8 @@ where /// Add an addition node (with constant folding). pub fn add(&mut self, a: NodeId, b: NodeId) -> NodeId { + let a = self.resolve_node(a); + let b = self.resolve_node(b); if let (Some(x), Some(y)) = (self.const_value(a), self.const_value(b)) { return self.constant(x + y); } @@ -56,6 +119,8 @@ where /// Add a subtraction node (with constant folding). pub fn sub(&mut self, a: NodeId, b: NodeId) -> NodeId { + let a = self.resolve_node(a); + let b = self.resolve_node(b); if let (Some(x), Some(y)) = (self.const_value(a), self.const_value(b)) { return self.constant(x - y); } @@ -67,6 +132,8 @@ where /// Add a multiplication node (with constant folding). pub fn mul(&mut self, a: NodeId, b: NodeId) -> NodeId { + let a = self.resolve_node(a); + let b = self.resolve_node(b); if let (Some(x), Some(y)) = (self.const_value(a), self.const_value(b)) { return self.constant(x * y); } @@ -85,6 +152,7 @@ where /// Add a negation node (with constant folding). pub fn neg(&mut self, a: NodeId) -> NodeId { + let a = self.resolve_node(a); if let Some(x) = self.const_value(a) { return self.constant(-x); } @@ -106,15 +174,69 @@ where self.const_value(id).is_some_and(|v| v == EF::ONE) } + fn resolve_node(&self, id: NodeId) -> NodeId { + self.resolve_id(id, "DAG node must come from this DagBuilder") + } + fn intern(&mut self, node: NodeKind) -> NodeId { if let Some(id) = self.cache.get(&node) { return *id; } - let id = NodeId(self.nodes.len()); + let id = NodeId::in_dag(self.nodes.len(), self.dag_id); self.nodes.push(node.clone()); self.cache.insert(node, id); id } + + fn resolve_id(&self, id: NodeId, message: &str) -> NodeId { + assert!(id.index() < self.nodes.len(), "{message}"); + + if id.dag_id == self.dag_id { + return id; + } + + if let Some(imported) = &self.imported_dag + && imported.source_dag_id == id.dag_id + && id.index() < imported.imported_len + { + return NodeId::in_dag(id.index(), self.dag_id); + } + + panic!("{message}"); + } +} + +fn infer_dag_id(nodes: &[NodeKind]) -> Option { + nodes.iter().find_map(|node| match node { + NodeKind::Add(a, _) | NodeKind::Sub(a, _) | NodeKind::Mul(a, _) | NodeKind::Neg(a) => { + Some(a.dag_id) + }, + NodeKind::Input(_) | NodeKind::Constant(_) => None, + }) +} + +fn rebase_nodes(nodes: Vec>, dag_id: DagId) -> Vec> { + nodes + .into_iter() + .map(|node| match node { + NodeKind::Input(key) => NodeKind::Input(key), + NodeKind::Constant(value) => NodeKind::Constant(value), + NodeKind::Add(a, b) => NodeKind::Add(rebase_node(a, dag_id), rebase_node(b, dag_id)), + NodeKind::Sub(a, b) => NodeKind::Sub(rebase_node(a, dag_id), rebase_node(b, dag_id)), + NodeKind::Mul(a, b) => NodeKind::Mul(rebase_node(a, dag_id), rebase_node(b, dag_id)), + NodeKind::Neg(a) => NodeKind::Neg(rebase_node(a, dag_id)), + }) + .collect() +} + +fn rebase_node(id: NodeId, dag_id: DagId) -> NodeId { + NodeId::in_dag(id.index(), dag_id) +} + +#[derive(Debug, Clone)] +struct ImportedDag { + source_dag_id: DagId, + imported_len: usize, } impl Default for DagBuilder @@ -125,3 +247,194 @@ where Self::new() } } + +#[cfg(test)] +mod tests { + use miden_core::{Felt, field::QuadFelt}; + + use super::DagBuilder; + use crate::layout::InputKey; + + fn felt(value: u64) -> QuadFelt { + QuadFelt::from(Felt::new(value)) + } + + #[test] + #[should_panic(expected = "DAG root must refer to a node built by this DagBuilder")] + fn build_rejects_same_index_root_from_another_builder() { + let mut foreign_builder = DagBuilder::::new(); + let foreign_root = foreign_builder.constant(felt(1)); + + let mut builder = DagBuilder::::new(); + builder.constant(felt(1)); + + let _ = builder.build(foreign_root); + } + + #[test] + #[should_panic(expected = "DAG node must come from this DagBuilder")] + fn add_rejects_foreign_node() { + let mut foreign_builder = DagBuilder::::new(); + let foreign = foreign_builder.constant(felt(2)); + + let mut builder = DagBuilder::::new(); + let local = builder.constant(felt(1)); + + let _ = builder.add(local, foreign); + } + + #[test] + #[should_panic(expected = "DAG node must come from this DagBuilder")] + fn sub_rejects_foreign_node() { + let mut foreign_builder = DagBuilder::::new(); + let foreign = foreign_builder.constant(felt(2)); + + let mut builder = DagBuilder::::new(); + let local = builder.constant(felt(1)); + + let _ = builder.sub(local, foreign); + } + + #[test] + #[should_panic(expected = "DAG node must come from this DagBuilder")] + fn mul_rejects_foreign_node() { + let mut foreign_builder = DagBuilder::::new(); + let foreign = foreign_builder.constant(felt(2)); + + let mut builder = DagBuilder::::new(); + let local = builder.constant(felt(1)); + + let _ = builder.mul(local, foreign); + } + + #[test] + #[should_panic(expected = "DAG node must come from this DagBuilder")] + fn neg_rejects_foreign_node() { + let mut foreign_builder = DagBuilder::::new(); + let foreign = foreign_builder.constant(felt(2)); + + let mut builder = DagBuilder::::new(); + let _ = builder.constant(felt(1)); + + let _ = builder.neg(foreign); + } + + #[test] + fn from_dag_preserves_node_ownership() { + let mut builder = DagBuilder::::new(); + let a = builder.constant(felt(1)); + let dag = builder.build(a); + let root = dag.root(); + + let mut rebuilt = DagBuilder::from_dag(dag); + let b = rebuilt.constant(felt(2)); + let sum = rebuilt.add(root, b); + + let rebuilt_dag = rebuilt.build(sum); + assert_eq!(rebuilt_dag.root().index(), sum.index()); + } + + #[test] + fn from_nodes_accepts_published_root_shape() { + let mut builder = DagBuilder::::new(); + let a = builder.input(InputKey::Gamma); + let b = builder.constant(felt(2)); + let root = builder.add(a, b); + let dag = builder.build(root); + + let mut rebuilt = DagBuilder::from_nodes(dag.nodes.clone()); + let c = rebuilt.constant(felt(3)); + let sum = rebuilt.add(dag.root, c); + + let rebuilt_dag = rebuilt.build(sum); + assert_eq!(rebuilt_dag.root().index(), sum.index()); + } + + #[test] + fn from_nodes_accepts_leaf_only_root_shape() { + let mut builder = DagBuilder::::new(); + let a = builder.constant(felt(1)); + let dag = builder.build(a); + + let root = dag.root(); + let mut rebuilt = DagBuilder::from_snapshot(dag.into_snapshot()); + let b = rebuilt.constant(felt(2)); + let sum = rebuilt.add(root, b); + + let rebuilt_dag = rebuilt.build(sum); + assert_eq!(rebuilt_dag.root().index(), sum.index()); + } + + #[test] + fn from_snapshot_accepts_leaf_only_root_after_source_dag_is_dropped() { + let mut builder = DagBuilder::::new(); + let a = builder.constant(felt(1)); + let snapshot = builder.build(a).into_snapshot(); + let root = snapshot.root(); + + let mut rebuilt = DagBuilder::from_snapshot(snapshot); + let b = rebuilt.constant(felt(2)); + let sum = rebuilt.add(root, b); + + let rebuilt_dag = rebuilt.build(sum); + assert_eq!(rebuilt_dag.root().index(), sum.index()); + } + + #[test] + #[should_panic(expected = "DAG node must come from this DagBuilder")] + fn from_nodes_rejects_foreign_node_from_another_builder() { + let mut source_builder = DagBuilder::::new(); + let a = source_builder.input(InputKey::Gamma); + let b = source_builder.constant(felt(2)); + let root = source_builder.add(a, b); + let dag = source_builder.build(root); + + let mut rebuilt = DagBuilder::from_nodes(dag.nodes.clone()); + let mut foreign_builder = DagBuilder::::new(); + let foreign = foreign_builder.constant(felt(3)); + + let _ = rebuilt.add(dag.root, foreign); + } + + #[test] + #[should_panic(expected = "DAG root must refer to a node built by this DagBuilder")] + fn from_nodes_rejects_foreign_root_from_another_builder() { + let mut source_builder = DagBuilder::::new(); + let a = source_builder.input(InputKey::Gamma); + let b = source_builder.constant(felt(2)); + let root = source_builder.add(a, b); + let dag = source_builder.build(root); + + let rebuilt = DagBuilder::from_nodes(dag.nodes.clone()); + let mut foreign_builder = DagBuilder::::new(); + let foreign = foreign_builder.constant(felt(3)); + + let _ = rebuilt.build(foreign); + } + + #[test] + #[should_panic(expected = "DAG root must refer to a node built by this DagBuilder")] + fn from_nodes_leaf_only_rejects_foreign_root_before_any_imported_id() { + let mut source_builder = DagBuilder::::new(); + let source = source_builder.constant(felt(1)); + let dag = source_builder.build(source); + + let rebuilt = DagBuilder::from_nodes(dag.nodes.clone()); + let _ = rebuilt.build(dag.root); + } + + #[test] + #[should_panic(expected = "DAG root must refer to a node built by this DagBuilder")] + fn from_snapshot_leaf_only_rejects_foreign_root() { + let mut source_builder = DagBuilder::::new(); + let source = source_builder.constant(felt(1)); + let snapshot = source_builder.build(source).into_snapshot(); + + let mut foreign_builder = DagBuilder::::new(); + let foreign = foreign_builder.constant(felt(3)); + let foreign_dag = foreign_builder.build(foreign); + + let rebuilt = DagBuilder::from_snapshot(snapshot); + let _ = rebuilt.build(foreign_dag.root); + } +} diff --git a/crates/ace-codegen/src/dag/ir.rs b/crates/ace-codegen/src/dag/ir.rs index f261d9a196..cc0b65887c 100644 --- a/crates/ace-codegen/src/dag/ir.rs +++ b/crates/ace-codegen/src/dag/ir.rs @@ -1,3 +1,5 @@ +use core::sync::atomic::{AtomicUsize, Ordering}; + use miden_crypto::{ field::TwoAdicField, stark::dft::{NaiveDft, TwoAdicSubgroupDft}, @@ -5,14 +7,32 @@ use miden_crypto::{ use crate::layout::InputKey; +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub(crate) struct DagId(usize); + +impl DagId { + pub(crate) fn fresh() -> Self { + static NEXT_DAG_ID: AtomicUsize = AtomicUsize::new(0); + + Self(NEXT_DAG_ID.fetch_add(1, Ordering::Relaxed)) + } +} + /// Identifier for a node in the DAG. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub struct NodeId(pub(super) usize); +pub struct NodeId { + pub(super) dag_id: DagId, + pub(super) index: usize, +} impl NodeId { /// Return the underlying node index. pub const fn index(self) -> usize { - self.0 + self.index + } + + pub(super) const fn in_dag(index: usize, dag_id: DagId) -> Self { + Self { dag_id, index } } } @@ -89,8 +109,59 @@ impl PeriodicColumnData { /// A built DAG with a designated root. #[derive(Debug)] pub struct AceDag { + dag_id: DagId, /// Topologically ordered nodes. pub nodes: Vec>, /// Root node of the verifier equation. pub root: NodeId, } + +/// Exported DAG data that preserves the source DAG id across imports. +#[derive(Debug, Clone)] +pub struct DagSnapshot { + nodes: Vec>, + root: NodeId, + source_dag_id: DagId, +} + +impl AceDag { + pub(crate) fn from_parts(dag_id: DagId, nodes: Vec>, root: NodeId) -> Self { + Self { dag_id, nodes, root } + } + + pub(crate) fn nodes(&self) -> &[NodeKind] { + &self.nodes + } + + pub(crate) fn into_nodes(self) -> Vec> { + self.nodes + } + + pub(crate) fn dag_id(&self) -> DagId { + self.dag_id + } + + pub fn root(&self) -> NodeId { + self.root + } + + /// Consume the DAG and return an exported snapshot that can be re-imported later. + pub fn into_snapshot(self) -> DagSnapshot { + DagSnapshot { + nodes: self.nodes, + root: self.root, + source_dag_id: self.dag_id, + } + } +} + +impl DagSnapshot { + /// Root node of the verifier equation. + pub fn root(&self) -> NodeId { + self.root + } + + pub(super) fn into_parts(self) -> (DagId, Vec>, NodeId) { + (self.source_dag_id, self.nodes, self.root) + } +} diff --git a/crates/ace-codegen/src/dag/lower.rs b/crates/ace-codegen/src/dag/lower.rs index e5f43f9a38..f9e0d1f23e 100644 --- a/crates/ace-codegen/src/dag/lower.rs +++ b/crates/ace-codegen/src/dag/lower.rs @@ -1,3 +1,86 @@ +//! Lowering from symbolic AIR constraints to the verifier DAG. +//! +//! # Verifier expression +//! +//! The ACE circuit evaluates the STARK verifier's core check at a single +//! out-of-domain point `z`. The root expression is: +//! +//! ```text +//! root = acc - quotient_recomposition * (z^N - 1) +//! ``` +//! +//! The verifier accepts if and only if `root == 0`. +//! +//! ## Constraint folding +//! +//! Given N constraints `C_0, C_1, ..., C_{N-1}`, the folded accumulator `acc` +//! is built via Horner's method with the composition challenge `alpha`: +//! +//! ```text +//! acc = C_0 + alpha * (C_1 + alpha * (C_2 + ... )) +//! ``` +//! +//! Each constraint `C_i(z)` is a symbolic expression over trace openings, +//! public inputs, periodic columns, and selector polynomials (see below). +//! +//! +//! ## Selector polynomials +//! +//! Constraints may be multiplied by selector polynomials that restrict them +//! to specific rows. These selectors are precomputed by the MASM verifier +//! and supplied as circuit inputs: +//! +//! - `is_first = (z^N - 1) / (z - 1)` Active on the first row of the trace. +//! +//! - `is_last = (z^N - 1) / (z - g^{-1})` Active on the last row of the trace (g = trace domain +//! generator). +//! +//! - `is_transition = z - g^{-1}` Active on all rows except the last. +//! +//! ## Periodic columns +//! +//! Periodic columns are polynomials evaluated at `z_k = z^(N / max_cycle_len)`. +//! Each column's coefficients are Horner-evaluated at `z_k` (or a power of +//! `z_k` for columns whose period divides `max_cycle_len`). +//! +//! ## Quotient recomposition +//! +//! The quotient polynomial `Q(x)` is split into `k` chunks `Q_0, ..., Q_{k-1}`, +//! where chunk `Q_i` is evaluated on a coset shifted by `s_i`. To recover the +//! combined quotient at `z^N`, barycentric interpolation over the `k` coset +//! shifts is used: +//! +//! ```text +//! s_i = s0 * f^i (coset shifts) +//! delta_i = z^N - s_i (eval point minus each shift) +//! w_i = weight0 * f^i (barycentric weights) +//! zps_i = w_i * prod_{j != i} delta_j +//! +//! quotient_recomposition = sum_{i=0}^{k-1} zps_i * Q_i(z) +//! ``` +//! +//! where `s0 = offset^N`, `f = h^N` (h = LDE domain generator), +//! `weight0 = 1 / (k * s0^{k-1})`, and `Q_i(z)` is reconstructed from its +//! base-field coordinates evaluations. +//! +//! ## Stark variables summary +//! +//! Each stark variable and where it enters the expression: +//! +//! ```text +//! alpha Composition challenge. Horner accumulator for constraint folding. +//! z^N Trace-length power. Vanishing factor and delta base in quotient +//! recomposition. +//! z_k Periodic column evaluation point (z^(N / max_cycle_len)). +//! is_first Precomputed selector (z^N - 1) / (z - 1). +//! is_last Precomputed selector (z^N - 1) / (z - g^{-1}). +//! is_transition Precomputed selector z - g^{-1}. +//! gamma Batching challenge for auxiliary trace boundary checks. +//! weight0 First barycentric weight for quotient recomposition. +//! f Chunk shift ratio h^N. Generates coset shifts and weights. +//! s0 First coset shift offset^N. Base for shifted evaluation points. +//! ``` + use std::collections::HashMap; use miden_crypto::{ @@ -40,25 +123,9 @@ where panic!("preprocessed trace entries are not supported") }, }, - BaseLeaf::IsFirstRow => { - let z_pow_n = builder.input(InputKey::ZPowN); - let one = builder.constant(EF::ONE); - let numerator = builder.sub(z_pow_n, one); - let inv = builder.input(InputKey::InvZMinusOne); - builder.mul(numerator, inv) - }, - BaseLeaf::IsLastRow => { - let z_pow_n = builder.input(InputKey::ZPowN); - let one = builder.constant(EF::ONE); - let numerator = builder.sub(z_pow_n, one); - let inv = builder.input(InputKey::InvZMinusGInv); - builder.mul(numerator, inv) - }, - BaseLeaf::IsTransition => { - let z = builder.input(InputKey::Z); - let g_inv = builder.input(InputKey::GInv); - builder.sub(z, g_inv) - }, + BaseLeaf::IsFirstRow => builder.input(InputKey::IsFirst), + BaseLeaf::IsLastRow => builder.input(InputKey::IsLast), + BaseLeaf::IsTransition => builder.input(InputKey::IsTransition), BaseLeaf::Constant(c) => builder.constant(EF::from(*c)), }, SymbolicExpression::Add { x, y, .. } => { @@ -169,7 +236,6 @@ where None => Vec::new(), }; let alpha = builder.input(InputKey::Alpha); - let inv_vanishing = builder.input(InputKey::InvVanishing); // Merge base and extension constraints in evaluation order using the layout. let total = constraint_layout.base_indices.len() + constraint_layout.ext_indices.len(); @@ -192,12 +258,15 @@ where let acc_mul = builder.mul(acc, alpha); acc = builder.add(acc_mul, node); } - let folded = builder.mul(acc, inv_vanishing); let quotient = build_quotient_recomposition_dag::(&mut builder, layout); - let root = builder.sub(folded, quotient); + let z_pow_n = builder.input(InputKey::ZPowN); + let one = builder.constant(EF::ONE); + let vanishing = builder.sub(z_pow_n, one); + let q_times_v = builder.mul(quotient, vanishing); + let root = builder.sub(acc, q_times_v); - AceDag { nodes: builder.into_nodes(), root } + builder.build(root) } fn build_periodic_nodes( diff --git a/crates/ace-codegen/src/dag/mod.rs b/crates/ace-codegen/src/dag/mod.rs index 90485e3429..31c57dac86 100644 --- a/crates/ace-codegen/src/dag/mod.rs +++ b/crates/ace-codegen/src/dag/mod.rs @@ -11,5 +11,5 @@ mod ir; mod lower; pub use builder::DagBuilder; -pub use ir::{AceDag, NodeId, NodeKind, PeriodicColumnData}; +pub use ir::{AceDag, DagSnapshot, NodeId, NodeKind, PeriodicColumnData}; pub use lower::build_verifier_dag; diff --git a/crates/ace-codegen/src/layout/keys.rs b/crates/ace-codegen/src/layout/keys.rs index d1d7041db9..8c4a526e9f 100644 --- a/crates/ace-codegen/src/layout/keys.rs +++ b/crates/ace-codegen/src/layout/keys.rs @@ -20,30 +20,29 @@ pub enum InputKey { }, /// Aux bus boundary value at the given index. AuxBusBoundary(usize), - /// Out-of-domain evaluation point `zeta`. - Z, + /// Variable-length public input reduction at the given group index. + VlpiReduction(usize), + /// Batching challenge gamma for combining the constraint evaluation with the + /// auxiliary trace boundary checks. + Gamma, /// Composition challenge used to fold constraints. Alpha, /// `zeta^N`, where `N` is the trace length. ZPowN, - /// `g^{-1}`, inverse trace domain generator. - GInv, - /// `g^{-2}`, squared inverse trace domain generator. - GInv2, /// `zeta^(N / max_cycle_len)` for periodic columns. ZK, + /// Precomputed first-row selector: `(z^N - 1) / (z - 1)`. + IsFirst, + /// Precomputed last-row selector: `(z^N - 1) / (z - g^{-1})`. + IsLast, + /// Precomputed transition selector: `z - g^{-1}`. + IsTransition, /// First barycentric weight for quotient recomposition. Weight0, - /// `g = h^N`, the chunk shift ratio. - G, + /// `f = h^N`, the chunk shift ratio between cosets. + F, /// `s0 = offset^N`, the first chunk shift. S0, - /// `1 / (zeta - g^{-1})` (selector denominator). - InvZMinusGInv, - /// `1 / (zeta - 1)` (selector denominator). - InvZMinusOne, - /// `1 / (zeta^N - 1)` (vanishing inverse). - InvVanishing, /// Base-field coordinate for a quotient chunk opening at `offset` /// (0 = zeta, 1 = g * zeta). QuotientChunkCoord { @@ -84,18 +83,22 @@ impl InputKeyMapper<'_> { } }, InputKey::AuxBusBoundary(i) => layout.regions.aux_bus_boundary.index(i), - InputKey::Z => Some(layout.stark.z), + InputKey::VlpiReduction(i) => { + let local = i * layout.vlpi_stride; + layout.regions.vlpi_reductions.index(local) + }, + // Extension-field stark vars. InputKey::Alpha => Some(layout.stark.alpha), - InputKey::GInv => Some(layout.stark.g_inv), InputKey::ZPowN => Some(layout.stark.z_pow_n), - InputKey::GInv2 => Some(layout.stark.g_inv2), InputKey::ZK => Some(layout.stark.z_k), + InputKey::IsFirst => Some(layout.stark.is_first), + InputKey::IsLast => Some(layout.stark.is_last), + InputKey::IsTransition => Some(layout.stark.is_transition), + InputKey::Gamma => Some(layout.stark.gamma), + // Base-field stark vars (stored as (val, 0) in the EF slot). InputKey::Weight0 => Some(layout.stark.weight0), - InputKey::G => Some(layout.stark.g), + InputKey::F => Some(layout.stark.f), InputKey::S0 => Some(layout.stark.s0), - InputKey::InvZMinusGInv => Some(layout.stark.inv_z_minus_g_inv), - InputKey::InvZMinusOne => Some(layout.stark.inv_z_minus_one), - InputKey::InvVanishing => Some(layout.stark.inv_vanishing), InputKey::QuotientChunkCoord { offset, chunk, coord } => { if chunk >= layout.counts.num_quotient_chunks || coord >= EXT_DEGREE { return None; diff --git a/crates/ace-codegen/src/layout/mod.rs b/crates/ace-codegen/src/layout/mod.rs index 9446978694..8504870c75 100644 --- a/crates/ace-codegen/src/layout/mod.rs +++ b/crates/ace-codegen/src/layout/mod.rs @@ -18,13 +18,11 @@ //! - Lagrange-kernel weights and shifts for quotient chunk recomposition. //! - Constraint folding with the composition challenge and final root check. //! -//! The current "stark vars" block is sufficient to derive both selector -//! polynomials and the Lagrange-kernel weights used in quotient chunk -//! recomposition: -//! - Selector evaluations: -//! - `inv_vanishing = 1 / (z^N - 1)` -//! - `is_first = (z^N - 1) * inv(z - 1)` -//! - `is_last = (z^N - 1) * inv(z - g^{-1})` +//! The current "stark vars" block provides precomputed selectors and the +//! Lagrange-kernel weights used in quotient chunk recomposition: +//! - Precomputed selectors (computed in MASM, supplied as inputs): +//! - `is_first = (z^N - 1) / (z - 1)` +//! - `is_last = (z^N - 1) / (z - g^{-1})` //! - `is_transition = z - g^{-1}` //! - Lagrange kernel inputs: //! - `s0 = offset^N` and `g = subgroup_gen^N` define the shifts `s_i = s0 * g^i`. @@ -47,8 +45,7 @@ //! Notes: //! - `quotient_next` is included in the READ layout and is mapped via //! `InputKey::QuotientChunkCoord` with `offset = 1`. -//! - `stark_vars` reserves at least 14 EF slots for the canonical verifier inputs. Extra slots are -//! left available for future aux inputs. +//! - `stark_vars` reserves 10 EF slots for the canonical verifier inputs. mod keys; mod plan; diff --git a/crates/ace-codegen/src/layout/plan.rs b/crates/ace-codegen/src/layout/plan.rs index 3b440b9fd7..68e205f9fb 100644 --- a/crates/ace-codegen/src/layout/plan.rs +++ b/crates/ace-codegen/src/layout/plan.rs @@ -24,12 +24,14 @@ pub struct InputCounts { pub aux_width: usize, /// Number of public inputs. pub num_public: usize, + /// Number of variable-length public input (VLPI) reduction slots (in EF elements). + /// This is derived from `AceConfig::num_vlpi_groups` by the layout policy: + /// MASM expands each group to 2 EF slots (word-aligned); Native uses 1 per group. + pub num_vlpi: usize, /// Number of randomness challenges used by the AIR. pub num_randomness: usize, /// Number of periodic columns. pub num_periodic: usize, - /// Number of auxiliary (stark var) inputs reserved. - pub num_aux_inputs: usize, /// Number of quotient chunks. pub num_quotient_chunks: usize, } @@ -39,6 +41,8 @@ pub struct InputCounts { pub(crate) struct LayoutRegions { /// Region containing fixed-length public values. pub public_values: InputRegion, + /// Region containing variable-length public input reductions. + pub vlpi_reductions: InputRegion, /// Region containing randomness inputs (alpha, beta). pub randomness: InputRegion, /// Main trace OOD values at `zeta`. @@ -60,32 +64,39 @@ pub(crate) struct LayoutRegions { } /// Indexes of canonical verifier scalars inside the stark-vars block. +/// +/// Every slot in the ACE input array is an extension-field (EF) element -- +/// the circuit operates entirely in the extension field. However, some of +/// these scalars are inherently base-field values that the MASM verifier +/// stores as `(val, 0)` in the EF slot. +/// +/// See the module documentation on [`super::super::dag::lower`] for how each +/// variable enters the verifier expression. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub(crate) struct StarkVarIndices { - /// Index of `zeta` in the stark-vars block. - pub z: usize, - /// Index of the composition challenge `alpha`. + // -- Extension-field values (slots 0-5) -- + /// Composition challenge `alpha` for folding constraints. pub alpha: usize, - /// Index of `g^{-1}`. - pub g_inv: usize, - /// Index of `zeta^N`. + /// `zeta^N` where N is the trace length. pub z_pow_n: usize, - /// Index of `g^{-2}`. - pub g_inv2: usize, - /// Index of `z_k`. + /// `zeta^(N / max_cycle_len)` for periodic column evaluation. pub z_k: usize, - /// Index of `weight0`. + /// Precomputed first-row selector: `(z^N - 1) / (z - 1)`. + pub is_first: usize, + /// Precomputed last-row selector: `(z^N - 1) / (z - g^{-1})`. + pub is_last: usize, + /// Precomputed transition selector: `z - g^{-1}`. + pub is_transition: usize, + /// Batching challenge `gamma` for reduced_aux_values. + pub gamma: usize, + + // -- Base-field values stored as (val, 0) in EF slots -- + /// First barycentric weight `1 / (k * s0^{k-1})`. pub weight0: usize, - /// Index of `g`. - pub g: usize, - /// Index of `s0`. + /// `f = h^N` (chunk shift ratio between cosets). + pub f: usize, + /// `s0 = offset^N` (first chunk shift). pub s0: usize, - /// Index of `1 / (zeta - g^{-1})`. - pub inv_z_minus_g_inv: usize, - /// Index of `1 / (zeta - 1)`. - pub inv_z_minus_one: usize, - /// Index of `1 / (zeta^N - 1)`. - pub inv_vanishing: usize, } /// ACE input layout for Plonky3-based verifier logic. @@ -100,6 +111,8 @@ pub struct InputLayout { pub(crate) aux_rand_alpha: usize, /// Input index for aux randomness beta. pub(crate) aux_rand_beta: usize, + /// Stride between logical VLPI groups (2 for MASM word-aligned, 1 for native). + pub(crate) vlpi_stride: usize, /// Indexes into the stark-vars region. pub(crate) stark: StarkVarIndices, /// Total number of inputs (length of the READ section). @@ -123,6 +136,7 @@ impl InputLayout { let mut max_end = 0usize; for region in [ self.regions.public_values, + self.regions.vlpi_reductions, self.regions.randomness, self.regions.main_curr, self.regions.aux_curr, @@ -156,26 +170,23 @@ impl InputLayout { "aux bus boundary width mismatch" ); - let stark_end = self.regions.stark_vars.offset + self.regions.stark_vars.width; - for (name, idx) in [ - ("z", self.stark.z), - ("alpha", self.stark.alpha), - ("g_inv", self.stark.g_inv), - ("z_pow_n", self.stark.z_pow_n), - ("g_inv2", self.stark.g_inv2), - ("z_k", self.stark.z_k), - ("weight0", self.stark.weight0), - ("g", self.stark.g), - ("s0", self.stark.s0), - ("inv_z_minus_g_inv", self.stark.inv_z_minus_g_inv), - ("inv_z_minus_one", self.stark.inv_z_minus_one), - ("inv_vanishing", self.stark.inv_vanishing), - ] { - assert!( - idx >= self.regions.stark_vars.offset && idx < stark_end, - "stark var {name} out of range" - ); - } + let stark_start = self.regions.stark_vars.offset; + let stark_end = stark_start + self.regions.stark_vars.width; + let check = |name: &str, idx: usize| { + assert!(idx >= stark_start && idx < stark_end, "stark var {name} out of range"); + }; + // Extension-field slots. + check("alpha", self.stark.alpha); + check("z_pow_n", self.stark.z_pow_n); + check("z_k", self.stark.z_k); + check("is_first", self.stark.is_first); + check("is_last", self.stark.is_last); + check("is_transition", self.stark.is_transition); + check("gamma", self.stark.gamma); + // Base-field slots (stored as (val, 0) in the EF slot). + check("weight0", self.stark.weight0); + check("f", self.stark.f); + check("s0", self.stark.s0); let rand_start = self.regions.randomness.offset; let rand_end = rand_start + self.regions.randomness.width; diff --git a/crates/ace-codegen/src/layout/policy.rs b/crates/ace-codegen/src/layout/policy.rs index d5453b8479..c9df275c7c 100644 --- a/crates/ace-codegen/src/layout/policy.rs +++ b/crates/ace-codegen/src/layout/policy.rs @@ -12,6 +12,8 @@ enum Alignment { #[derive(Clone, Copy)] struct LayoutPolicy { public_values: Alignment, + vlpi: Alignment, + vlpi_stride: usize, randomness: Alignment, main: Alignment, aux: Alignment, @@ -25,6 +27,8 @@ impl LayoutPolicy { fn native() -> Self { Self { public_values: Alignment::Unaligned, + vlpi: Alignment::Unaligned, + vlpi_stride: 1, randomness: Alignment::Unaligned, main: Alignment::Unaligned, aux: Alignment::Unaligned, @@ -38,6 +42,8 @@ impl LayoutPolicy { fn masm() -> Self { Self { public_values: Alignment::QuadWord, + vlpi: Alignment::Word, + vlpi_stride: 2, randomness: Alignment::Word, main: Alignment::DoubleWord, aux: Alignment::DoubleWord, @@ -82,12 +88,15 @@ impl InputLayout { } fn build_with_policy(counts: InputCounts, policy: LayoutPolicy) -> Self { - /// Minimum number of EF slots reserved for verifier "stark vars". - const STARK_BASE_VARS: usize = 14; + // Number of EF slots in the stark-vars block. Every ACE input slot is an + // extension-field element (QuadFelt). Some stark vars are base-field values + // embedded as (val, 0); see the slot table below for which is which. + const NUM_STARK_VARS: usize = 10; let mut builder = LayoutBuilder::new(); let public_values = builder.alloc(counts.num_public, policy.public_values); + let vlpi_reductions = builder.alloc(counts.num_vlpi, policy.vlpi); /// Number of randomness inputs (alpha + beta). const NUM_RANDOMNESS_INPUTS: usize = 2; let randomness = builder.alloc(NUM_RANDOMNESS_INPUTS, policy.randomness); @@ -101,24 +110,36 @@ impl InputLayout { let quotient_next = builder.alloc(counts.num_quotient_chunks * EXT_DEGREE, policy.quotient); let aux_bus_boundary = builder.alloc(counts.aux_width, policy.aux_bus_boundary); - let stark_base_width = counts.num_aux_inputs.max(STARK_BASE_VARS); - let stark_vars = builder.alloc(stark_base_width, policy.stark_vars); - - // Matches utils::set_up_auxiliary_inputs_ace layout (EF slots): - // [z, alpha, g^-1, z^N, g^-2, z^k, weight0, g, s0, 0, - // inv(z-g^-1), inv(z-1), inv(z^N-1), 0] - let z = stark_vars.offset; - let alpha = stark_vars.offset + 1; - let g_inv = stark_vars.offset + 2; - let z_pow_n = stark_vars.offset + 3; - let g_inv2 = stark_vars.offset + 4; - let z_k = stark_vars.offset + 5; - let weight0 = stark_vars.offset + 6; - let g = stark_vars.offset + 7; - let s0 = stark_vars.offset + 8; - let inv_z_minus_g_inv = stark_vars.offset + 10; - let inv_z_minus_one = stark_vars.offset + 11; - let inv_vanishing = stark_vars.offset + 12; + let stark_vars = builder.alloc(NUM_STARK_VARS, policy.stark_vars); + + // Matches utils::set_up_auxiliary_inputs_ace layout (EF slots). + // + // Extension-field values are grouped first (slots 0-6), then base-field + // values stored as (val, 0) in EF slots (slots 7-9). + // + // Slot Value Field + // ---- ------------------ ----- + // 0 alpha EF Composition challenge (Horner multiplier) + // 1 z^N EF Trace-length power (quotient deltas + vanishing + // 2 z_k EF Periodic column eval point + // 3 is_first EF Precomputed: (z^N - 1) / (z - 1) + // 4 is_last EF Precomputed: (z^N - 1) / (z - g^{-1}) + // 5 is_transition EF Precomputed: z - g^{-1} + // 6 gamma EF Batching challenge + // 7 weight0 base First barycentric weight + // 8 f base Chunk shift ratio h^N + // 9 s0 base First coset shift offset^N + let b = stark_vars.offset; + let alpha = b; + let z_pow_n = b + 1; + let z_k = b + 2; + let is_first = b + 3; + let is_last = b + 4; + let is_transition = b + 5; + let gamma = b + 6; + let weight0 = b + 7; + let f = b + 8; + let s0 = b + 9; if let Some(end_align) = policy.end_align { builder.align(end_align); @@ -127,6 +148,7 @@ impl InputLayout { Self { regions: LayoutRegions { public_values, + vlpi_reductions, randomness, main_curr, aux_curr, @@ -139,22 +161,71 @@ impl InputLayout { }, aux_rand_alpha, aux_rand_beta, + vlpi_stride: policy.vlpi_stride, stark: StarkVarIndices { - z, alpha, - g_inv, z_pow_n, - g_inv2, z_k, + is_first, + is_last, + is_transition, + gamma, weight0, - g, + f, s0, - inv_z_minus_g_inv, - inv_z_minus_one, - inv_vanishing, }, total_inputs: builder.offset, counts, } } } + +#[cfg(test)] +mod tests { + use super::super::{InputCounts, InputKey, InputLayout}; + + #[test] + fn masm_layout_vlpi_groups_use_word_stride() { + let counts = InputCounts { + width: 1, + aux_width: 1, + num_public: 8, + // Two logical VLPI groups in MASM occupy four EF slots total: + // [group0, pad0, group1, pad1]. + num_vlpi: 4, + num_randomness: 2, + num_periodic: 0, + num_quotient_chunks: 1, + }; + let layout = InputLayout::new_masm(counts); + + let vlpi_base = layout.index(InputKey::VlpiReduction(0)).unwrap(); + assert_eq!(layout.index(InputKey::VlpiReduction(0)), Some(vlpi_base)); + assert_eq!( + layout.index(InputKey::VlpiReduction(1)), + Some(vlpi_base + 2), + "MASM VLPI groups should advance by a word-aligned stride" + ); + } + + #[test] + fn native_layout_vlpi_groups_use_unit_stride() { + let counts = InputCounts { + width: 1, + aux_width: 1, + num_public: 8, + num_vlpi: 2, + num_randomness: 2, + num_periodic: 0, + num_quotient_chunks: 1, + }; + let layout = InputLayout::new(counts); + + let vlpi_base = layout.index(InputKey::VlpiReduction(0)).unwrap(); + assert_eq!( + layout.index(InputKey::VlpiReduction(1)), + Some(vlpi_base + 1), + "Native VLPI groups should advance by unit stride" + ); + } +} diff --git a/crates/ace-codegen/src/lib.rs b/crates/ace-codegen/src/lib.rs index 21c17a92c6..8302131a99 100644 --- a/crates/ace-codegen/src/lib.rs +++ b/crates/ace-codegen/src/lib.rs @@ -1,7 +1,7 @@ //! ACE circuit codegen for Plonky3-based Miden AIRs. //! //! The pipeline is: -//! 1. Capture AIR constraints via plonky3's `SymbolicAirBuilder`. +//! 1. Capture AIR constraints via the `SymbolicAirBuilder`. //! 2. Lower symbolic expressions into a DAG that mirrors verifier constraints evaluation. //! 3. Emit an ACE circuit plus an `InputLayout` describing the MASM ACE-READ section order. //! @@ -16,7 +16,7 @@ //! use miden_air::ProcessorAir; //! use miden_core::{Felt, field::QuadFelt}; //! -//! let config = AceConfig { num_quotient_chunks: 8, num_aux_inputs: 14, layout: LayoutKind::Masm }; +//! let config = AceConfig { num_quotient_chunks: 8, num_vlpi_groups: 1, layout: LayoutKind::Masm }; //! let circuit = build_ace_circuit_for_air::<_, Felt, QuadFelt>(&ProcessorAir, config)?; //! ``` //! @@ -59,9 +59,15 @@ pub enum AceError { InvalidInputLayout { message: String }, } +#[cfg(any(test, feature = "testing"))] +pub mod testing; + pub use crate::{ - circuit::AceCircuit, + circuit::{AceCircuit, emit_circuit}, + dag::{AceDag, DagBuilder, DagSnapshot, NodeId, NodeKind}, encode::EncodedCircuit, layout::{InputCounts, InputKey, InputLayout}, - pipeline::{AceConfig, LayoutKind, build_ace_circuit_for_air, build_layout_for_air}, + pipeline::{ + AceArtifacts, AceConfig, LayoutKind, build_ace_circuit_for_air, build_ace_dag_for_air, + }, }; diff --git a/crates/ace-codegen/src/pipeline.rs b/crates/ace-codegen/src/pipeline.rs index 5365dd5a70..541c76b89f 100644 --- a/crates/ace-codegen/src/pipeline.rs +++ b/crates/ace-codegen/src/pipeline.rs @@ -38,15 +38,18 @@ pub enum LayoutKind { pub struct AceConfig { /// Number of quotient chunks used by the AIR. pub num_quotient_chunks: usize, - /// Number of auxiliary inputs reserved in the stark-vars block. - pub num_aux_inputs: usize, + /// Number of variable-length public input groups. + /// Each group produces one reduced extension field element. + /// The layout policy handles alignment (e.g., MASM word-aligns each group to + /// 2 EF slots; Native uses 1 EF slot per group). + pub num_vlpi_groups: usize, /// Layout policy (Native vs Masm). pub layout: LayoutKind, } /// Output of the ACE codegen pipeline (layout + DAG). #[derive(Debug)] -pub(crate) struct AceArtifacts { +pub struct AceArtifacts { /// Input layout describing the READ section order. pub layout: InputLayout, /// DAG that mirrors the verifier evaluation. @@ -55,8 +58,9 @@ pub(crate) struct AceArtifacts { /// Build a verifier-equivalent ACE circuit for the provided AIR. /// -/// This is the highest-level entry point: it builds the DAG, validates layout -/// invariants, and emits the off-VM circuit representation. +/// This builds the constraint-evaluation DAG, validates layout invariants, and +/// emits the off-VM circuit representation. The circuit performs the constraint +/// evaluation check at the out-of-domain point z. pub fn build_ace_circuit_for_air( air: &A, config: AceConfig, @@ -71,31 +75,8 @@ where emit_circuit(&artifacts.dag, artifacts.layout) } -/// Build the input layout for the provided AIR. -/// -/// The returned `InputLayout` is validated and ready for input assembly. -pub fn build_layout_for_air(air: &A, config: AceConfig) -> InputLayout -where - A: LiftedAir, - F: Field, - EF: ExtensionField, - SymbolicExpressionExt: Algebra, -{ - let num_periodic = air.periodic_columns().len(); - let counts = input_counts_for_air::(air, config, num_periodic); - let layout = match config.layout { - LayoutKind::Native => InputLayout::new(counts), - LayoutKind::Masm => InputLayout::new_masm(counts), - }; - layout.validate(); - layout -} - /// Build a verifier-equivalent DAG and layout for the provided AIR. -/// -/// This is useful when you need the DAG for off-VM checks and want to -/// assemble inputs separately. -pub(crate) fn build_ace_dag_for_air( +pub fn build_ace_dag_for_air( air: &A, config: AceConfig, ) -> Result, AceError> @@ -154,15 +135,26 @@ where ); let num_randomness = air.num_randomness(); - assert!(num_randomness > 0, "AIR must declare at least one randomness challenge"); + assert!( + num_randomness == 2, + "AIR must declare exactly 2 randomness challenges (alpha, beta), got {num_randomness}" + ); + + // Convert logical VLPI groups to EF slots based on layout policy. + // MASM word-aligns each group (4 base felts = 2 EF slots per group). + // Native uses 1 EF slot per group (no padding). + let num_vlpi = match config.layout { + LayoutKind::Masm => config.num_vlpi_groups * 2, + LayoutKind::Native => config.num_vlpi_groups, + }; InputCounts { width: air.width(), aux_width: air.aux_width(), num_public: air.num_public_values(), + num_vlpi, num_randomness, num_periodic, - num_aux_inputs: config.num_aux_inputs, num_quotient_chunks: config.num_quotient_chunks, } } diff --git a/crates/ace-codegen/src/quotient.rs b/crates/ace-codegen/src/quotient.rs index a28b14ffa8..2cc4d6c33b 100644 --- a/crates/ace-codegen/src/quotient.rs +++ b/crates/ace-codegen/src/quotient.rs @@ -6,102 +6,11 @@ use miden_crypto::field::{ExtensionField, Field}; -#[cfg(test)] -use crate::AceError; use crate::{ dag::{DagBuilder, NodeId}, layout::{InputKey, InputLayout}, }; -/// Evaluate the quotient recomposition at `zeta` using provided inputs. -#[cfg(test)] -pub fn eval_quotient(layout: &InputLayout, inputs: &[EF]) -> Result -where - F: Field, - EF: ExtensionField, -{ - if inputs.len() != layout.total_inputs { - return Err(AceError::InvalidInputLength { - expected: layout.total_inputs, - got: inputs.len(), - }); - } - - let k = layout.counts.num_quotient_chunks; - let z_pow_n = inputs[layout.index(InputKey::ZPowN).expect("ZPowN in layout")]; - let s0 = inputs[layout.index(InputKey::S0).expect("S0 in layout")]; - let g = inputs[layout.index(InputKey::G).expect("G in layout")]; - let weight0 = inputs[layout.index(InputKey::Weight0).expect("Weight0 in layout")]; - - let (deltas, weights) = { - let mut ops = FieldOps; - compute_deltas_and_weights(k, z_pow_n, s0, g, weight0, &mut ops) - }; - - let mut chunk_values = Vec::with_capacity(k); - for chunk in 0..k { - let mut value = EF::ZERO; - for coord in 0..EF::DIMENSION { - let basis = EF::ith_basis_element(coord).expect("basis index within extension degree"); - let coord_value = inputs[layout - .index(InputKey::QuotientChunkCoord { offset: 0, chunk, coord }) - .expect("quotient chunk coord in layout")]; - value += basis * coord_value; - } - chunk_values.push(value); - } - - let mut quotient = EF::ZERO; - for (i, &chunk_value) in chunk_values.iter().enumerate() { - let mut prod = EF::ONE; - for (j, delta) in deltas.iter().enumerate() { - if i != j { - prod *= *delta; - } - } - let zps = weights[i] * prod; - quotient += zps * chunk_value; - } - - Ok(quotient) -} - -/// Compute the barycentric kernel value (`zps`) for a single chunk. -#[cfg(test)] -pub fn zps_for_chunk(layout: &InputLayout, inputs: &[EF], chunk: usize) -> Result -where - EF: Field, -{ - if inputs.len() != layout.total_inputs { - return Err(AceError::InvalidInputLength { - expected: layout.total_inputs, - got: inputs.len(), - }); - } - - let k = layout.counts.num_quotient_chunks; - assert!(chunk < k, "quotient chunk {chunk} out of range (k={k})"); - - let z_pow_n = inputs[layout.index(InputKey::ZPowN).expect("ZPowN in layout")]; - let s0 = inputs[layout.index(InputKey::S0).expect("S0 in layout")]; - let g = inputs[layout.index(InputKey::G).expect("G in layout")]; - let weight0 = inputs[layout.index(InputKey::Weight0).expect("Weight0 in layout")]; - - let (deltas, weights) = { - let mut ops = FieldOps; - compute_deltas_and_weights(k, z_pow_n, s0, g, weight0, &mut ops) - }; - - let mut prod = EF::ONE; - for (j, delta) in deltas.iter().enumerate() { - if j != chunk { - prod *= *delta; - } - } - - Ok(weights[chunk] * prod) -} - /// Build DAG nodes that recombine quotient chunks. pub(crate) fn build_quotient_recomposition_dag( builder: &mut DagBuilder, @@ -114,12 +23,12 @@ where let k = layout.counts.num_quotient_chunks; let z_pow_n = builder.input(InputKey::ZPowN); let s0 = builder.input(InputKey::S0); - let g = builder.input(InputKey::G); + let f = builder.input(InputKey::F); let weight0 = builder.input(InputKey::Weight0); let (deltas, weights) = { let mut ops = DagOps { builder }; - compute_deltas_and_weights(k, z_pow_n, s0, g, weight0, &mut ops) + compute_deltas_and_weights(k, z_pow_n, s0, f, weight0, &mut ops) }; let mut chunk_values = Vec::with_capacity(k); @@ -152,23 +61,6 @@ where quotient } -#[cfg(test)] -struct FieldOps; - -#[cfg(test)] -impl Ops for FieldOps -where - EF: Field, -{ - fn sub(&mut self, a: EF, b: EF) -> EF { - a - b - } - - fn mul(&mut self, a: EF, b: EF) -> EF { - a * b - } -} - struct DagOps<'a, EF> { builder: &'a mut DagBuilder, } @@ -195,7 +87,7 @@ fn compute_deltas_and_weights( k: usize, z_pow_n: T, s0: T, - g: T, + f: T, weight0: T, ops: &mut impl Ops, ) -> (Vec, Vec) @@ -209,8 +101,8 @@ where for _ in 0..k { deltas.push(ops.sub(z_pow_n, shift)); weights.push(weight); - shift = ops.mul(shift, g); - weight = ops.mul(weight, g); + shift = ops.mul(shift, f); + weight = ops.mul(weight, f); } (deltas, weights) } diff --git a/crates/ace-codegen/src/randomness.rs b/crates/ace-codegen/src/randomness.rs index 45689a50e8..c1f6e70d45 100644 --- a/crates/ace-codegen/src/randomness.rs +++ b/crates/ace-codegen/src/randomness.rs @@ -22,10 +22,10 @@ pub(crate) fn aux_rand_indices(randomness: InputRegion) -> (usize, usize) { /// Lower a challenge index into DAG nodes. /// -/// Challenge indices map to: -/// - 0 → alpha -/// - 1 → 1 (beta^0) -/// - n → beta^(n-1) +/// The AIR's `Challenges::from_randomness` receives these two raw values and +/// internally expands beta into powers `[1, beta, beta^2, ...]` via symbolic +/// multiplication. This means the DAG will contain nodes for `beta^k` built +/// from `AuxRandBeta`, which is correct. pub(crate) fn lower_challenge( builder: &mut DagBuilder, layout: &InputLayout, @@ -37,16 +37,11 @@ where let num = layout.counts.num_randomness; assert!(index < num, "challenge index {index} out of range (num={num})"); - if index == 0 { - return builder.input(InputKey::AuxRandAlpha); + match index { + 0 => builder.input(InputKey::AuxRandAlpha), + 1 => builder.input(InputKey::AuxRandBeta), + _ => panic!( + "challenge index {index} exceeds the 2-element randomness convention (alpha, beta)" + ), } - if index == 1 { - return builder.constant(EF::ONE); - } - let beta_node = builder.input(InputKey::AuxRandBeta); - let mut power = beta_node; - for _ in 2..index { - power = builder.mul(power, beta_node); - } - power } diff --git a/crates/ace-codegen/src/testing.rs b/crates/ace-codegen/src/testing.rs new file mode 100644 index 0000000000..2588337a02 --- /dev/null +++ b/crates/ace-codegen/src/testing.rs @@ -0,0 +1,340 @@ +//! Test helpers for ACE codegen, available under the `testing` feature or `#[cfg(test)]`. +//! +//! These provide reference evaluators for symbolic expressions, periodic columns, +//! constraint folding, quotient recomposition, and DAG evaluation, suitable for +//! validating the ACE pipeline from both within ace-codegen tests and from +//! downstream integration tests (e.g. in miden-air). + +use miden_core::{Felt, field::QuadFelt}; +use miden_crypto::{ + field::{ExtensionField, Field, TwoAdicField}, + stark::{ + air::symbolic::{ + BaseEntry, BaseLeaf, ConstraintLayout, ExtEntry, ExtLeaf, SymbolicExpression, + SymbolicExpressionExt, + }, + dft::{Radix2DitParallel, TwoAdicSubgroupDft}, + }, +}; + +use crate::{AceDag, AceError, InputKey, InputLayout}; + +/// Deterministic input filler for layout-sized buffers. +/// +/// Generates pseudo-random `QuadFelt` values using a simple LCG, suitable for +/// testing against hand-computed reference values. +pub fn fill_inputs(layout: &InputLayout) -> Vec { + let mut values = Vec::with_capacity(layout.total_inputs); + let mut state = 0x9e37_79b9_7f4a_7c15u64; + for _ in 0..layout.total_inputs { + state = state.wrapping_mul(6364136223846793005).wrapping_add(1); + let lo = Felt::new(state); + state = state.wrapping_mul(6364136223846793005).wrapping_add(1); + let hi = Felt::new(state); + values.push(QuadFelt::new([lo, hi])); + } + values +} + +/// Evaluate periodic columns at a point by computing the polynomial in +/// coefficient form via inverse DFT, then evaluating with Horner's method. +pub fn eval_periodic_values(periodic_columns: &[Vec], z_k: EF) -> Vec +where + F: TwoAdicField + Ord, + EF: ExtensionField, +{ + if periodic_columns.is_empty() { + return Vec::new(); + } + let max_len = periodic_columns.iter().map(|col| col.len()).max().unwrap_or(0); + let dft = Radix2DitParallel::::default(); + + periodic_columns + .iter() + .map(|col| { + if col.is_empty() { + return EF::ZERO; + } + let coeffs = dft.idft(col.clone()); + let ratio = max_len / col.len(); + let log_pow = ratio.ilog2() as usize; + let mut z_col = z_k; + for _ in 0..log_pow { + z_col *= z_col; + } + let mut acc = EF::ZERO; + for coeff in coeffs.iter().rev() { + acc = acc * z_col + EF::from(*coeff); + } + acc + }) + .collect() +} + +/// Evaluate a base-field symbolic expression at concrete inputs. +pub fn eval_base_expr( + expr: &SymbolicExpression, + inputs: &[EF], + layout: &InputLayout, + periodic_values: &[EF], +) -> EF +where + F: Field, + EF: ExtensionField, +{ + match expr { + SymbolicExpression::Leaf(leaf) => match leaf { + BaseLeaf::Variable(v) => match v.entry { + BaseEntry::Main { offset } => { + let key = InputKey::Main { offset, index: v.index }; + inputs[layout.index(key).unwrap()] + }, + BaseEntry::Public => { + let key = InputKey::Public(v.index); + inputs[layout.index(key).unwrap()] + }, + BaseEntry::Periodic => periodic_values[v.index], + BaseEntry::Preprocessed { .. } => panic!("preprocessed not supported in test"), + }, + BaseLeaf::IsFirstRow => inputs[layout.index(InputKey::IsFirst).unwrap()], + BaseLeaf::IsLastRow => inputs[layout.index(InputKey::IsLast).unwrap()], + BaseLeaf::IsTransition => inputs[layout.index(InputKey::IsTransition).unwrap()], + BaseLeaf::Constant(c) => EF::from(*c), + }, + SymbolicExpression::Add { x, y, .. } => { + eval_base_expr::(x, inputs, layout, periodic_values) + + eval_base_expr::(y, inputs, layout, periodic_values) + }, + SymbolicExpression::Sub { x, y, .. } => { + eval_base_expr::(x, inputs, layout, periodic_values) + - eval_base_expr::(y, inputs, layout, periodic_values) + }, + SymbolicExpression::Mul { x, y, .. } => { + eval_base_expr::(x, inputs, layout, periodic_values) + * eval_base_expr::(y, inputs, layout, periodic_values) + }, + SymbolicExpression::Neg { x, .. } => { + -eval_base_expr::(x, inputs, layout, periodic_values) + }, + } +} + +/// Evaluate an extension-field symbolic expression at concrete inputs. +pub fn eval_ext_expr( + expr: &SymbolicExpressionExt, + inputs: &[EF], + layout: &InputLayout, + periodic_values: &[EF], +) -> EF +where + F: Field, + EF: ExtensionField, +{ + match expr { + SymbolicExpressionExt::Leaf(leaf) => match leaf { + ExtLeaf::Base(base_expr) => { + eval_base_expr::(base_expr, inputs, layout, periodic_values) + }, + ExtLeaf::ExtVariable(v) => match v.entry { + ExtEntry::Permutation { offset } => { + let mut acc = EF::ZERO; + for coord in 0..EF::DIMENSION { + let basis = EF::ith_basis_element(coord).unwrap(); + let key = InputKey::AuxCoord { offset, index: v.index, coord }; + let value = inputs[layout.index(key).unwrap()]; + acc += basis * value; + } + acc + }, + ExtEntry::Challenge => { + let alpha = inputs[layout.index(InputKey::AuxRandAlpha).unwrap()]; + let beta = inputs[layout.index(InputKey::AuxRandBeta).unwrap()]; + match v.index { + 0 => alpha, + 1 => beta, + _ => panic!( + "challenge index {} exceeds the 2-element randomness convention", + v.index + ), + } + }, + ExtEntry::PermutationValue => { + let key = InputKey::AuxBusBoundary(v.index); + inputs[layout.index(key).unwrap()] + }, + }, + ExtLeaf::ExtConstant(c) => *c, + }, + SymbolicExpressionExt::Add { x, y, .. } => { + eval_ext_expr::(x, inputs, layout, periodic_values) + + eval_ext_expr::(y, inputs, layout, periodic_values) + }, + SymbolicExpressionExt::Sub { x, y, .. } => { + eval_ext_expr::(x, inputs, layout, periodic_values) + - eval_ext_expr::(y, inputs, layout, periodic_values) + }, + SymbolicExpressionExt::Mul { x, y, .. } => { + eval_ext_expr::(x, inputs, layout, periodic_values) + * eval_ext_expr::(y, inputs, layout, periodic_values) + }, + SymbolicExpressionExt::Neg { x, .. } => { + -eval_ext_expr::(x, inputs, layout, periodic_values) + }, + } +} + +/// Evaluate the folded constraint accumulator from symbolic constraints. +/// +/// Merges base and extension constraints in evaluation order (using the +/// `ConstraintLayout`), then folds them via Horner with `alpha`. +pub fn eval_folded_constraints( + base_constraints: &[SymbolicExpression], + ext_constraints: &[SymbolicExpressionExt], + constraint_layout: &ConstraintLayout, + inputs: &[EF], + layout: &InputLayout, + periodic_values: &[EF], +) -> EF +where + F: Field, + EF: ExtensionField, +{ + let alpha = inputs[layout.index(InputKey::Alpha).unwrap()]; + + let total = constraint_layout.base_indices.len() + constraint_layout.ext_indices.len(); + let mut ordered: Vec<(usize, bool, usize)> = Vec::with_capacity(total); + for (i, &pos) in constraint_layout.base_indices.iter().enumerate() { + ordered.push((pos, false, i)); + } + for (i, &pos) in constraint_layout.ext_indices.iter().enumerate() { + ordered.push((pos, true, i)); + } + ordered.sort_by_key(|(pos, ..)| *pos); + + let mut acc = EF::ZERO; + for &(_, is_ext, idx) in &ordered { + let val = if is_ext { + eval_ext_expr::(&ext_constraints[idx], inputs, layout, periodic_values) + } else { + eval_base_expr::(&base_constraints[idx], inputs, layout, periodic_values) + }; + acc = acc * alpha + val; + } + acc +} + +/// Evaluate the quotient recomposition at `zeta` using provided inputs. +pub fn eval_quotient(layout: &InputLayout, inputs: &[EF]) -> EF +where + F: Field, + EF: ExtensionField, +{ + let k = layout.counts.num_quotient_chunks; + let z_pow_n = inputs[layout.index(InputKey::ZPowN).expect("ZPowN in layout")]; + let s0 = inputs[layout.index(InputKey::S0).expect("S0 in layout")]; + let f = inputs[layout.index(InputKey::F).expect("F in layout")]; + let weight0 = inputs[layout.index(InputKey::Weight0).expect("Weight0 in layout")]; + + let (deltas, weights) = compute_deltas_and_weights(k, z_pow_n, s0, f, weight0); + + let mut quotient = EF::ZERO; + for chunk in 0..k { + let mut chunk_value = EF::ZERO; + for coord in 0..EF::DIMENSION { + let basis = EF::ith_basis_element(coord).expect("basis index within extension degree"); + let coord_value = inputs[layout + .index(InputKey::QuotientChunkCoord { offset: 0, chunk, coord }) + .expect("quotient chunk coord in layout")]; + chunk_value += basis * coord_value; + } + + let mut prod = EF::ONE; + for (j, delta) in deltas.iter().enumerate() { + if j != chunk { + prod *= *delta; + } + } + quotient += weights[chunk] * prod * chunk_value; + } + + quotient +} + +/// Compute the barycentric kernel value (`zps`) for a single quotient chunk. +pub fn zps_for_chunk(layout: &InputLayout, inputs: &[EF], chunk: usize) -> EF +where + F: Field, + EF: ExtensionField, +{ + let k = layout.counts.num_quotient_chunks; + assert!(chunk < k, "quotient chunk {chunk} out of range (k={k})"); + + let z_pow_n = inputs[layout.index(InputKey::ZPowN).expect("ZPowN in layout")]; + let s0 = inputs[layout.index(InputKey::S0).expect("S0 in layout")]; + let f = inputs[layout.index(InputKey::F).expect("F in layout")]; + let weight0 = inputs[layout.index(InputKey::Weight0).expect("Weight0 in layout")]; + + let (deltas, weights) = compute_deltas_and_weights(k, z_pow_n, s0, f, weight0); + + let mut prod = EF::ONE; + for (j, delta) in deltas.iter().enumerate() { + if j != chunk { + prod *= *delta; + } + } + + weights[chunk] * prod +} + +/// Evaluate a lowered DAG against concrete inputs. +pub fn eval_dag(dag: &AceDag, inputs: &[EF], layout: &InputLayout) -> Result +where + EF: Field, +{ + if inputs.len() != layout.total_inputs { + return Err(AceError::InvalidInputLength { + expected: layout.total_inputs, + got: inputs.len(), + }); + } + + let mut values: Vec = vec![EF::ZERO; dag.nodes().len()]; + for (idx, node) in dag.nodes().iter().enumerate() { + let value = match node { + crate::dag::NodeKind::Input(key) => { + let input_idx = layout.index(*key).ok_or_else(|| AceError::InvalidInputLayout { + message: format!("missing input key in layout: {key:?}"), + })?; + inputs[input_idx] + }, + crate::dag::NodeKind::Constant(c) => *c, + crate::dag::NodeKind::Add(a, b) => values[a.index()] + values[b.index()], + crate::dag::NodeKind::Sub(a, b) => values[a.index()] - values[b.index()], + crate::dag::NodeKind::Mul(a, b) => values[a.index()] * values[b.index()], + crate::dag::NodeKind::Neg(a) => -values[a.index()], + }; + values[idx] = value; + } + + Ok(values[dag.root().index()]) +} + +fn compute_deltas_and_weights( + k: usize, + z_pow_n: EF, + s0: EF, + f: EF, + weight0: EF, +) -> (Vec, Vec) { + let mut deltas = Vec::with_capacity(k); + let mut weights = Vec::with_capacity(k); + let mut shift = s0; + let mut weight = weight0; + for _ in 0..k { + deltas.push(z_pow_n - shift); + weights.push(weight); + shift *= f; + weight *= f; + } + (deltas, weights) +} diff --git a/crates/ace-codegen/src/tests/basic.rs b/crates/ace-codegen/src/tests/basic.rs index 3d8dbd102b..949da4a531 100644 --- a/crates/ace-codegen/src/tests/basic.rs +++ b/crates/ace-codegen/src/tests/basic.rs @@ -35,7 +35,7 @@ impl LiftedAir for MockAir { } fn num_randomness(&self) -> usize { - 1 + 2 } fn aux_width(&self) -> usize { @@ -89,18 +89,16 @@ fn build_inputs(layout: &InputLayout) -> Vec { set(InputKey::AuxCoord { offset: 0, index: 0, coord: 1 }, ef(101)); set(InputKey::AuxCoord { offset: 1, index: 0, coord: 0 }, ef(12)); set(InputKey::AuxCoord { offset: 1, index: 0, coord: 1 }, ef(102)); - set(InputKey::Z, ef(2)); set(InputKey::Alpha, ef(17)); - set(InputKey::GInv, ef(3)); set(InputKey::ZPowN, ef(19)); - set(InputKey::GInv2, ef(5)); set(InputKey::ZK, ef(23)); + set(InputKey::IsFirst, ef(47)); + set(InputKey::IsLast, ef(43)); + set(InputKey::IsTransition, ef(2) - ef(3)); + set(InputKey::Gamma, ef(53)); set(InputKey::Weight0, ef(31)); - set(InputKey::G, ef(37)); + set(InputKey::F, ef(37)); set(InputKey::S0, ef(41)); - set(InputKey::InvZMinusGInv, ef(43)); - set(InputKey::InvZMinusOne, ef(47)); - set(InputKey::InvVanishing, ef(2)); set(InputKey::QuotientChunkCoord { offset: 0, chunk: 0, coord: 0 }, ef(2)); set(InputKey::QuotientChunkCoord { offset: 0, chunk: 0, coord: 1 }, ef(3)); @@ -115,7 +113,7 @@ fn test_verifier_dag_matches_manual_eval() { let air = MockAir; let config = AceConfig { num_quotient_chunks: 2, - num_aux_inputs: 14, + num_vlpi_groups: 0, layout: LayoutKind::Native, }; let artifacts = build_ace_dag_for_air::<_, F, EF>(&air, config).unwrap(); @@ -135,28 +133,20 @@ fn test_verifier_dag_matches_manual_eval() { }; let mut builder = SymbolicAirBuilder::::new(air_layout); air.eval(&mut builder); - let constraint_layout = builder.constraint_layout(); - let base_constraints = builder.base_constraints(); - let ext_constraints = builder.extension_constraints(); - let dag = artifacts.dag; - - let alpha = inputs[layout.index(InputKey::Alpha).unwrap()]; - let inv_vanishing = inputs[layout.index(InputKey::InvVanishing).unwrap()]; - - let acc = eval_folded_constraints::( - &base_constraints, - &ext_constraints, - &constraint_layout, - alpha, + + let acc = eval_folded_constraints( + &builder.base_constraints(), + &builder.extension_constraints(), + &builder.constraint_layout(), &inputs, &layout, &periodic_values, ); - let folded = acc * inv_vanishing; - let quotient = eval_quotient(&layout, &inputs); - let expected = folded - quotient; + let z_pow_n = inputs[layout.index(InputKey::ZPowN).unwrap()]; + let vanishing = z_pow_n - EF::ONE; + let expected = acc - eval_quotient(&layout, &inputs) * vanishing; - let actual = eval_dag(&dag.nodes, dag.root, &inputs, &layout); + let actual = eval_dag(artifacts.dag.nodes(), artifacts.dag.root(), &inputs, &layout); assert_eq!(actual, expected); } @@ -165,7 +155,7 @@ fn test_emitted_circuit_matches_dag_eval() { let air = MockAir; let config = AceConfig { num_quotient_chunks: 2, - num_aux_inputs: 14, + num_vlpi_groups: 0, layout: LayoutKind::Native, }; let artifacts = build_ace_dag_for_air::<_, F, EF>(&air, config).unwrap(); @@ -173,7 +163,7 @@ fn test_emitted_circuit_matches_dag_eval() { let inputs = build_inputs(&layout); let circuit = emit_circuit(&artifacts.dag, layout.clone()).unwrap(); - let dag_value = eval_dag(&artifacts.dag.nodes, artifacts.dag.root, &inputs, &layout); + let dag_value = eval_dag(artifacts.dag.nodes(), artifacts.dag.root(), &inputs, &layout); let circuit_value = circuit.eval(&inputs).expect("circuit eval"); assert_eq!(circuit_value, dag_value); } @@ -183,7 +173,7 @@ fn test_encoded_circuit_structure() { let air = MockAir; let config = AceConfig { num_quotient_chunks: 2, - num_aux_inputs: 14, + num_vlpi_groups: 0, layout: LayoutKind::Native, }; let artifacts = build_ace_dag_for_air::<_, F, EF>(&air, config).unwrap(); diff --git a/crates/ace-codegen/src/tests/common.rs b/crates/ace-codegen/src/tests/common.rs index 431196ea6e..06ce2d4f31 100644 --- a/crates/ace-codegen/src/tests/common.rs +++ b/crates/ace-codegen/src/tests/common.rs @@ -1,227 +1,14 @@ use miden_core::{Felt, field::QuadFelt}; -use miden_crypto::{ - field::{ExtensionField, Field, PrimeCharacteristicRing}, - stark::{ - air::symbolic::{ - BaseEntry, BaseLeaf, ConstraintLayout, ExtEntry, ExtLeaf, SymbolicExpression, - SymbolicExpressionExt, - }, - dft::{Radix2DitParallel, TwoAdicSubgroupDft}, - }, -}; +use miden_crypto::field::PrimeCharacteristicRing; +pub use crate::testing::eval_folded_constraints; use crate::{ - InputKey, InputLayout, + InputLayout, dag::{NodeId, NodeKind}, - quotient, }; -/// Deterministic input filler for layout-sized buffers. -pub fn fill_inputs(layout: &InputLayout) -> Vec { - let mut values = Vec::with_capacity(layout.total_inputs); - let mut state = 0x9e37_79b9_7f4a_7c15u64; - for _ in 0..layout.total_inputs { - state = state.wrapping_mul(6364136223846793005).wrapping_add(1); - let lo = Felt::new(state); - state = state.wrapping_mul(6364136223846793005).wrapping_add(1); - let hi = Felt::new(state); - values.push(QuadFelt::new([lo, hi])); - } - values -} - pub fn eval_periodic_values(periodic_columns: &[Vec], z_k: QuadFelt) -> Vec { - if periodic_columns.is_empty() { - return Vec::new(); - } - let max_len = periodic_columns.iter().map(|col| col.len()).max().unwrap_or(0); - let dft = Radix2DitParallel::::default(); - - periodic_columns - .iter() - .map(|col| { - if col.is_empty() { - return QuadFelt::ZERO; - } - let coeffs = dft.idft(col.clone()); - let ratio = max_len / col.len(); - let log_pow = ratio.ilog2() as usize; - let mut z_col = z_k; - for _ in 0..log_pow { - z_col *= z_col; - } - let mut acc = QuadFelt::ZERO; - for coeff in coeffs.iter().rev() { - acc = acc * z_col + QuadFelt::from(*coeff); - } - acc - }) - .collect() -} - -/// Evaluate a base-field symbolic expression at concrete inputs. -pub fn eval_base_expr( - expr: &SymbolicExpression, - inputs: &[EF], - layout: &InputLayout, - periodic_values: &[EF], -) -> EF -where - F: Field, - EF: ExtensionField, -{ - match expr { - SymbolicExpression::Leaf(leaf) => match leaf { - BaseLeaf::Variable(v) => match v.entry { - BaseEntry::Main { offset } => { - let key = InputKey::Main { offset, index: v.index }; - inputs[layout.index(key).unwrap()] - }, - BaseEntry::Public => { - let key = InputKey::Public(v.index); - inputs[layout.index(key).unwrap()] - }, - BaseEntry::Periodic => periodic_values[v.index], - BaseEntry::Preprocessed { .. } => { - panic!("preprocessed not supported in test") - }, - }, - BaseLeaf::IsFirstRow => { - let z_pow_n = inputs[layout.index(InputKey::ZPowN).unwrap()]; - let inv = inputs[layout.index(InputKey::InvZMinusOne).unwrap()]; - (z_pow_n - EF::ONE) * inv - }, - BaseLeaf::IsLastRow => { - let z_pow_n = inputs[layout.index(InputKey::ZPowN).unwrap()]; - let inv = inputs[layout.index(InputKey::InvZMinusGInv).unwrap()]; - (z_pow_n - EF::ONE) * inv - }, - BaseLeaf::IsTransition => { - let z = inputs[layout.index(InputKey::Z).unwrap()]; - let g_inv = inputs[layout.index(InputKey::GInv).unwrap()]; - z - g_inv - }, - BaseLeaf::Constant(c) => EF::from(*c), - }, - SymbolicExpression::Add { x, y, .. } => { - eval_base_expr::(x, inputs, layout, periodic_values) - + eval_base_expr::(y, inputs, layout, periodic_values) - }, - SymbolicExpression::Sub { x, y, .. } => { - eval_base_expr::(x, inputs, layout, periodic_values) - - eval_base_expr::(y, inputs, layout, periodic_values) - }, - SymbolicExpression::Mul { x, y, .. } => { - eval_base_expr::(x, inputs, layout, periodic_values) - * eval_base_expr::(y, inputs, layout, periodic_values) - }, - SymbolicExpression::Neg { x, .. } => { - -eval_base_expr::(x, inputs, layout, periodic_values) - }, - } -} - -/// Evaluate an extension-field symbolic expression at concrete inputs. -pub fn eval_ext_expr( - expr: &SymbolicExpressionExt, - inputs: &[EF], - layout: &InputLayout, - periodic_values: &[EF], -) -> EF -where - F: Field, - EF: ExtensionField, -{ - match expr { - SymbolicExpressionExt::Leaf(leaf) => match leaf { - ExtLeaf::Base(base_expr) => { - eval_base_expr::(base_expr, inputs, layout, periodic_values) - }, - ExtLeaf::ExtVariable(v) => match v.entry { - ExtEntry::Permutation { offset } => { - let mut acc = EF::ZERO; - for coord in 0..EF::DIMENSION { - let basis = EF::ith_basis_element(coord).unwrap(); - let key = InputKey::AuxCoord { offset, index: v.index, coord }; - let value = inputs[layout.index(key).unwrap()]; - acc += basis * value; - } - acc - }, - ExtEntry::Challenge => { - let alpha = inputs[layout.index(InputKey::AuxRandAlpha).unwrap()]; - let beta = inputs[layout.index(InputKey::AuxRandBeta).unwrap()]; - match v.index { - 0 => alpha, - 1 => EF::ONE, - _ => { - let mut power = beta; - for _ in 2..v.index { - power *= beta; - } - power - }, - } - }, - ExtEntry::PermutationValue => { - let key = InputKey::AuxBusBoundary(v.index); - inputs[layout.index(key).unwrap()] - }, - }, - ExtLeaf::ExtConstant(c) => *c, - }, - SymbolicExpressionExt::Add { x, y, .. } => { - eval_ext_expr::(x, inputs, layout, periodic_values) - + eval_ext_expr::(y, inputs, layout, periodic_values) - }, - SymbolicExpressionExt::Sub { x, y, .. } => { - eval_ext_expr::(x, inputs, layout, periodic_values) - - eval_ext_expr::(y, inputs, layout, periodic_values) - }, - SymbolicExpressionExt::Mul { x, y, .. } => { - eval_ext_expr::(x, inputs, layout, periodic_values) - * eval_ext_expr::(y, inputs, layout, periodic_values) - }, - SymbolicExpressionExt::Neg { x, .. } => { - -eval_ext_expr::(x, inputs, layout, periodic_values) - }, - } -} - -/// Evaluate all constraints (base + extension) folded with alpha in evaluation order. -pub fn eval_folded_constraints( - base_constraints: &[SymbolicExpression], - ext_constraints: &[SymbolicExpressionExt], - constraint_layout: &ConstraintLayout, - alpha: EF, - inputs: &[EF], - layout: &InputLayout, - periodic_values: &[EF], -) -> EF -where - F: Field, - EF: ExtensionField, -{ - let total = constraint_layout.base_indices.len() + constraint_layout.ext_indices.len(); - let mut ordered: Vec<(usize, bool, usize)> = Vec::with_capacity(total); - for (i, &pos) in constraint_layout.base_indices.iter().enumerate() { - ordered.push((pos, false, i)); - } - for (i, &pos) in constraint_layout.ext_indices.iter().enumerate() { - ordered.push((pos, true, i)); - } - ordered.sort_by_key(|(pos, ..)| *pos); - - let mut acc = EF::ZERO; - for &(_, is_ext, idx) in &ordered { - let val = if is_ext { - eval_ext_expr::(&ext_constraints[idx], inputs, layout, periodic_values) - } else { - eval_base_expr::(&base_constraints[idx], inputs, layout, periodic_values) - }; - acc = acc * alpha + val; - } - acc + crate::testing::eval_periodic_values::(periodic_columns, z_k) } pub fn eval_dag( @@ -246,9 +33,5 @@ pub fn eval_dag( } pub fn eval_quotient(layout: &InputLayout, inputs: &[QuadFelt]) -> QuadFelt { - quotient::eval_quotient::(layout, inputs).expect("quotient evaluation") -} - -pub fn zps_for_chunk(layout: &InputLayout, inputs: &[QuadFelt], chunk: usize) -> QuadFelt { - quotient::zps_for_chunk(layout, inputs, chunk).expect("quotient zps") + crate::testing::eval_quotient::(layout, inputs) } diff --git a/crates/ace-codegen/src/tests/layout_masm.rs b/crates/ace-codegen/src/tests/layout_masm.rs index ad073a4e78..e7d74ff3c4 100644 --- a/crates/ace-codegen/src/tests/layout_masm.rs +++ b/crates/ace-codegen/src/tests/layout_masm.rs @@ -6,9 +6,9 @@ fn masm_layout_aligns_and_maps_aux_inputs() { width: 3, aux_width: 2, num_public: 5, + num_vlpi: 0, num_randomness: 16, num_periodic: 1, - num_aux_inputs: 14, num_quotient_chunks: 2, }; let layout = InputLayout::new_masm(counts); @@ -35,24 +35,24 @@ fn masm_layout_aligns_and_maps_aux_inputs() { assert_eq!(quotient_next_base % 4, 0); let aux_bus_base = layout.index(InputKey::AuxBusBoundary(0)).unwrap(); assert_eq!(aux_bus_base % 2, 0); - let stark_base = layout.index(InputKey::Z).unwrap(); + let stark_base = layout.index(InputKey::Alpha).unwrap(); assert_eq!(stark_base % 2, 0); assert_eq!(layout.index(InputKey::AuxRandBeta), Some(rand_base)); assert_eq!(layout.index(InputKey::AuxRandAlpha), Some(rand_base + 1)); - let base = layout.index(InputKey::Z).unwrap(); - assert_eq!(layout.index(InputKey::Z), Some(base)); - assert_eq!(layout.index(InputKey::Alpha), Some(base + 1)); - assert_eq!(layout.index(InputKey::GInv), Some(base + 2)); - assert_eq!(layout.index(InputKey::ZPowN), Some(base + 3)); - assert_eq!(layout.index(InputKey::GInv2), Some(base + 4)); - assert_eq!(layout.index(InputKey::ZK), Some(base + 5)); - assert_eq!(layout.index(InputKey::Weight0), Some(base + 6)); - assert_eq!(layout.index(InputKey::G), Some(base + 7)); - assert_eq!(layout.index(InputKey::S0), Some(base + 8)); - assert_eq!(layout.index(InputKey::InvZMinusGInv), Some(base + 10)); - assert_eq!(layout.index(InputKey::InvZMinusOne), Some(base + 11)); - assert_eq!(layout.index(InputKey::InvVanishing), Some(base + 12)); + // EF values: slots 0-6 + let base = layout.index(InputKey::Alpha).unwrap(); + assert_eq!(layout.index(InputKey::Alpha), Some(base)); + assert_eq!(layout.index(InputKey::ZPowN), Some(base + 1)); + assert_eq!(layout.index(InputKey::ZK), Some(base + 2)); + assert_eq!(layout.index(InputKey::IsFirst), Some(base + 3)); + assert_eq!(layout.index(InputKey::IsLast), Some(base + 4)); + assert_eq!(layout.index(InputKey::IsTransition), Some(base + 5)); + assert_eq!(layout.index(InputKey::Gamma), Some(base + 6)); + // Base-field values: slots 7-9 + assert_eq!(layout.index(InputKey::Weight0), Some(base + 7)); + assert_eq!(layout.index(InputKey::F), Some(base + 8)); + assert_eq!(layout.index(InputKey::S0), Some(base + 9)); let aux_base = layout.index(InputKey::AuxCoord { offset: 0, index: 0, coord: 0 }).unwrap(); assert_eq!( diff --git a/crates/ace-codegen/src/tests/mod.rs b/crates/ace-codegen/src/tests/mod.rs index cce07f3337..e5e5c8dc69 100644 --- a/crates/ace-codegen/src/tests/mod.rs +++ b/crates/ace-codegen/src/tests/mod.rs @@ -1,5 +1,3 @@ mod basic; mod common; mod layout_masm; -mod processor_air; -mod synthetic_ood; diff --git a/crates/ace-codegen/src/tests/processor_air.rs b/crates/ace-codegen/src/tests/processor_air.rs deleted file mode 100644 index f36ed62ac5..0000000000 --- a/crates/ace-codegen/src/tests/processor_air.rs +++ /dev/null @@ -1,87 +0,0 @@ -use miden_air::{LiftedAir, ProcessorAir}; -use miden_core::{Felt, field::QuadFelt}; -use miden_crypto::stark::air::symbolic::{AirLayout, SymbolicAirBuilder}; - -use super::common::{ - eval_dag, eval_folded_constraints, eval_periodic_values, eval_quotient, fill_inputs, -}; -use crate::{ - AceConfig, InputKey, LayoutKind, build_ace_circuit_for_air, pipeline::build_ace_dag_for_air, -}; - -#[test] -fn processor_air_dag_matches_manual_eval() { - let air = ProcessorAir; - let config = AceConfig { - num_quotient_chunks: 2, - num_aux_inputs: 14, - layout: LayoutKind::Native, - }; - let artifacts = build_ace_dag_for_air::<_, Felt, QuadFelt>(&air, config).unwrap(); - let layout = artifacts.layout.clone(); - let inputs = fill_inputs(&layout); - let z_k = inputs[layout.index(InputKey::ZK).unwrap()]; - let periodic_values = - eval_periodic_values(&LiftedAir::::periodic_columns(&air), z_k); - - let air_layout = AirLayout { - preprocessed_width: 0, - main_width: layout.counts.width, - num_public_values: layout.counts.num_public, - permutation_width: layout.counts.aux_width, - num_permutation_challenges: layout.counts.num_randomness, - num_permutation_values: LiftedAir::::num_aux_values(&air), - num_periodic_columns: layout.counts.num_periodic, - }; - let mut builder = SymbolicAirBuilder::::new(air_layout); - LiftedAir::::eval(&air, &mut builder); - let constraint_layout = builder.constraint_layout(); - let base_constraints = builder.base_constraints(); - let ext_constraints = builder.extension_constraints(); - - let alpha = inputs[layout.index(InputKey::Alpha).unwrap()]; - let inv_vanishing = inputs[layout.index(InputKey::InvVanishing).unwrap()]; - - let acc = eval_folded_constraints::( - &base_constraints, - &ext_constraints, - &constraint_layout, - alpha, - &inputs, - &layout, - &periodic_values, - ); - let folded = acc * inv_vanishing; - let quotient = eval_quotient(&layout, &inputs); - let expected = folded - quotient; - - let actual = eval_dag(&artifacts.dag.nodes, artifacts.dag.root, &inputs, &layout); - assert_eq!(actual, expected); -} - -#[test] -#[allow(clippy::print_stdout)] -fn processor_air_chiplet_rows() { - let air = ProcessorAir; - let config = AceConfig { - num_quotient_chunks: 8, - num_aux_inputs: 14, - layout: LayoutKind::Masm, - }; - - let circuit = build_ace_circuit_for_air::<_, Felt, QuadFelt>(&air, config).unwrap(); - let encoded = circuit.to_ace().unwrap(); - let read_rows = encoded.num_read_rows(); - let eval_rows = encoded.num_eval_rows(); - let total_rows = read_rows + eval_rows; - - println!( - "ACE chiplet rows (ProcessorAir): read={}, eval={}, total={}, inputs={}, constants={}, nodes={}", - read_rows, - eval_rows, - total_rows, - encoded.num_inputs(), - encoded.num_constants(), - encoded.num_nodes() - ); -} diff --git a/crates/ace-codegen/src/tests/synthetic_ood.rs b/crates/ace-codegen/src/tests/synthetic_ood.rs deleted file mode 100644 index 042621fc3c..0000000000 --- a/crates/ace-codegen/src/tests/synthetic_ood.rs +++ /dev/null @@ -1,89 +0,0 @@ -//! Synthetic OOD tests derived from the air-script ACE test strategy. -//! -//! The air-script tests correct a random quotient so the ACE circuit evaluates -//! to zero. Here we apply the same idea to the Miden VM quotient recomposition -//! (barycentric chunk kernel) and keep the tests independent of the prover. - -use miden_air::ProcessorAir; -use miden_core::{Felt, field::QuadFelt}; -use miden_crypto::field::Field; - -use super::common::{eval_quotient, fill_inputs, zps_for_chunk}; -use crate::{ - AceConfig, EXT_DEGREE, InputKey, LayoutKind, circuit::emit_circuit, - pipeline::build_ace_dag_for_air, -}; - -#[test] -fn synthetic_ood_adjusts_quotient_to_zero() { - let config = AceConfig { - num_quotient_chunks: 8, - num_aux_inputs: 14, - layout: LayoutKind::Masm, - }; - - let artifacts = - build_ace_dag_for_air::<_, Felt, QuadFelt>(&ProcessorAir, config).expect("ace dag"); - let circuit = emit_circuit(&artifacts.dag, artifacts.layout.clone()).expect("ace circuit"); - - let mut inputs = fill_inputs(&artifacts.layout); - let root = circuit.eval(&inputs).expect("circuit eval"); - - let zps_0 = zps_for_chunk(&artifacts.layout, &inputs, 0); - let delta = root * zps_0.inverse(); - - let idx = artifacts - .layout - .index(InputKey::QuotientChunkCoord { offset: 0, chunk: 0, coord: 0 }) - .unwrap(); - inputs[idx] += delta; - - let result = circuit.eval(&inputs).expect("circuit eval"); - assert!(result.is_zero(), "ACE circuit must evaluate to zero"); - - // Sanity check: recomposition is well-defined and stable. - let quotient = eval_quotient(&artifacts.layout, &inputs); - assert_eq!(quotient, eval_quotient(&artifacts.layout, &inputs)); -} - -#[test] -fn quotient_next_inputs_do_not_affect_eval() { - let config = AceConfig { - num_quotient_chunks: 8, - num_aux_inputs: 14, - layout: LayoutKind::Masm, - }; - - let artifacts = - build_ace_dag_for_air::<_, Felt, QuadFelt>(&ProcessorAir, config).expect("ace dag"); - let circuit = emit_circuit(&artifacts.dag, artifacts.layout.clone()).expect("ace circuit"); - - let mut inputs = fill_inputs(&artifacts.layout); - - let root = circuit.eval(&inputs).expect("circuit eval"); - let zps_0 = zps_for_chunk(&artifacts.layout, &inputs, 0); - let delta = root * zps_0.inverse(); - let idx = artifacts - .layout - .index(InputKey::QuotientChunkCoord { offset: 0, chunk: 0, coord: 0 }) - .unwrap(); - inputs[idx] += delta; - assert!( - circuit.eval(&inputs).expect("circuit eval").is_zero(), - "precondition: zero root" - ); - - // Mutate all quotient_next inputs; evaluation should remain zero. - for chunk in 0..artifacts.layout.counts.num_quotient_chunks { - for coord in 0..EXT_DEGREE { - let idx = artifacts - .layout - .index(InputKey::QuotientChunkCoord { offset: 1, chunk, coord }) - .unwrap(); - inputs[idx] += QuadFelt::from(Felt::new(123 + (chunk * 7 + coord) as u64)); - } - } - - let result = circuit.eval(&inputs).expect("circuit eval"); - assert!(result.is_zero(), "quotient_next should not affect ACE eval"); -} diff --git a/crates/ace-codegen/src/unit_tests.rs b/crates/ace-codegen/src/unit_tests.rs index 05a0faf415..d17babe829 100644 --- a/crates/ace-codegen/src/unit_tests.rs +++ b/crates/ace-codegen/src/unit_tests.rs @@ -4,9 +4,7 @@ use miden_core::{Felt, field::QuadFelt}; use miden_crypto::field::{Field, PrimeCharacteristicRing}; use crate::{ - AceCircuit, InputCounts, InputKey, InputLayout, - circuit::emit_circuit, - dag::{AceDag, DagBuilder}, + AceCircuit, InputCounts, InputKey, InputLayout, circuit::emit_circuit, dag::DagBuilder, }; /// Minimal layout with only public inputs populated. @@ -15,9 +13,9 @@ fn minimal_layout(num_public: usize) -> InputLayout { width: 0, aux_width: 0, num_public, + num_vlpi: 0, num_randomness: 2, num_periodic: 0, - num_aux_inputs: 14, num_quotient_chunks: 1, }; InputLayout::new(counts) @@ -45,7 +43,7 @@ fn ace_simple_circuit_matches_hand_eval() { let prod = builder.mul(sum, a); let root = builder.sub(prod, c); - let dag = AceDag { nodes: builder.into_nodes(), root }; + let dag = builder.build(root); let circuit: AceCircuit = emit_circuit(&dag, layout.clone()).expect("emit circuit"); @@ -83,7 +81,7 @@ fn ace_simple_circuit_with_shared_terms() { let rhs = builder.add(ac, bc); let root = builder.sub(lhs, rhs); - let dag = AceDag { nodes: builder.into_nodes(), root }; + let dag = builder.build(root); let circuit: AceCircuit = emit_circuit(&dag, layout.clone()).expect("emit circuit"); diff --git a/crates/assembly-syntax/Cargo.toml b/crates/assembly-syntax/Cargo.toml index e600f4f7db..f6ef2ab5dc 100644 --- a/crates/assembly-syntax/Cargo.toml +++ b/crates/assembly-syntax/Cargo.toml @@ -59,7 +59,7 @@ thiserror.workspace = true env_logger.workspace = true miden-test-serde-macros.workspace = true proptest.workspace = true -pretty_assertions = "1.4" +pretty_assertions = { workspace = true, features = ["std"] } serde_json = { workspace = true } [build-dependencies] diff --git a/crates/assembly-syntax/src/ast/attribute/meta.rs b/crates/assembly-syntax/src/ast/attribute/meta.rs index 31cd36b17f..4175f58c83 100644 --- a/crates/assembly-syntax/src/ast/attribute/meta.rs +++ b/crates/assembly-syntax/src/ast/attribute/meta.rs @@ -48,7 +48,9 @@ impl FromIterator for Meta { core::iter::once(expr) .chain(iter.map(|item| match item { MetaItem::Expr(expr) => expr, - MetaItem::KeyValue(..) => unsafe { core::hint::unreachable_unchecked() }, + MetaItem::KeyValue(..) => { + unreachable!("mixed MetaItem variants in iterator: expected Expr") + }, })) .collect(), ), @@ -56,7 +58,9 @@ impl FromIterator for Meta { core::iter::once((k, v)) .chain(iter.map(|item| match item { MetaItem::KeyValue(k, v) => (k, v), - MetaItem::Expr(_) => unsafe { core::hint::unreachable_unchecked() }, + MetaItem::Expr(_) => { + unreachable!("mixed MetaItem variants in iterator: expected KeyValue") + }, })) .collect(), ), diff --git a/crates/assembly-syntax/src/ast/module.rs b/crates/assembly-syntax/src/ast/module.rs index a7fd99004b..2d7b567e63 100644 --- a/crates/assembly-syntax/src/ast/module.rs +++ b/crates/assembly-syntax/src/ast/module.rs @@ -245,7 +245,7 @@ impl Module { } // We only define constants for C-like enums - if ty.is_c_like() { + if !ty.is_c_like() { self.items.push(Export::Type(ty.into())); return Ok(()); } diff --git a/crates/assembly-syntax/src/library/mod.rs b/crates/assembly-syntax/src/library/mod.rs index 776e1a52a2..414102365a 100644 --- a/crates/assembly-syntax/src/library/mod.rs +++ b/crates/assembly-syntax/src/library/mod.rs @@ -423,12 +423,9 @@ impl Library { self.write_into(&mut file); Ok(()) }) - .map_err(|p| { - match p.downcast::() { - // SAFETY: It is guaranteed safe to read Box - Ok(err) => unsafe { core::ptr::read(&*err) }, - Err(err) => std::panic::resume_unwind(err), - } + .map_err(|p| match p.downcast::() { + Ok(err) => *err, + Err(err) => std::panic::resume_unwind(err), })? } diff --git a/crates/assembly-syntax/src/sema/passes/verify_invoke.rs b/crates/assembly-syntax/src/sema/passes/verify_invoke.rs index b9a741f289..7d68bc0b37 100644 --- a/crates/assembly-syntax/src/sema/passes/verify_invoke.rs +++ b/crates/assembly-syntax/src/sema/passes/verify_invoke.rs @@ -168,6 +168,13 @@ impl VisitMut for VerifyInvokeTargets<'_> { } fn visit_mut_procref(&mut self, target: &mut InvocationTarget) -> ControlFlow<()> { self.visit_mut_invoke_target(target)?; + // We intentionally use `InvokeKind::Exec` here rather than `InvokeKind::ProcRef`. + // A `procref` instruction captures a procedure reference for *later* invocation, + // but we must pessimistically treat it as an actual invocation because we cannot + // know the specific call kind at this point. `Exec` is the most general invocation + // kind, and the linker relies on this signal to correctly track procedure + // dependencies. Using `ProcRef` would only indicate "named somewhere" and would + // not carry the full weight of "this procedure is invoked". self.invoked.insert(Invoke::new(InvokeKind::Exec, target.clone())); ControlFlow::Continue(()) } diff --git a/crates/assembly/src/assembler.rs b/crates/assembly/src/assembler.rs index 9bb4e7b5ee..01d01e9388 100644 --- a/crates/assembly/src/assembler.rs +++ b/crates/assembly/src/assembler.rs @@ -349,8 +349,7 @@ impl Assembler { TargetType::Kernel => { if !self.kernel().is_empty() { return Err(Report::msg(format!( - "duplicate kernels present in the dependency graph: '{}@{ - }' conflicts with another kernel we've already linked", + "duplicate kernels present in the dependency graph: '{}@{}' conflicts with another kernel we've already linked", &package.name, &package.version ))); } diff --git a/crates/assembly/src/linker/callgraph.rs b/crates/assembly/src/linker/callgraph.rs index 1bb6c32b4f..14232cd59c 100644 --- a/crates/assembly/src/linker/callgraph.rs +++ b/crates/assembly/src/linker/callgraph.rs @@ -176,6 +176,27 @@ impl CallGraph { graph } + /// Computes the set of nodes in this graph which can reach `root`. + fn reverse_reachable(&self, root: GlobalItemIndex) -> BTreeSet { + let mut worklist = VecDeque::from_iter([root]); + let mut visited = BTreeSet::default(); + + while let Some(gid) = worklist.pop_front() { + if !visited.insert(gid) { + continue; + } + + worklist.extend( + self.nodes + .iter() + .filter(|(_, out_edges)| out_edges.contains(&gid)) + .map(|(pred, _)| *pred), + ); + } + + visited + } + /// Constructs the topological ordering of nodes in the call graph, for which `caller` is an /// ancestor. /// @@ -188,7 +209,16 @@ impl CallGraph { let mut output = Vec::with_capacity(self.nodes.len()); // Build a subgraph of `self` containing only those nodes reachable from `caller` - let mut graph = self.subgraph(caller); + let caller_subgraph = self.subgraph(caller); + let mut graph = caller_subgraph.clone(); + + // Preserve the full set of nodes participating in cycles that close back into `caller` + // before we erase those back-edges to seed the traversal from `caller`. + let caller_cycle = caller_subgraph + .nodes + .values() + .any(|edges| edges.contains(&caller)) + .then(|| caller_subgraph.reverse_reachable(caller)); // Remove all predecessor edges to `caller` graph.nodes.iter_mut().for_each(|(_pred, out_edges)| { @@ -209,10 +239,7 @@ impl CallGraph { } } - let has_cycle = graph - .nodes - .iter() - .any(|(n, out_edges)| output.contains(n) && !out_edges.is_empty()); + let has_cycle = output.len() != graph.nodes.len() || caller_cycle.is_some(); if has_cycle { let mut in_cycle = BTreeSet::default(); for (n, edges) in graph.nodes.iter() { @@ -222,6 +249,9 @@ impl CallGraph { in_cycle.insert(*n); in_cycle.extend(edges.as_slice()); } + if let Some(caller_cycle) = caller_cycle { + in_cycle.extend(caller_cycle); + } Err(CycleError(in_cycle)) } else { Ok(output) @@ -326,6 +356,25 @@ mod tests { assert_eq!(err.0.into_iter().collect::>(), &[A2, A3, B2, B3]); } + #[test] + fn callgraph_toposort_caller_with_reachable_cycle() { + let graph = callgraph_cycle(); + + let err = graph + .toposort_caller(A1) + .expect_err("expected toposort_caller to fail when a reachable cycle exists"); + assert_eq!(err.0.into_iter().collect::>(), &[A2, A3, B2, B3]); + } + + #[test] + fn callgraph_toposort_caller_root_closing_cycle() { + let graph = callgraph_cycle(); + + let err = graph + .toposort_caller(A2) + .expect_err("expected toposort_caller to detect cycle closing back into root"); + assert_eq!(err.0.into_iter().collect::>(), &[A2, A3, B2, B3]); + } /// a::a1 -> a::a2 -> a::a3 /// | ^ /// v | diff --git a/crates/assembly/src/linker/errors.rs b/crates/assembly/src/linker/errors.rs index c87d87a75c..1de6982b9b 100644 --- a/crates/assembly/src/linker/errors.rs +++ b/crates/assembly/src/linker/errors.rs @@ -73,6 +73,15 @@ pub enum LinkerError { source_file: Option>, callee: Arc, }, + #[error("kernel procedure '{callee}' can only be invoked via syscall")] + #[diagnostic()] + KernelProcNotSyscall { + #[label("non-syscall reference to kernel procedure")] + span: SourceSpan, + #[source_code] + source_file: Option>, + callee: Arc, + }, #[error("invalid procedure reference: path refers to a non-procedure item")] #[diagnostic()] InvalidInvokeTarget { diff --git a/crates/assembly/src/linker/resolver/symbol_resolver.rs b/crates/assembly/src/linker/resolver/symbol_resolver.rs index 2f24a10e92..b89dbc1cf2 100644 --- a/crates/assembly/src/linker/resolver/symbol_resolver.rs +++ b/crates/assembly/src/linker/resolver/symbol_resolver.rs @@ -85,7 +85,7 @@ impl<'a> SymbolResolver<'a> { context: &SymbolResolutionContext, target: &InvocationTarget, ) -> Result { - match target { + let resolution = match target { InvocationTarget::MastRoot(mast_root) => { log::debug!(target: "name-resolver::invoke", "resolving {target}"); self.validate_syscall_digest(context, *mast_root)?; @@ -195,7 +195,38 @@ impl<'a> SymbolResolver<'a> { // will be checked resolution => Ok(resolution), }, + }?; + self.enforce_kernel_export_syscall_only(context, target, resolution) + } + + fn enforce_kernel_export_syscall_only( + &self, + context: &SymbolResolutionContext, + target: &InvocationTarget, + resolution: SymbolResolution, + ) -> Result { + if matches!(target, InvocationTarget::MastRoot(_)) { + return Ok(resolution); + } + if let SymbolResolution::Exact { gid, ref path } = resolution + && context.kind.is_some() + && !context.in_syscall() + { + // Root kernel attached via `with_kernel` is stored as ModuleKind::Library (MAST); + // `kernel_index` identifies it. AST kernel modules use ModuleKind::Kernel. + let target_is_kernel = self.graph.kernel_index.is_some_and(|ki| ki == gid.module) + || self.graph[gid.module].kind().is_kernel(); + let caller_is_kernel = self.graph.kernel_index.is_some_and(|ki| ki == context.module) + || self.graph[context.module].kind().is_kernel(); + if target_is_kernel && !caller_is_kernel { + return Err(LinkerError::KernelProcNotSyscall { + span: context.span, + source_file: self.graph.source_manager.get(context.span.source_id()).ok(), + callee: path.clone().into_inner(), + }); + } } + Ok(resolution) } fn validate_syscall_digest( diff --git a/crates/assembly/src/project.rs b/crates/assembly/src/project.rs index 0736771370..48af8e45ec 100644 --- a/crates/assembly/src/project.rs +++ b/crates/assembly/src/project.rs @@ -13,8 +13,8 @@ use miden_core::serde::{Deserializable, Serializable}; use miden_mast_package::{Package as MastPackage, Section, SectionId, TargetType}; use miden_package_registry::{PackageId, PackageStore, Version as PackageVersion}; use miden_project::{ - Linkage, Package as ProjectPackage, Profile, ProjectDependencyNodeProvenance, ProjectSource, - ProjectSourceOrigin, Target, + Linkage, Package as ProjectPackage, PreassembledDependencyMetadata, Profile, + ProjectDependencyNodeProvenance, ProjectSource, ProjectSourceOrigin, Target, }; use crate::{Assembler, assembler::debuginfo::DebugInfoSections, ast::Module}; @@ -411,8 +411,19 @@ where package, } }, - ProjectDependencyNodeProvenance::Preassembled { path, selected } => { - let package = load_selected_preassembled_package(path, package_id, selected)?; + ProjectDependencyNodeProvenance::Preassembled { + path, + selected, + kind, + requirements, + } => { + let package = load_selected_preassembled_package( + path, + package_id, + selected, + *kind, + requirements, + )?; ResolvedPackage { linked_kernel_package: self.resolve_linked_kernel_package(package.clone())?, package, @@ -694,6 +705,8 @@ fn load_selected_preassembled_package( path: &FsPath, expected_name: &PackageId, selected: &PackageVersion, + expected_kind: TargetType, + expected_requirements: &BTreeMap, ) -> Result, Report> { let package = load_package_from_path(path)?; if &package.name != expected_name { @@ -716,6 +729,26 @@ fn load_selected_preassembled_package( ))); } + if package.kind != expected_kind { + return Err(Report::msg(format!( + "preassembled dependency '{}@{}' at '{}' no longer matches the dependency graph target kind '{}'", + expected_name, + actual, + path.display(), + expected_kind + ))); + } + + let actual_requirements = package_requirements(&package); + if &actual_requirements != expected_requirements { + return Err(Report::msg(format!( + "preassembled dependency '{}@{}' at '{}' no longer matches the dependency graph dependency requirements", + expected_name, + actual, + path.display() + ))); + } + Ok(package) } @@ -727,3 +760,21 @@ fn load_package_from_path(path: &FsPath) -> Result, Report> { })?; Ok(Arc::new(package)) } + +fn package_requirements( + package: &MastPackage, +) -> BTreeMap { + package + .manifest + .dependencies() + .map(|dependency| { + ( + dependency.name.clone(), + PreassembledDependencyMetadata { + version: PackageVersion::new(dependency.version.clone(), dependency.digest), + kind: dependency.kind, + }, + ) + }) + .collect() +} diff --git a/crates/assembly/src/project/tests.rs b/crates/assembly/src/project/tests.rs index 454faa5c1f..5d9626f3e0 100644 --- a/crates/assembly/src/project/tests.rs +++ b/crates/assembly/src/project/tests.rs @@ -813,7 +813,9 @@ end let error = context .assemble_library_package(&root_manifest, None) .expect_err("runtime dependency digest conflicts should fail"); - assert!(error.to_string().contains("conflicting runtime dependency 'runtime'")); + let error = error.to_string(); + assert!(error.contains("dependency resolution failed")); + assert!(error.contains("there is no version of runtime")); } #[test] @@ -1942,7 +1944,7 @@ fn preassembled_libraries_prefer_store_kernel_over_embedded_copy() { } #[test] -fn preassembled_libraries_fall_back_to_embedded_kernel_when_store_is_missing() { +fn preassembled_libraries_require_registered_kernel_when_store_is_missing() { let tempdir = TempDir::new().unwrap(); let (_, kernel_manifest) = write_transitive_kernel_program_project(tempdir.path()); let mid_manifest = tempdir.path().join("mid").join("miden-project.toml"); @@ -1952,11 +1954,6 @@ fn preassembled_libraries_fall_back_to_embedded_kernel_when_store_is_missing() { let kernel_package = build_context .assemble_library_package(&kernel_manifest, None) .expect("kernel package build should succeed"); - let expected_kernel = kernel_package - .try_into_kernel_library() - .expect("kernel package should round-trip as a kernel library") - .kernel() - .clone(); let mut mid_package = MastPackage::read_from_bytes( &build_context .assemble_library_package(&mid_manifest, None) @@ -1972,23 +1969,11 @@ fn preassembled_libraries_fall_back_to_embedded_kernel_when_store_is_missing() { let root_manifest = write_preassembled_kernel_executable_project(tempdir.path(), &mid_package_path); let mut context = TestContext::new(); - let package = context + let error = context .assemble_executable_package(&root_manifest, Some("main"), None) - .expect("executable package build should fall back to the embedded kernel"); - let embedded_kernel_package = package - .sections - .iter() - .find(|section| section.id == SectionId::KERNEL) - .map(|section| MastPackage::read_from_bytes(section.data.as_ref()).unwrap()) - .expect("executable package should embed the fallback kernel package"); - assert_eq!(embedded_kernel_package.version, kernel_package.version); - assert_eq!(embedded_kernel_package.digest(), kernel_package.digest()); - - let round_tripped_program = MastPackage::read_from_bytes(&package.to_bytes()) - .expect("serialized executable package should round-trip") - .try_into_program() - .expect("program reconstruction should use the embedded fallback kernel"); - assert_eq!(round_tripped_program.kernel(), &expected_kernel); + .expect_err("executable package build should reject unresolved kernel dependencies"); + assert!(error.to_string().contains("dependency resolution failed")); + assert!(error.to_string().contains("kernelpkg")); } #[test] @@ -2057,7 +2042,7 @@ fn preassembled_libraries_fall_back_to_embedded_kernel_when_store_artifact_is_un } #[test] -fn preassembled_libraries_without_store_or_embedded_kernel_leave_runtime_kernel_to_caller() { +fn preassembled_libraries_without_store_or_embedded_kernel_cannot_reconstruct_program() { let tempdir = TempDir::new().unwrap(); write_transitive_kernel_program_project(tempdir.path()); let mid_manifest = tempdir.path().join("mid").join("miden-project.toml"); @@ -2073,23 +2058,11 @@ fn preassembled_libraries_without_store_or_embedded_kernel_leave_runtime_kernel_ let root_manifest = write_preassembled_kernel_executable_project(tempdir.path(), &mid_package_path); let mut context = TestContext::new(); - let package = context + let error = context .assemble_executable_package(&root_manifest, Some("main"), None) - .expect("executable package build should succeed without an available kernel artifact"); - - assert!( - package - .manifest - .dependencies() - .any(|dependency| dependency.kind == TargetType::Kernel) - ); - assert!(!package.sections.iter().any(|section| section.id == SectionId::KERNEL)); - - let round_tripped_program = MastPackage::read_from_bytes(&package.to_bytes()) - .expect("serialized executable package should round-trip") - .try_into_program() - .expect("packages without a recoverable kernel should still convert to a program"); - assert!(round_tripped_program.kernel().is_empty()); + .expect_err("packages with unresolved kernel runtime dependencies must be rejected"); + assert!(error.to_string().contains("dependency resolution failed")); + assert!(error.to_string().contains("kernelpkg")); } #[test] @@ -2129,7 +2102,7 @@ fn embedded_kernel_package_must_match_runtime_dependency() { } #[test] -fn executable_packages_without_embedded_kernel_section_fall_back_to_empty_kernel() { +fn executable_packages_without_embedded_kernel_section_are_rejected() { let tempdir = TempDir::new().unwrap(); let manifest_path = write_kernel_program_project(tempdir.path()); @@ -2141,11 +2114,10 @@ fn executable_packages_without_embedded_kernel_section_fall_back_to_empty_kernel .expect("serialized executable package should round-trip"); round_tripped_package.sections.retain(|section| section.id != SectionId::KERNEL); - let round_tripped_program = round_tripped_package + let error = round_tripped_package .try_into_program() - .expect("packages without embedded kernels should still convert to a program"); - - assert!(round_tripped_program.kernel().is_empty()); + .expect_err("packages without embedded kernels should be rejected"); + assert!(error.to_string().contains("does not embed the kernel package required")); } #[test] @@ -2191,6 +2163,230 @@ end assert!(error.to_string().contains("no longer matches the dependency graph selection")); } +#[test] +fn preassembled_dependency_must_match_graph_selected_runtime_dependencies() { + let tempdir = TempDir::new().unwrap(); + let runtime_v1 = Arc::::from(MastPackage::generate( + "runtime".into(), + "1.0.0".parse().unwrap(), + TargetType::Library, + [], + )); + let runtime_v2 = Arc::::from(MastPackage::generate( + "runtime".into(), + "1.0.1".parse().unwrap(), + TargetType::Library, + [], + )); + let dep_package_path = tempdir.path().join("dep.masp"); + let dep_v1 = MastPackage::from_library( + "dep".into(), + "1.0.0".parse().unwrap(), + TargetType::Library, + runtime_v1.mast.clone(), + [miden_mast_package::Dependency { + name: PackageId::from("runtime"), + version: runtime_v1.version.clone(), + kind: TargetType::Library, + digest: runtime_v1.digest(), + }], + ); + dep_v1.write_to_file(&dep_package_path).unwrap(); + + let root_dir = tempdir.path().join("root"); + let root_manifest = root_dir.join("miden-project.toml"); + write_file( + &root_manifest, + r#"[package] +name = "root" +version = "1.0.0" + +[lib] +path = "lib.masm" + +[dependencies] +dep = { path = "../dep.masp" } +"#, + ); + write_file( + &root_dir.join("lib.masm"), + r#"pub proc entry + exec.::dep::foo +end +"#, + ); + + let mut context = TestContext::new(); + context.registry_mut().add_package(runtime_v1.clone()); + let mut project_assembler = context.project_assembler_for_path(&root_manifest).unwrap(); + let dep_v2 = MastPackage::from_library( + "dep".into(), + "1.0.0".parse().unwrap(), + TargetType::Library, + runtime_v1.mast.clone(), + [miden_mast_package::Dependency { + name: PackageId::from("runtime"), + version: runtime_v2.version.clone(), + kind: TargetType::Library, + digest: runtime_v2.digest(), + }], + ); + dep_v2.write_to_file(&dep_package_path).unwrap(); + + let error = project_assembler.assemble(ProjectTargetSelector::Library, "dev").expect_err( + "changing preassembled dependency metadata after graph construction should fail", + ); + assert!( + error + .to_string() + .contains("no longer matches the dependency graph dependency requirements") + ); +} + +#[test] +fn preassembled_dependency_must_match_graph_selected_dependency_kinds() { + let tempdir = TempDir::new().unwrap(); + let runtime = Arc::::from(MastPackage::generate( + "runtime".into(), + "1.0.0".parse().unwrap(), + TargetType::Library, + [], + )); + let dep_package_path = tempdir.path().join("dep.masp"); + let dep_v1 = MastPackage::from_library( + "dep".into(), + "1.0.0".parse().unwrap(), + TargetType::Library, + runtime.mast.clone(), + [miden_mast_package::Dependency { + name: PackageId::from("runtime"), + version: runtime.version.clone(), + kind: TargetType::Library, + digest: runtime.digest(), + }], + ); + dep_v1.write_to_file(&dep_package_path).unwrap(); + + let root_dir = tempdir.path().join("root"); + let root_manifest = root_dir.join("miden-project.toml"); + write_file( + &root_manifest, + r#"[package] +name = "root" +version = "1.0.0" + +[lib] +path = "lib.masm" + +[dependencies] +dep = { path = "../dep.masp" } +"#, + ); + write_file( + &root_dir.join("lib.masm"), + r#"pub proc entry + exec.::dep::foo +end +"#, + ); + + let mut context = TestContext::new(); + context.registry_mut().add_package(runtime.clone()); + let mut project_assembler = context.project_assembler_for_path(&root_manifest).unwrap(); + let dep_v2 = MastPackage::from_library( + "dep".into(), + "1.0.0".parse().unwrap(), + TargetType::Library, + runtime.mast.clone(), + [miden_mast_package::Dependency { + name: PackageId::from("runtime"), + version: runtime.version.clone(), + kind: TargetType::Kernel, + digest: runtime.digest(), + }], + ); + dep_v2.write_to_file(&dep_package_path).unwrap(); + + let error = project_assembler + .assemble(ProjectTargetSelector::Library, "dev") + .expect_err("changing preassembled dependency kinds after graph construction should fail"); + assert!( + error + .to_string() + .contains("no longer matches the dependency graph dependency requirements") + ); +} + +#[test] +fn preassembled_package_must_match_graph_selected_target_kind() { + let tempdir = TempDir::new().unwrap(); + let runtime = Arc::::from(MastPackage::generate( + "runtime".into(), + "1.0.0".parse().unwrap(), + TargetType::Library, + [], + )); + let dep_package_path = tempdir.path().join("dep.masp"); + let dep_v1 = MastPackage::from_library( + "dep".into(), + "1.0.0".parse().unwrap(), + TargetType::Library, + runtime.mast.clone(), + [miden_mast_package::Dependency { + name: PackageId::from("runtime"), + version: runtime.version.clone(), + kind: TargetType::Library, + digest: runtime.digest(), + }], + ); + dep_v1.write_to_file(&dep_package_path).unwrap(); + + let root_dir = tempdir.path().join("root"); + let root_manifest = root_dir.join("miden-project.toml"); + write_file( + &root_manifest, + r#"[package] +name = "root" +version = "1.0.0" + +[lib] +path = "lib.masm" + +[dependencies] +dep = { path = "../dep.masp" } +"#, + ); + write_file( + &root_dir.join("lib.masm"), + r#"pub proc entry + exec.::dep::foo +end +"#, + ); + + let mut context = TestContext::new(); + context.registry_mut().add_package(runtime.clone()); + let mut project_assembler = context.project_assembler_for_path(&root_manifest).unwrap(); + let dep_v2 = MastPackage::from_library( + "dep".into(), + "1.0.0".parse().unwrap(), + TargetType::Kernel, + runtime.mast.clone(), + [miden_mast_package::Dependency { + name: PackageId::from("runtime"), + version: runtime.version.clone(), + kind: TargetType::Library, + digest: runtime.digest(), + }], + ); + dep_v2.write_to_file(&dep_package_path).unwrap(); + + let error = project_assembler + .assemble(ProjectTargetSelector::Library, "dev") + .expect_err("changing preassembled package kind after graph construction should fail"); + assert!(error.to_string().contains("no longer matches the dependency graph target kind")); +} + fn write_kernel_program_project(root: &FsPath) -> PathBuf { let manifest_path = root.join("miden-project.toml"); write_file( diff --git a/crates/assembly/src/tests.rs b/crates/assembly/src/tests.rs index 2c443bf035..17f85891e6 100644 --- a/crates/assembly/src/tests.rs +++ b/crates/assembly/src/tests.rs @@ -5671,6 +5671,45 @@ end assert_diagnostic!(err, "invalid syscall"); } +#[test] +fn regression_kernel_exports_are_syscall_only_for_all_non_syscall_entrypoints() { + let context = TestContext::default(); + let source_manager = context.source_manager(); + + let kernel_src = r#" +pub proc k1 + push.1 +end +"#; + + let kernel = Assembler::new(source_manager.clone()) + .assemble_kernel(kernel_src) + .expect("kernel assembly must succeed"); + + let cases = vec![ + ( + "exec", + "proc user\n exec.::$kernel::k1\nend\n\nbegin\n call.user\nend\n".to_string(), + ), + ( + "call", + "proc user\n call.::$kernel::k1\nend\n\nbegin\n call.user\nend\n".to_string(), + ), + ( + "procref", + "proc user\n procref.::$kernel::k1\n dropw\nend\n\nbegin\n call.user\nend\n" + .to_string(), + ), + ]; + + for (kind, program_src) in cases { + let err = Assembler::with_kernel(source_manager.clone(), kernel.clone()) + .assemble_program(program_src) + .expect_err(&format!("kernel exports should be syscall-only, but {kind} succeeded")); + assert_diagnostic!(err, "syscall"); + } +} + #[test] fn test_linking_imported_symbols_with_duplicate_prefix_components() -> TestResult { let context = TestContext::default(); diff --git a/crates/assembly/tests/fixtures/protocol/kernel/bin/main-alt.masm b/crates/assembly/tests/fixtures/protocol/kernel/bin/main-alt.masm index 411644105d..d4e0538b91 100644 --- a/crates/assembly/tests/fixtures/protocol/kernel/bin/main-alt.masm +++ b/crates/assembly/tests/fixtures/protocol/kernel/bin/main-alt.masm @@ -8,9 +8,6 @@ proc invoke_user_script end begin - # At program start, initialize the kernel environment - exec.$kernel::init - # Execute the user script whose entrypoint digest is on top of the stack exec.invoke_user_script end diff --git a/crates/assembly/tests/fixtures/protocol/kernel/bin/main.masm b/crates/assembly/tests/fixtures/protocol/kernel/bin/main.masm index 411644105d..d4e0538b91 100644 --- a/crates/assembly/tests/fixtures/protocol/kernel/bin/main.masm +++ b/crates/assembly/tests/fixtures/protocol/kernel/bin/main.masm @@ -8,9 +8,6 @@ proc invoke_user_script end begin - # At program start, initialize the kernel environment - exec.$kernel::init - # Execute the user script whose entrypoint digest is on top of the stack exec.invoke_user_script end diff --git a/crates/assembly/tests/fixtures/protocol/kernel/miden-project.toml b/crates/assembly/tests/fixtures/protocol/kernel/miden-project.toml index e87e320759..dd3513a1e1 100644 --- a/crates/assembly/tests/fixtures/protocol/kernel/miden-project.toml +++ b/crates/assembly/tests/fixtures/protocol/kernel/miden-project.toml @@ -15,5 +15,4 @@ name = "entry-alt" path = "bin/main-alt.masm" [dependencies] -miden-core.workspace = true miden-utils.workspace = true diff --git a/crates/assembly/tests/fixtures/protocol/miden-project.toml b/crates/assembly/tests/fixtures/protocol/miden-project.toml index dba8b90c5b..d27e7d6f08 100644 --- a/crates/assembly/tests/fixtures/protocol/miden-project.toml +++ b/crates/assembly/tests/fixtures/protocol/miden-project.toml @@ -6,7 +6,6 @@ members = [ ] [workspace.dependencies] -miden-core = { path = "../../../../../lib/core/asm" } miden-utils = { path = "utils", linkage = "static" } miden-tx = { path = "kernel" } diff --git a/crates/assembly/tests/fixtures/protocol/userspace/miden-project.toml b/crates/assembly/tests/fixtures/protocol/userspace/miden-project.toml index a294dab6db..0e25d34893 100644 --- a/crates/assembly/tests/fixtures/protocol/userspace/miden-project.toml +++ b/crates/assembly/tests/fixtures/protocol/userspace/miden-project.toml @@ -7,6 +7,5 @@ namespace = "miden::protocol" path = "mod.masm" [dependencies] -miden-core.workspace = true miden-utils = { workspace = true, linkage = "dynamic" } miden-tx.workspace = true diff --git a/crates/debug-types/Cargo.toml b/crates/debug-types/Cargo.toml index 41edc7d24a..3a399faedd 100644 --- a/crates/debug-types/Cargo.toml +++ b/crates/debug-types/Cargo.toml @@ -35,7 +35,7 @@ miden-utils-indexing.workspace = true # External dependencies memchr = { version = "2.7", default-features = false } -miette = { package = "miden-miette", version = "8.0", default-features = false, features = ["fancy-no-syscall", "derive"] } +miette = { workspace = true, features = ["fancy-no-syscall", "derive"] } paste.workspace = true serde = { workspace = true, optional = true } serde_spanned = { version = "1.0", optional = true, default-features = false } diff --git a/crates/lib/core/Cargo.toml b/crates/lib/core/Cargo.toml index d0f605820f..f048cc2e3d 100644 --- a/crates/lib/core/Cargo.toml +++ b/crates/lib/core/Cargo.toml @@ -28,6 +28,7 @@ path = "tests/main.rs" [features] default = ["std"] std = ["miden-assembly/std", "miden-utils-sync/std"] +constraints-tools = ["std", "dep:miden-air", "dep:miden-ace-codegen"] [dependencies] # Miden dependencies @@ -36,24 +37,28 @@ miden-core.workspace = true miden-crypto.workspace = true miden-processor.workspace = true miden-utils-sync.workspace = true +miden-air = { workspace = true, optional = true } +miden-ace-codegen = { workspace = true, optional = true } # External dependencies thiserror.workspace = true [dev-dependencies] criterion.workspace = true -miden-ace-codegen = { path = "../../ace-codegen" } +miden-ace-codegen.workspace = true miden-air.workspace = true miden-processor = { workspace = true, features = ["testing"] } miden-prover.workspace = true miden-utils-testing.workspace = true miden-verifier.workspace = true num = { version = "0.4" } -num-bigint = { version = "0.4" } -pretty_assertions = { version = "1.4" } +num-bigint = { workspace = true } +pretty_assertions = { workspace = true, features = ["std"] } rand = { version = "0.9", default-features = false } -rand_chacha = { version = "0.9", default-features = false } -rstest = { version = "0.26" } +rand_chacha = { workspace = true } +rstest = { workspace = true } +bincode.workspace = true +serde.workspace = true serde_json.workspace = true [build-dependencies] @@ -61,3 +66,8 @@ env_logger.workspace = true fs-err = { version = "3.1" } miden-assembly = { workspace = true, features = ["std"] } miden-package-registry = { workspace = true, features = ["resolver"] } + +[[bin]] +name = "regenerate-constraints" +path = "src/bin/regenerate-constraints.rs" +required-features = ["constraints-tools"] diff --git a/crates/lib/core/asm/collections/sorted_array.masm b/crates/lib/core/asm/collections/sorted_array.masm index b65ab392e0..f1c2a66867 100644 --- a/crates/lib/core/asm/collections/sorted_array.masm +++ b/crates/lib/core/asm/collections/sorted_array.masm @@ -9,14 +9,17 @@ const LOWERBOUND_KEY_VALUE_EVENT = event("miden::core::collections::sorted_array #! Finds a value in a sorted array of words. #! -#! This function will crash if the following conditions aren't met: -#! - words must be sorted in non-decreasing order, -#! - start_ptr, end_ptr are word-aligned -#! - `start_ptr <= end_ptr` +#! **The input array must be sorted in non-decreasing lexicographic order.** The host event handler validates this and will return an error if the array is not sorted. #! #! Input: [VALUE, start_ptr, end_ptr] #! Output: [is_value_found, value_ptr, start_ptr, end_ptr] #! +#! # Panics +#! +#! Panics if: +#! - start_ptr, end_ptr are not word-aligned +#! - `start_ptr > end_ptr` +#! #! Cycles: #! Value exists: 46 cycles #! Value doesn't exist and the array is empty: 25 cycles @@ -146,20 +149,18 @@ end #! Finds a key in a sorted array of (key, value) word tuples. #! +#! **The keys in the array must be sorted in non-decreasing lexicographic order.** The host event handler validates this and will return an error if the keys are not sorted. +#! #! Inputs: [KEY, start_ptr, end_ptr] #! Outputs: [is_key_found, key_ptr, start_ptr, end_ptr] #! #! # Panics #! #! Panics if: -#! - keys are not sorted in non-decreasing order, #! - start_ptr is not word-aligned #! - end_ptr is not double-word-aligned with the start_ptr: #! - `(end_ptr - start_ptr)` must be divisible by 8 #! - `start_ptr > end_ptr` -#! -#! Inputs: [KEY, start_ptr, end_ptr] -#! Output: [is_key_found, key_ptr, start_ptr, end_ptr] pub proc find_key_value push.1 # => [use_full_key = 1, KEY, start_ptr, end_ptr] @@ -176,13 +177,14 @@ end #! Half-key means that, out of the keys in the array, only half of the key - the most significant #! element (prefix) and the second most significant element (suffix) - need to match. #! +#! **The half-keys in the array must be sorted in non-decreasing lexicographic order.** The host event handler validates this and will return an error if the half-keys are not sorted. +#! #! Inputs: [key_suffix, key_prefix, start_ptr, end_ptr] #! Output: [is_key_found, key_ptr, start_ptr, end_ptr] #! #! # Panics #! #! Panics if: -#! - keys are not sorted in non-decreasing order, #! - start_ptr is not word-aligned #! - end_ptr is not double-word-aligned with the start_ptr: #! - `(end_ptr - start_ptr)` must be divisible by 8 @@ -211,13 +213,14 @@ end #! upon loading the key for comparison, its two least significant elements are zeroized. #! This effectively means that only a match on the two most significant elements is required. #! +#! **The keys in the array must be sorted in non-decreasing lexicographic order.** The host event handler validates this and will return an error if the keys are not sorted. +#! #! Input: [KEY, start_ptr, end_ptr, use_full_key] #! Output: [is_key_found, key_ptr, start_ptr, end_ptr] #! #! # Panics #! #! Panics if: -#! - keys are not sorted in non-decreasing order, #! - start_ptr is not word-aligned #! - end_ptr is not double-word-aligned with the start_ptr: #! - `(end_ptr - start_ptr)` must be divisible by 8 diff --git a/crates/lib/core/asm/crypto/aead.masm b/crates/lib/core/asm/crypto/aead.masm index a2ea2fb5b9..496f9e6176 100644 --- a/crates/lib/core/asm/crypto/aead.masm +++ b/crates/lib/core/asm/crypto/aead.masm @@ -113,8 +113,11 @@ end #! - Plaintext must be at word-aligned addresses (addr % 4 == 0) #! - Each block is 8 field elements (2 words) #! - Blocks must be stored contiguously in memory -#! - src_ptr and dst_ptr MUST be different (in-place encryption not supported) -#! This is because crypto_stream reads and writes in the same clock cycle +#! +#! # Panics +#! +#! Panics if the source and destination memory ranges overlap +#! (in-place encryption not supported). #! #! Padding: #! - Padding is AUTOMATIC - caller should NOT pad the plaintext @@ -134,6 +137,15 @@ pub proc encrypt # will cause the procedure to encrypt the wrong amount of data, but this is safe - # the resulting tag will authenticate whatever was actually encrypted. + # Assert source and destination memory ranges do not overlap. + # Uses (num_blocks+1)*8 as conservative range size for both sides. + dup.10 add.1 mul.8 + dup dup.10 add + dup.11 swap u32gte + swap dup.11 add + dup.10 swap u32gte + or assert.err="source and destination ranges must not overlap" + exec.init_state # => [rate(8), capacity(4), src_ptr, dst_ptr, num_blocks, ...] @@ -262,7 +274,11 @@ end #! #! Memory Requirements: #! - Same as encrypt: word-aligned addresses, contiguous blocks -#! - src_ptr and dst_ptr MUST be different (in-place operation not supported) +#! +#! # Panics +#! +#! Panics if the source and destination memory ranges overlap +#! (in-place decryption not supported). #! #! Security: #! - Tag verification happens in the MASM procedure via re-encryption @@ -299,6 +315,14 @@ pub proc decrypt # values are caught by tag verification - if num_blocks doesn't match what was # used during encryption, the tag comparison will fail and execution will halt. + # Assert source and destination memory ranges do not overlap. + dup.10 add.1 mul.8 + dup dup.10 add + dup.11 swap u32gte + swap dup.11 add + dup.10 swap u32gte + or assert.err="source and destination ranges must not overlap" + # Compute the pointer to the tag for later use # tag is at src_ptr + (num_blocks + 1) * 8 because of automatic padding block dup.10 add.1 mul.8 diff --git a/crates/lib/core/asm/crypto/dsa/falcon512_poseidon2.masm b/crates/lib/core/asm/crypto/dsa/falcon512_poseidon2.masm index 4368cb6ac2..2fcefdc9ea 100644 --- a/crates/lib/core/asm/crypto/dsa/falcon512_poseidon2.masm +++ b/crates/lib/core/asm/crypto/dsa/falcon512_poseidon2.masm @@ -30,7 +30,7 @@ const FALCON_DIV_EVENT = event("miden::core::crypto::dsa::falcon512_poseidon2::f #! Note that it is the responsibility of the calling procedure to ensure that `a_hi` and `a_lo` are #! within the appropriate range i.e., they are u32-s. #! -#! Cycles: 27 +#! Cycles: 29 pub proc mod_12289 emit.FALCON_DIV_EVENT # the advice stack contains now [qhi, qlo, r, ...] where q = qhi * 2^32 + qlo is quotient @@ -55,7 +55,9 @@ pub proc mod_12289 # => [res_hi, res_lo, a_hi, a_lo, ...] adv_push.1 - dup + # Advice values are untrusted. U32SUB/U32ADD only constrain their output limbs in the AIR, + # so we must validate the remainder before feeding it into u32 arithmetic. + dup u32assert2 push.M u32overflowing_sub # => [borrow, diff, r, res_hi, res_lo, a_hi, a_lo, ...] diff --git a/crates/lib/core/asm/math/u64.masm b/crates/lib/core/asm/math/u64.masm index 27a014b005..cac5e832a4 100644 --- a/crates/lib/core/asm/math/u64.masm +++ b/crates/lib/core/asm/math/u64.masm @@ -692,6 +692,8 @@ pub proc shr(n: u32, a: u64) -> u64 add # [c_lo, quot1, !borrow, ...] # c_lo = rem1 * multiplier + quot2 + # This add is safe: when !borrow=1, multiplier = 2^32 / pow_lo and rem1 < pow_lo, so + # rem1 * multiplier <= 2^32 - multiplier and adding quot2 < multiplier stays below 2^32. # --- STEP 9: Conditional swap to get final result --- dup.2 @@ -826,7 +828,7 @@ end #! The rotation amount n should be in the range [0, 64), otherwise it will result in an error. #! Stack transition looks as follows: #! [n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where c = a >>> n (rotate right). -#! This takes 44 cycles. +#! This takes 48 cycles. pub proc rotr(n: u32, a: u64) -> u64 # ========================================================================== # RIGHT ROTATION: Computes a >>> n (rotate right by n bits) @@ -834,107 +836,125 @@ pub proc rotr(n: u32, a: u64) -> u64 # Output: [c_lo, c_hi, ...] where c = a >>> n # # Strategy: Rotate right by n = left rotate by (64 - n) - # For n in [0,64), we compute left shift by (32 - (n&31)) - # and conditionally swap limbs based on n < 32 + # For n in [0,64), we compute left shift by ((32 - (n&31)) & 31) + # and conditionally swap limbs when the rotation crosses the 32-bit boundary # ========================================================================== # Convert LE to internal BE format: [n, a_lo, a_hi] -> [n, a_hi, a_lo] movup.2 # [a_hi, n, a_lo] swap # [n, a_hi, a_lo] - # --- STEP 1: Compute swap_flag = (n < 32) --- + # --- STEP 1: Compute is_upper_half = (n > 31) --- push.31 # [31, b, a_hi, a_lo, ...] dup.1 # [b, 31, b, a_hi, a_lo, ...] - u32lt - # [b<32, b, a_hi, a_lo, ...] - # flag = 1 if b < 32, else 0 + u32overflowing_sub + # [borrow, diff, b, a_hi, a_lo, ...] + # borrow = 1 if b > 31, else 0 + + swap + # [diff, borrow, b, a_hi, a_lo, ...] + + drop + # [borrow, b, a_hi, a_lo, ...] + # borrow indicates whether n is in the upper half [32, 63] movdn.3 - # [b, a_hi, a_lo, flag, ...] + # [b, a_hi, a_lo, borrow, ...] - # --- STEP 2: Compute complement shift amount = 32 - (b & 31) --- + # --- STEP 2: Compute complement shift amount = (32 - (b & 31)) & 31 --- push.31 - # [31, b, a_hi, a_lo, flag, ...] + # [31, b, a_hi, a_lo, borrow, ...] u32and - # [b&31, a_hi, a_lo, flag, ...] + # [b&31, a_hi, a_lo, borrow, ...] # shift_amt = b mod 32 + dup + # [shift_amt, shift_amt, a_hi, a_lo, borrow, ...] + neq.0 + not + # [shift_amt == 0, shift_amt, a_hi, a_lo, borrow, ...] + + movdn.4 + # [shift_amt, a_hi, a_lo, borrow, shift_amt == 0, ...] + push.32 - # [32, b&31, a_hi, a_lo, flag, ...] + # [32, shift_amt, a_hi, a_lo, borrow, shift_amt == 0, ...] swap - # [b&31, 32, a_hi, a_lo, flag, ...] + # [shift_amt, 32, a_hi, a_lo, borrow, shift_amt == 0, ...] u32wrapping_sub - # [32-(b&31), a_hi, a_lo, flag, ...] - # complement_shift = 32 - (b mod 32) + # [32-shift_amt, a_hi, a_lo, borrow, shift_amt == 0, ...] + + push.31 + # [31, 32-shift_amt, a_hi, a_lo, borrow, shift_amt == 0, ...] + u32and + # [(32-shift_amt)&31, a_hi, a_lo, borrow, shift_amt == 0, ...] + # complement_shift = (32 - (b mod 32)) mod 32 pow2 - # [2^complement_shift, a_hi, a_lo, flag, ...] + # [2^complement_shift, a_hi, a_lo, borrow, shift_amt == 0, ...] dup - # [2^complement_shift, 2^complement_shift, a_hi, a_lo, flag, ...] + # [2^complement_shift, 2^complement_shift, a_hi, a_lo, borrow, shift_amt == 0, ...] movup.3 - # [a_lo, 2^complement_shift, 2^complement_shift, a_hi, flag, ...] + # [a_lo, 2^complement_shift, 2^complement_shift, a_hi, borrow, shift_amt == 0, ...] # --- STEP 3: Left shift low limb by complement amount --- - mul - # [a_lo * 2^complement_shift, 2^complement_shift, a_hi, flag, ...] - # This is a full field multiplication - - u32split swap - # [hi1, lo1, 2^complement_shift, a_hi, flag, ...] + u32widening_mul + # [lo1, hi1, 2^complement_shift, a_hi, borrow, shift_amt == 0, ...] + # lo1 = (a_lo * 2^complement_shift) mod 2^32 # hi1 = overflow bits (shift into high) - # lo1 = remaining bits + + swap + # [hi1, lo1, 2^complement_shift, a_hi, borrow, shift_amt == 0, ...] # --- STEP 4: Left shift high limb by complement amount and add overflow --- movup.3 - # [a_hi, hi1, lo1, 2^complement_shift, flag, ...] + # [a_hi, hi1, lo1, 2^complement_shift, borrow, shift_amt == 0, ...] movup.3 - # [2^complement_shift, a_hi, hi1, lo1, flag, ...] - - mul - # [a_hi * 2^complement_shift, hi1, lo1, flag, ...] - - add - # [(a_hi * 2^complement_shift) + hi1, lo1, flag, ...] - # This combines the shifted high limb with overflow from low + # [2^complement_shift, a_hi, hi1, lo1, borrow, shift_amt == 0, ...] - u32split swap - # [hi2, lo2, lo1, flag, ...] + u32widening_madd + # [lo2, hi2, lo1, borrow, shift_amt == 0, ...] + # lo2 = (a_hi * 2^complement_shift + hi1) mod 2^32 # hi2 = overflow bits (wrap around to low) - # lo2 = new high limb value + + swap + # [hi2, lo2, lo1, borrow, shift_amt == 0, ...] # --- STEP 5: Carry the overflow to the low bits --- movup.2 - # [lo1, hi2, lo2, flag, ...] + # [lo1, hi2, lo2, borrow, shift_amt == 0, ...] add - # [lo1 + hi2, lo2, flag, ...] + # [lo1 + hi2, lo2, borrow, shift_amt == 0, ...] # c_lo = lo1 + hi2 (overflow wraps to low bits) + # This add is safe: hi2 is the high limb of a_hi * 2^complement_shift + hi1, so + # hi2 < 2^complement_shift, while lo1 = (a_lo * 2^complement_shift) mod 2^32 is a multiple + # of 2^complement_shift. Thus lo1 <= 2^32 - 2^complement_shift, and lo1 + hi2 < 2^32. swap - # [lo2, c_lo, flag, ...] + # [lo2, c_lo, borrow, shift_amt == 0, ...] # lo2 = c_hi - # --- STEP 6: Conditionally swap based on b < 32 --- + # --- STEP 6: Conditionally swap based on (n > 31) == (n mod 32 == 0) --- movup.2 - # [flag, lo2, c_lo, ...] - # flag = 1 if b < 32 + # [borrow, lo2, c_lo, shift_amt == 0, ...] - not - # [!flag, lo2, c_lo, ...] - # !flag = 1 if b >= 32 + movup.3 + # [shift_amt == 0, borrow, lo2, c_lo, ...] + eq + # [swap_flag, lo2, c_lo, ...] + # swap_flag = 1 for n in [1, 32] and 0 for n in {0} ∪ [33, 63] cswap - # If !flag=1 (b>=32): swap -> [c_lo, lo2, ...] - # If !flag=0 (b<32): no swap -> [lo2, c_lo, ...] # Result in BE format: [c_hi, c_lo, ...] # Convert BE output to LE: [c_hi, c_lo] -> [c_lo, c_hi] diff --git a/crates/lib/core/asm/mem.masm b/crates/lib/core/asm/mem.masm index 4cc8d81ed6..3f92b5b805 100644 --- a/crates/lib/core/asm/mem.masm +++ b/crates/lib/core/asm/mem.masm @@ -14,8 +14,22 @@ use miden::core::crypto::hashes::poseidon2 #! - read_ptr is the memory pointer where the words to copy are stored. #! - write_ptr is the memory pointer where the words will be copied. #! +#! # Panics +#! +#! Panics if the source range `[read_ptr, read_ptr + 4*n)` and destination range +#! `[write_ptr, write_ptr + 4*n)` overlap. +#! #! Total cycles: 15 + 16 * num_words pub proc memcopy_words + # Assert source and destination ranges do not overlap. + # Non-overlap: write_ptr >= read_ptr + 4*n OR read_ptr >= write_ptr + 4*n + dup mul.4 + dup dup.3 add + dup.4 swap u32gte + swap dup.4 add + dup.3 swap u32gte + or assert.err="source and destination ranges must not overlap" + # The loop variable is changed with an add instead of sub because the former # uses one fewer cycle. So here the counter is negated. (1 cycles) # stack: [-n, read_ptr, write_ptr, ...] @@ -70,8 +84,21 @@ end #! - read_ptr is the memory pointer where the elements to copy are stored. #! - write_ptr is the memory pointer where the elements will be copied. #! +#! # Panics +#! +#! Panics if the source range `[read_ptr, read_ptr + n)` and destination range +#! `[write_ptr, write_ptr + n)` overlap. +#! #! Total cycles: 7 + 14 * num_elements pub proc memcopy_elements + # Assert source and destination ranges do not overlap. + # Non-overlap: write_ptr >= read_ptr + n OR read_ptr >= write_ptr + n + dup dup.2 add + dup.3 swap u32gte + dup.1 dup.4 add + dup.3 swap u32gte + or assert.err="source and destination ranges must not overlap" + # The loop variable is changed with an `add` instead of `sub` because the former uses one fewer # cycle. So here the counter is negated. (1 cycle) neg diff --git a/crates/lib/core/asm/pcs/fri/frie2f4.masm b/crates/lib/core/asm/pcs/fri/frie2f4.masm index d528795a73..5cf66c8ea3 100644 --- a/crates/lib/core/asm/pcs/fri/frie2f4.masm +++ b/crates/lib/core/asm/pcs/fri/frie2f4.masm @@ -2,12 +2,13 @@ use miden::core::crypto::hashes::poseidon2 use miden::core::stark::constants use miden::core::pcs::fri::helper -#! Stores the layer commitments C followed by [d_size, t_depth, a1, a0] and [poe, p, e1, e0] where: +#! Stores the layer commitments C followed by [d_size, t_depth, a0, a1] and [poe, p, e0, e1] where: #! 1) d_size is the domain size divided by 4 of the domain corresponding to C. #! 2) t_depth is the tree depth of the Merkle tree with commitment C. #! 3) (a0, a1) is the folding challenge to create the next layer. -#! 4) p is the query index and (e0, e1) is the evaluation at the first layer and poe is g^p with -#! g being the initial domain generator. +#! 4) p is the query index and (e0, e1) is the evaluation at the first layer and poe is +#! g^rev(p) with g being the initial domain generator and rev(.) the bit-reversal over the LDE +#! domain. #! TODO: This pre-processing function should in fact compute d_size and t_depth for each C #! starting from the original domain size. @locals(16) @@ -28,7 +29,7 @@ pub proc preprocess dup.5 #[ptr, Q, num_queries, ptr,..] u32wrapping_add.4 #[ptr+4, Q, num_queries, ptr, ..] swap.6 #[ptr, Q, num_queries, ptr+4, ..] - mem_storew_be #[Q, num_queries, ptr+4, ..] + mem_storew_le #[Q, num_queries, ptr+4, ..] dup.4 sub.1 #[num_queries-1, Q, num_queries, ptr+4, ..] swap.5 #[num_queries, Q, num_queries-1, ptr+4, ..] @@ -55,7 +56,7 @@ pub proc preprocess dup.5 u32wrapping_add.4 swap.6 - mem_storew_be + mem_storew_le dup.4 sub.1 swap.5 @@ -83,7 +84,7 @@ pub proc preprocess dup.5 u32wrapping_add.4 swap.6 - mem_storew_be + mem_storew_le dup.4 sub.1 swap.5 @@ -100,37 +101,40 @@ end #! Checks that, for a query with index p at layer i, the folding procedure to create layer (i + 1) #! was performed correctly. This also advances layer_ptr by 8 to point to the next query layer. #! -#! Input: [layer_ptr, layer_ptr, poe, p, e1, e0, layer_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] -#! Output: [is_not_last_layer, layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne1, ne0, layer_ptr+8, rem_ptr, x, x, x, x, x, x, x, x, ...] +#! Input: [layer_ptr, layer_ptr, poe, p, e0, e1, layer_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] +#! Output: [is_not_last_layer, layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne0, ne1, layer_ptr+8, rem_ptr, x, x, x, x, x, x, x, x, ...] #! -#! Cycles: 83 +#! Cycles: 80 @locals(12) pub proc verify_query_layer - # load layer commitment C as well as [a0, a1, t_depth, d_size] (7 cycles) + # load layer commitment C as well as [d_size, t_depth, a0, a1] (7 cycles) swapdw movup.8 add.4 - mem_loadw_be # load [a0, a1, t_depth, d_size] from layer_ptr + 4 + mem_loadw_le # load [d_size, t_depth, a0, a1] from layer_ptr + 4 swapw movup.8 - mem_loadw_be # load C from layer_ptr - # => [C, d_size, t_depth, a1, a0, poe, p, e1, e0, layer_ptr, rem_ptr, ...] + mem_loadw_le # load C from layer_ptr + # => [C, d_size, t_depth, a0, a1, poe, p, e0, e1, layer_ptr, rem_ptr, ...] # verify Merkle auth path for (index = f_pos, depth = t_depth, Root = C) (19 cycles) - swapw.2 # [poe, p, e1, e0, d_size, t_depth, a1, a0, C, layer_ptr, rem_ptr, ...] - swap # [p, poe, e1, e0, d_size, t_depth, a1, a0, C, layer_ptr, rem_ptr, ...] - movup.4 # [d_size, p, poe, e1, e0, t_depth, a1, a0, C, layer_ptr, rem_ptr, ...] - u32divmod # p and d_size must be u32 values + swapw.2 # [poe, p, e0, e1, d_size, t_depth, a0, a1, C, layer_ptr, rem_ptr, ...] + swap # [p, poe, e0, e1, d_size, t_depth, a0, a1, C, layer_ptr, rem_ptr, ...] + movup.4 # [d_size, p, poe, e0, e1, t_depth, a0, a1, C, layer_ptr, rem_ptr, ...] + + drop # drop d_size + dup + u32shr.2 # [f_pos, p, poe, e0, e1, t_depth, a0, a1, C, layer_ptr, rem_ptr, ...] movup.5 movupw.2 dup.5 - movup.5 # [t_depth, f_pos, C, f_pos, d_seg, poe, e1, e0, a1, a0, layer_ptr, rem_ptr, ...] - mtree_get # [V, C, f_pos, d_seg, poe, e1, e0, a1, a0, layer_ptr, rem_ptr, ...] + + movup.5 # [t_depth, f_pos, C, f_pos, p, poe, e0, e1, a0, a1, layer_ptr, rem_ptr, ...] + mtree_get # [V, C, f_pos, p, poe, e0, e1, a0, a1, layer_ptr, rem_ptr, ...] adv.push_mapval swapw - # => [V, C, f_pos, d_seg, poe, e1, e0, a1, a0, layer_ptr, rem_ptr, ...] - # where f_pos = p % d_size and d_seg = p / 4 + # => [C, V, f_pos, p, poe, e0, e1, a0, a1, layer_ptr, rem_ptr, ...] # unhash V and save the pre-image in locaddr.0 and locaddr.4; we don't clear values of C # because adv_pipe overwrites the first 8 elements of the stack (15 cycles) @@ -141,9 +145,10 @@ pub proc verify_query_layer padw adv_pipe exec.poseidon2::permute - # => [T2, T1, T0, ptr, V, f_pos, d_seg, poe, e1, e0, a1, a0, layer_ptr, rem_ptr, ..] + # => [T0, T1, T2, ptr, V, f_pos, p, poe, e0, e1, a0, a1, layer_ptr, rem_ptr, ..] - # assert T1 == V (16 cycles) + # assert T0 == V (16 cycles) + swapw swapw.3 drop movup.3 @@ -154,30 +159,30 @@ pub proc verify_query_layer movup.9 assert_eq - # load (v7, ..v0) from memory (8 cycles) - exec.constants::tmp3 - mem_loadw_be - swapw + # load (v0, ..v7) from memory (8 cycles) exec.constants::tmp4 - mem_loadw_be - # => [v7, ..., v0, f_pos, d_seg, poe, e1, e0, a1, a0, layer_ptr, rem_ptr, ...] + mem_loadw_le + swapw + exec.constants::tmp3 + mem_loadw_le + # => [v0, ..., v7, f_pos, p, poe, e0, e1, a0, a1, layer_ptr, rem_ptr, ...] # fold by 4 (1 cycle) fri_ext2fold4 - # => [x, x, x, x, x, x, x, x, x, x, layer_ptr + 8, poe^4, f_pos, ne1, ne0, rem_ptr, ...] + # => [x, x, x, x, x, x, x, x, x, x, layer_ptr + 8, poe^4, f_pos, ne0, ne1, rem_ptr, ...] # prepare for next iteration (10 cycles) swapdw - # => [x, x, layer_ptr + 8, poe^4, f_pos, ne1, ne0, rem_ptr, x, x, x, x, x, x, x, x, ...] - dup.2 # [layer_ptr+8, x, x, layer_ptr+8, poe^4, f_pos, ne1, ne0, rem_ptr, ] - movdn.7 # [x, x, layer_ptr+8, poe^4, f_pos, ne1, ne0, layer_ptr+8, rem_ptr, ...] + # => [x, x, layer_ptr + 8, poe^4, f_pos, ne0, ne1, rem_ptr, x, x, x, x, x, x, x, x, ...] + dup.2 # [layer_ptr+8, x, x, layer_ptr+8, poe^4, f_pos, ne0, ne1, rem_ptr, ] + movdn.7 # [x, x, layer_ptr+8, poe^4, f_pos, ne0, ne1, layer_ptr+8, rem_ptr, ...] drop - drop # [layer_ptr+8, poe^4, f_pos, ne1, ne0, layer_ptr+8, rem_ptr, ...] - dup # [layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne1, ne0, layer_ptr+8, rem_ptr, ...] - dup.7 # [rem_ptr, layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne1, ne0, layer_ptr+8, rem_ptr, ...] - dup.1 # [layer_ptr+8, rem_ptr, layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne1, ne0, layer_ptr+8, rem_ptr, ...] + drop # [layer_ptr+8, poe^4, f_pos, ne0, ne1, layer_ptr+8, rem_ptr, ...] + dup # [layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne0, ne1, layer_ptr+8, rem_ptr, ...] + dup.7 # [rem_ptr, layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne0, ne1, layer_ptr+8, rem_ptr, ...] + dup.1 # [layer_ptr+8, rem_ptr, layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne0, ne1, layer_ptr+8, rem_ptr, ...] neq - # => [is_not_last_layer, layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne1, ne0, layer_ptr+8, rem_ptr, x, x, x, x, x, x, x, x, ...] + # => [is_not_last_layer, layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne0, ne1, layer_ptr+8, rem_ptr, x, x, x, x, x, x, x, x, ...] end #! Verifies one FRI query. @@ -187,17 +192,17 @@ end #! This procedure is exactly the same as `verify_query_128` except for the remainder polynomial check, #! thus any change to one procedure will imply an equivalent change to the other one. #! -#! Input: [poe, p, e1, e0, layer_ptr, rem_ptr, ...] +#! Input: [poe, p, e0, e1, layer_ptr, rem_ptr, ...] #! Output: [x, x, x, x, x, x, x, x, x, x, x, x, ...] (12 "garbage" elements) #! -#! - poe is g^p. +#! - poe is g^rev(p). #! - p is a query index at the first layer. #! - (e0, e1) is an extension field element corresponding to the value of the first layer at index p. #! - layer_ptr is the memory address of the layer data (Merkle tree root, alpha etc.) for the next #! layer. #! - rem_ptr is the memory address of the remainder polynomial. #! -#! Cycles: 107 + num_layers * 83 +#! Cycles: 107 + num_layers * 80 pub proc verify_query_64 # prepare stack to be in a form that leverages the fri_ext2fold4 instruction output stack state @@ -211,29 +216,29 @@ pub proc verify_query_64 dup movup.3 neq - # => [?, layer_ptr, layer_ptr, poe, p, e1, e0, layer_ptr, rem_ptr, 0, 0, 0, 0, 0, 0, 0, 0, ...] + # => [?, layer_ptr, layer_ptr, poe, p, e0, e1, layer_ptr, rem_ptr, 0, 0, 0, 0, 0, 0, 0, 0, ...] # verify correctness of layer folding while.true exec.verify_query_layer end - # => [rem_ptr, rem_ptr, poe^(2^n), f_pos, ne1, ne0, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] + # => [rem_ptr, rem_ptr, poe^(2^n), f_pos, ne0, ne1, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] - movup.2 mul.7 - exec.constants::tmp2 mem_store - # => [rem_ptr, rem_ptr, f_pos, ne1, ne0, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] + movup.2 + push.0.0.0 movup.3 exec.constants::tmp2 mem_storew_le dropw + # => [rem_ptr, rem_ptr, f_pos, ne0, ne1, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] - push.0 exec.constants::tmp1 mem_loadw_be - # => [P, ne1, ne0, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] + push.0 exec.constants::tmp1 mem_loadw_le + # => [P, ne0, ne1, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] swapw swapdw - # => [x, x, x, x, x, x, x, x, ne1, ne0, rem_ptr, rem_ptr, P, ...] + # => [x, x, x, x, x, x, x, x, ne0, ne1, rem_ptr, rem_ptr, P, ...] exec.helper::evaluate_fri_remainder_poly_max_degree_plus_1_half - # => [x, x, x, x, x, x, x, x, ne1, ne0, rem_ptr, rem_ptr, P, ...] + # => [x, x, x, x, x, x, x, x, ne0, ne1, rem_ptr, rem_ptr, P, ...] swapdw - # => [ne1, ne0, rem_ptr, rem_ptr, P, x, x, x, x, x, x, x, x, ...] + # => [ne0, ne1, rem_ptr, rem_ptr, P, x, x, x, x, x, x, x, x, ...] movup.6 assert_eq movup.5 assert_eq # => [X, x, x, x, x, x, x, x, x, ...] @@ -246,17 +251,17 @@ end #! This procedure is exactly the same as `verify_query_64` except for the remainder polynomial check, #! thus any change to one procedure will imply an equivalent change to the other one. #! -#! Input: [poe, p, e1, e0, layer_ptr, rem_ptr, ...] +#! Input: [poe, p, e0, e1, layer_ptr, rem_ptr, ...] #! Output: [x, x, x, x, x, x, x, x, x, x, x, x, ...] (12 "garbage" elements) #! -#! - poe is g^p. +#! - poe is g^rev(p). #! - p is a query index at the first layer. #! - (e0, e1) is an extension field element corresponding to the value of the first layer at index p. #! - layer_ptr is the memory address of the layer data (Merkle tree root, alpha etc.) for the next #! layer. #! - rem_ptr is the memory address of the remainder polynomial. #! -#! Cycles: 140 + num_layers * 83 +#! Cycles: 140 + num_layers * 80 pub proc verify_query_128 # prepare stack to be in a form that leverages the fri_ext2fold4 instruction output stack state @@ -270,28 +275,28 @@ pub proc verify_query_128 dup movup.3 neq - # => [?, layer_ptr, layer_ptr, poe, p, e1, e0, layer_ptr, rem_ptr, 0, 0, 0, 0, 0, 0, 0, 0, ...] + # => [?, layer_ptr, layer_ptr, poe, p, e0, e1, layer_ptr, rem_ptr, 0, 0, 0, 0, 0, 0, 0, 0, ...] # verify correctness of layer folding while.true exec.verify_query_layer end - # => [rem_ptr, rem_ptr, poe^(2^n), f_pos, ne1, ne0, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] + # => [rem_ptr, rem_ptr, poe^(2^n), f_pos, ne0, ne1, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] - movup.2 mul.7 - exec.constants::tmp2 mem_store - # => [rem_ptr, rem_ptr, f_pos, ne1, ne0, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] + movup.2 + push.0.0.0 movup.3 exec.constants::tmp2 mem_storew_le dropw + # => [rem_ptr, rem_ptr, f_pos, ne0, ne1, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] - push.0 exec.constants::tmp1 mem_loadw_be - # => [P, ne1, ne0, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] + push.0 exec.constants::tmp1 mem_loadw_le + # => [P, ne0, ne1, rem_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...] swapw swapdw - # => [x, x, x, x, x, x, x, x, ne1, ne0, rem_ptr, rem_ptr, P, ...] + # => [x, x, x, x, x, x, x, x, ne0, ne1, rem_ptr, rem_ptr, P, ...] exec.helper::evaluate_fri_remainder_poly_max_degree_plus_1 - # => [x, x, x, x, x, x, x, x, ne1, ne0, rem_ptr, rem_ptr, P, ...] + # => [x, x, x, x, x, x, x, x, ne0, ne1, rem_ptr, rem_ptr, P, ...] swapdw - # => [ne1, ne0, rem_ptr, rem_ptr, P, x, x, x, x, x, x, x, x, ...] + # => [ne0, ne1, rem_ptr, rem_ptr, P, x, x, x, x, x, x, x, x, ...] movup.6 assert_eq movup.5 assert_eq # => [X, x, x, x, x, x, x, x, x, ...] @@ -307,7 +312,7 @@ end #! Input: [query_ptr, layer_ptr, rem_ptr, g, ...] #! Output: [...] #! -#! - query_ptr is a pointer to a list of tuples of the form (e0, e1, p, poe) where poe is equal +#! - query_ptr is a pointer to a list of tuples of the form (poe, p, e0, e1) where poe is equal #! to g^p with g being the initial FRI domain generator. p is the query index at the first layer #! and (e0, e1) is an extension field element corresponding to the value of the first layer at index p. #! - layer_ptr is a pointer to the first layer commitment denoted throughout the code by C. @@ -326,15 +331,15 @@ end #! #! This means for example that: #! 1. rem_ptr - 1 points to the last (alpha0, alpha1, t_depth, d_size) tuple. -#! 2. layer_ptr - 1 points to the last (e0, e1, p, poe) tuple. +#! 2. layer_ptr - 1 points to the last (poe, p, e0, e1) tuple. #! -#! Cycles: 24 + num_queries * (107 + num_layers * 83) +#! Cycles: 24 + num_queries * (107 + num_layers * 80) @locals(4) proc verify_64 # store [query_ptr, layer_ptr, rem_ptr, g] to keep track of all queries # (3 cycles) - loc_storew_be.0 + loc_storew_le.0 # [(query_ptr == layer_ptr), query_ptr, layer_ptr, rem_ptr, g] # (4 cycles) @@ -346,14 +351,14 @@ proc verify_64 # a pointer to the evaluation point and a pointer to the location of the polynomial. push.0.0 exec.constants::tmp2 exec.constants::get_remainder_poly_address - exec.constants::tmp1 mem_storew_be + exec.constants::tmp1 mem_storew_le movup.4 while.true - # load [e0, e1, p, poe] from memory i.e. next query data (7 cycles) + # load [poe, p, e0, e1] from memory i.e. next query data (7 cycles) movup.4 - mem_loadw_be - # => [poe, p, e1, e0, layer_ptr, rem_ptr, g, ...] + mem_loadw_le + # => [poe, p, e0, e1, layer_ptr, rem_ptr, g, ...] # we now have everything to verify query p exec.verify_query_64 @@ -362,9 +367,9 @@ proc verify_64 # => [x, x, x, x, x, x, x, x, x, x, x, x, g, ...] dropw drop # => [x, x, x, x, x, x, x, g, ...] - loc_loadw_be.0 # load [query_ptr, layer_ptr, rem_ptr, g] + loc_loadw_le.0 # load [query_ptr, layer_ptr, rem_ptr, g] add.4 - loc_storew_be.0 # store [query_ptr + 4, layer_ptr, rem_ptr, g] + loc_storew_le.0 # store [query_ptr + 4, layer_ptr, rem_ptr, g] swapw # => [x, x, x, x, query_ptr + 4, layer_ptr, rem_ptr, g, ...] dup.5 @@ -386,7 +391,7 @@ end #! Input: [query_ptr, layer_ptr, rem_ptr, g, ...] #! Output: [...] #! -#! - query_ptr is a pointer to a list of tuples of the form (e0, e1, p, poe) where poe is equal +#! - query_ptr is a pointer to a list of tuples of the form (poe, p, e0, e1) where poe is equal #! to g^p with g being the initial FRI domain generator. p is the query index at the first layer #! and (e0, e1) is an extension field element corresponding to the value of the first layer at index p. #! - layer_ptr is a pointer to the first layer commitment denoted throughout the code by C. @@ -405,15 +410,15 @@ end #! #! This means for example that: #! 1. rem_ptr - 1 points to the last (alpha0, alpha1, t_depth, d_size) tuple. -#! 2. layer_ptr - 1 points to the last (e0, e1, p, poe) tuple. +#! 2. layer_ptr - 1 points to the last (poe, p, e0, e1) tuple. #! -#! Cycles: 24 + num_queries * (140 + num_layers * 83) +#! Cycles: 24 + num_queries * (140 + num_layers * 80) @locals(4) proc verify_128 # store [query_ptr, layer_ptr, rem_ptr, g] to keep track of all queries # (3 cycles) - loc_storew_be.0 + loc_storew_le.0 # [(query_ptr == layer_ptr), query_ptr, layer_ptr, rem_ptr, g] # (4 cycles) @@ -425,14 +430,14 @@ proc verify_128 # a pointer to the evaluation point and a pointer to the location of the polynomial. push.0.0 exec.constants::tmp2 exec.constants::get_remainder_poly_address - exec.constants::tmp1 mem_storew_be + exec.constants::tmp1 mem_storew_le movup.4 while.true - # load [e0, e1, p, poe] from memory i.e. next query data (7 cycles) + # load [poe, p, e0, e1] from memory i.e. next query data (7 cycles) movup.4 - mem_loadw_be - # => [poe, p, e1, e0, layer_ptr, rem_ptr, g, ...] + mem_loadw_le + # => [poe, p, e0, e1, layer_ptr, rem_ptr, g, ...] # we now have everything to verify query p exec.verify_query_128 @@ -441,9 +446,9 @@ proc verify_128 # => [x, x, x, x, x, x, x, x, x, x, x, x, g, ...] dropw drop # => [x, x, x, x, x, x, x, g, ...] - loc_loadw_be.0 # load [query_ptr, layer_ptr, rem_ptr, g] + loc_loadw_le.0 # load [query_ptr, layer_ptr, rem_ptr, g] add.4 - loc_storew_be.0 # store [query_ptr + 4, layer_ptr, rem_ptr, g] + loc_storew_le.0 # store [query_ptr + 4, layer_ptr, rem_ptr, g] swapw # => [x, x, x, x, query_ptr + 4, layer_ptr, rem_ptr, g, ...] dup.5 @@ -464,8 +469,8 @@ end #! #! Cycles: #! -#! Polynomial degree less than 64: 24 + num_queries * (107 + num_layers * 83) -#! Polynomial degree less than 128: 24 + num_queries * (140 + num_layers * 83) +#! Polynomial degree less than 64: 24 + num_queries * (107 + num_layers * 80) +#! Polynomial degree less than 128: 24 + num_queries * (140 + num_layers * 80) pub proc verify # Get domain generator and pointer to the remainder codeword # (4 cycles) diff --git a/crates/lib/core/asm/pcs/fri/helper.masm b/crates/lib/core/asm/pcs/fri/helper.masm index 2c63e93912..6eada52af5 100644 --- a/crates/lib/core/asm/pcs/fri/helper.masm +++ b/crates/lib/core/asm/pcs/fri/helper.masm @@ -104,11 +104,11 @@ end #! #! Input: [...] #! Output: [...] -#! Cycles: 21 + 83 * num_fri_layers +#! Cycles: 21 + 225 * num_fri_layers pub proc load_fri_layer_commitments # We need to store the current FRI layer LDE domain size and its logarithm. padw exec.constants::get_lde_domain_info_word - exec.constants::tmp1 mem_storew_be + exec.constants::tmp1 mem_storew_le # => [Y, ...] where `Y` is as "garbage" word # Address containing the first layer commitment @@ -129,42 +129,42 @@ pub proc load_fri_layer_commitments dup.5 add.4 swap.6 - mem_storew_be + mem_storew_le #=> [COM, num_layers, ptr_layer + 4, y, y, ...] - # Reseed - exec.random_coin::reseed + # Reseed with commitment and absorb per-round PoW witness in one shot. + adv_push.1 + exec.random_coin::reseed_with_felt # => [num_layers, ptr_layer + 4, y, y, ...] + # Verify per-round FRI folding PoW and sample folding challenge in one shot. + # Reads folding_pow_bits from memory. Bypasses buffer API since sponge state + # is known after reseed_with_felt. + exec.random_coin::sample_folding_pow_and_ext + #=> [a0, a1, num_layers, ptr_layer + 4, y, y, ...] padw - exec.random_coin::get_rate_1 - #=> [R1, ZERO, num_layers, ptr_layer + 4, y, y, ... ] - push.0.0 - exec.constants::tmp1 mem_loadw_be - # => [lde_size, log2(lde_size), lde_generator, 0, a1, a0, Y, num_layers, ptr_layer + 4, y, y, ...] + exec.constants::tmp1 mem_loadw_le + # => [lde_size, log2(lde_size), lde_generator, 0, a0, a1, Y, num_layers, ptr_layer + 4, y, y, ...] # Compute and save to memory new lde_size and its new logarithm div.4 swap sub.2 swap - exec.constants::tmp1 mem_storew_be - # => [lde_size / 4, log2(lde_size) - 2, lde_generator, 0, a1, a0, num_layers, ptr_layer + 4, y, y, ...] + exec.constants::tmp1 mem_storew_le + # => [lde_size / 4, log2(lde_size) - 2, lde_generator, 0, a0, a1, num_layers, ptr_layer + 4, y, y, ...] # Move the pointer higher up the stack movup.2 drop movup.2 drop - swapw - dropw - # => [lde_size, log2(lde_size), a1, a0, num_layers, ptr_layer + 4, y, y, Y, ...] - - # Save [a0, a1, log2(lde_size) - 2, lde_size / 4] in memory next to the layer commitment + # => [lde_size / 4, log2(lde_size) - 2, a0, a1, num_layers, ptr_layer + 4, y, y, ...] + # Save [lde_size / 4, log2(lde_size) - 2, a0, a1] in memory next to the layer commitment dup.5 add.4 swap.6 - mem_storew_be + mem_storew_le swapw - # => [num_layers, ptr_layer + 8, y, y, lde_size / 4, log2(lde_size) - 2, a1, a0, ...] + # => [num_layers, ptr_layer + 8, y, y, lde_size / 4, log2(lde_size) - 2, a0, a1, ...] # Decrement the FRI layer counter sub.1 @@ -191,15 +191,6 @@ end #! 2- Remainder polynomial of degree less #! than 128: 191 pub proc load_and_verify_remainder - # Load remainder commitment and save it at `TMP1` - padw - adv_loadw - exec.constants::tmp1 mem_storew_be - #=> [COM, ...] - - # Reseed with remainder commitment - exec.random_coin::reseed - #=> [...] # `adv_pipe` the remainder codeword ## Get the numbers of FRI layers @@ -219,40 +210,36 @@ pub proc load_and_verify_remainder eq if.true # Remainder polynomial degree less than 64 - padw padw padw - # => [Y, Y, 0, 0, 0, 0 remainder_poly_ptr, remainder_size, y, y] + # Load the random coin state as the initial sponge state. + push.0 exec.constants::random_coin_output_len_ptr mem_store + push.0 exec.constants::random_coin_input_len_ptr mem_store + exec.random_coin::load_random_coin_state + # => [R0, R1, C, remainder_poly_ptr, remainder_size, y, y] # adv_load remainder polynomial exec.load_fri_remainder_poly_max_degree_plus_1_half - # Compare Remainder_poly_com with the read commitment - exec.constants::tmp1 mem_loadw_be - movup.4 - assert_eq - movup.3 - assert_eq - movup.2 - assert_eq - assert_eq + # Update the random coin state with the remainder polynomial digest. + exec.random_coin::store_random_coin_state + push.0 exec.constants::random_coin_input_len_ptr mem_store + push.8 exec.constants::random_coin_output_len_ptr mem_store else # Remainder polynomial degree less than 128 - padw padw padw - # => [Y, Y, 0, 0, 0, 0 remainder_poly_ptr, remainder_size, y, y] + # Load the random coin state as the initial sponge state. + push.0 exec.constants::random_coin_output_len_ptr mem_store + push.0 exec.constants::random_coin_input_len_ptr mem_store + exec.random_coin::load_random_coin_state + # => [R0, R1, C, remainder_poly_ptr, remainder_size, y, y] # adv_load remainder polynomial exec.load_fri_remainder_poly_max_degree_plus_1 - # => [Y, Remainder_poly_com, Y, remainder_poly_ptr, remainder_size, y, y] - - # Compare Remainder_poly_com with the read commitment - exec.constants::tmp1 mem_loadw_be - movup.4 - assert_eq - movup.3 - assert_eq - movup.2 - assert_eq - assert_eq + # => [R0, R1, C, remainder_poly_ptr, remainder_size, y, y] + + # Update the random coin state with the remainder polynomial digest. + exec.random_coin::store_random_coin_state + push.0 exec.constants::random_coin_input_len_ptr mem_store + push.8 exec.constants::random_coin_output_len_ptr mem_store end dropw dropw diff --git a/crates/lib/core/asm/stark/constants.masm b/crates/lib/core/asm/stark/constants.masm index 770942651d..2578d7f207 100644 --- a/crates/lib/core/asm/stark/constants.masm +++ b/crates/lib/core/asm/stark/constants.masm @@ -2,7 +2,7 @@ # ================================================================================================= # General constants -const ROOT_UNITY = 7277203076849721926 +const ROOT_UNITY = 1753635133440165772 const DOMAIN_OFFSET = 7 const DOMAIN_OFFSET_INV = 2635249152773512046 @@ -13,14 +13,9 @@ const NUM_AUX_TRACE_COEFS = 2 const BLOWUP_FACTOR = 8 const BLOWUP_FACTOR_LOG = 3 -# Number of fixed length public inputs with padding (in field elements) -# This is composed of the input/output operand stacks (16 * 2) and the program digest (4) and four -# zeros for padding to the next multiple of 4. Note that, then, the fixed length public inputs -# which are stored as extension field elements will be double-word aligned. -const NUM_FIXED_LEN_PUBLIC_INPUTS = 40 - -# Op label for kernel procedures table messages -const KERNEL_OP_LABEL = 48 +# FRI parameters (hardcoded; future versions may make these configurable) +const LOG_FINAL_DEGREE = 7 +const FRI_FOLD_ARITY = 4 # MEMORY POINTERS # ================================================================================================= @@ -30,10 +25,11 @@ const KERNEL_OP_LABEL = 48 ## of constant size. ### Addresses to store the LDE domain parameters +### The info word layout is [lde_size, log(lde_size), lde_g, 0]. const LDE_DOMAIN_INFO_PTR = 3223322624 -const LDE_DOMAIN_GEN_PTR = 3223322625 -const LDE_DOMAIN_LOG_SIZE_PTR = 3223322626 -const LDE_DOMAIN_SIZE_PTR = 3223322627 +const LDE_DOMAIN_SIZE_PTR = 3223322624 +const LDE_DOMAIN_LOG_SIZE_PTR = 3223322625 +const LDE_DOMAIN_GEN_PTR = 3223322626 ### Address to store the number of FRI queries const NUM_QUERIES_PTR = 3223322628 @@ -58,9 +54,6 @@ const FRI_QUERIES_ADDRESS_PTR = 3223322633 ### Address to store the logarithm of the execution trace length const TRACE_LENGTH_LOG_PTR = 3223322634 -### Address to store the number of grinding bits -const GRINDING_FACTOR_PTR = 3223322635 - ### Addresses to store the commitments to main, auxiliary and constraints composition polynomials traces const MAIN_TRACE_COM_PTR = 3223322636 const AUX_TRACE_COM_PTR = 3223322640 @@ -78,9 +71,6 @@ const ALPHA_DEEP_ND_PTR = 3223322656 ### Address to store the fixed terms, across all queries, of the DEEP queries. const OOD_FIXED_TERM_HORNER_EVALS_PTR = 3223322660 -### Address storing a pointer to the number of public inputs (in field elements) -const NUM_PUBLIC_INPUTS_PTR = 3223322664 - ### Address storing trace domain generator const TRACE_DOMAIN_GENERATOR_PTR = 3223322665 @@ -101,6 +91,11 @@ const TMP2 = 3223322684 const TMP3 = 3223322688 const TMP4 = 3223322692 +### gamma = beta^MAX_MESSAGE_WIDTH for per-bus domain separation. +### Stored as [gamma0, gamma1, 0, 0] (one extension field element, word-aligned). +### Computed once in generate_aux_randomness, read by reduce_kernel_digests. +const BUS_GAMMA_PTR = 3223322696 + ### Address to the word holding the non-deterministically loaded 2 random challenges, which will be ### checked for correctness once we receive the commitment to the auxiliary trace and are able to ### generate the auxiliary randomness @@ -118,34 +113,74 @@ const NUM_ACE_INPUTS_PTR = 3223322721 const NUM_ACE_GATES_PTR = 3223322722 const MAX_CYCLE_LEN_LOG_PTR = 3223322723 +### Addresses to store proof-of-work bit counts. +### query_pow_bits: PoW before query index sampling (PCS_PARAMS.query_pow_bits) +### deep_pow_bits: PoW before DEEP challenge sampling (PCS_PARAMS.deep.deep_pow_bits) +### folding_pow_bits: PoW per FRI folding round (PCS_PARAMS.fri.folding_pow_bits), same for all layers +const QUERY_POW_BITS_PTR = 3223322724 +const DEEP_POW_BITS_PTR = 3223322725 +const FOLDING_POW_BITS_PTR = 3223322726 + ### Addresses of the digests of dynamically executed procedures const DYNAMIC_PROCEDURE_0_PTR = 3223322728 const DYNAMIC_PROCEDURE_1_PTR = 3223322732 const DYNAMIC_PROCEDURE_2_PTR = 3223322736 const DYNAMIC_PROCEDURE_3_PTR = 3223322740 +const DYNAMIC_PROCEDURE_4_PTR = 3223322744 + +### Random coin buffers +const RANDOM_COIN_INPUT_BUF_PTR = 3223322748 +const RANDOM_COIN_INPUT_LEN_PTR = 3223322756 +const RANDOM_COIN_OUTPUT_LEN_PTR = 3223322757 ## ACE related ## Starts at address 3225419776 = 2**31 + 2**30 + 2**22 and the memory region grows backward -## and forward and is of variable length in both directions. -## In the backward direction, the size is determined by the size of the fixed public inputs and -## the number of (groups) of variable length inputs. +## and forward, forming the ACE READ section consumed by `eval_circuit`. +## +## In the backward direction, the size is determined by the fixed-length public inputs (FLPI) +## and the variable-length public input reductions (VLPI). These regions are laid out by +## `compute_and_store_public_inputs_address` in `stark/public_inputs.masm`. ## -## In the forward direction, the size is determined by the number of OOD evaluations, which itself -## is a function of the number of columns in all traces, the size of the ACE circuit description, -## and the number of auxiliary ACE inputs, which is fixed to 12 base field elements. +## In the forward direction, the size is determined by the OOD evaluations, aux bus boundary +## values, stark variables, and circuit constants. +## +## ACE READ section layout (low address -> high address): +## +## pi_ptr --> [ FLPI (m EF) ] fixed-length public inputs +## [ VLPI reductions (k words) ] k groups, word-aligned (per-instance) +## anchor --> [ aux_rand (1 word) ] AUX_RAND_ELEM_PTR (this address) +## [ OOD evaluations ] OOD_EVALUATIONS_PTR +## [ aux bus boundary ] AUX_BUS_BOUNDARY_PTR +## [ stark vars ] AUXILIARY_ACE_INPUTS_PTR +## [ constants ] ACE_CIRCUIT_STREAM_PTR +## ... EVAL section follows ... +## +## The FLPI and VLPI pointers are dynamic (stored at PUBLIC_INPUTS_ADDRESS_PTR and +## VARIABLE_LEN_PUBLIC_INPUTS_ADDRESS_PTR). All other pointers are fixed constants. +## +## Relationship to ACE codegen: Each VLPI group occupies 1 word (4 base felts = 2 EF +## slots) due to word-alignment, so `k` groups map to `k * 2` EF slots in AceConfig. ### We use 2 extension field elements for a total of 4 base field elements. const AUX_RAND_ELEM_PTR = 3225419776 -### OOD evaluations require a total of (80 + 8) * 2 * 2 field elements for current and next trace -### polynomials and 8 * 2 * 2 field elements for current and next constraint composition polynomials +### OOD evaluations require a total of (72 + 16 + 16) * 2 * 2 field elements for current and next: +### - 72 main trace columns (padded) +### - 16 aux trace base columns (aux width * extension degree) +### - 16 quotient chunk base columns (8 chunks * extension degree) const OOD_EVALUATIONS_PTR = 3225419780 # AUX_RAND_ELEM_PTR + 4 -### We need to allocate for 12 field -const AUXILIARY_ACE_INPUTS_PTR = 3225420164 # AUXILIARY_ACE_INPUTS_PTR + (80 + 8 + 8) * 2 * 2 +### Auxiliary bus boundary values (8 extension field elements = 16 base elements). +const AUX_BUS_BOUNDARY_PTR = 3225420196 # OOD_EVALUATIONS_PTR + (72 + 16 + 16) * 2 * 2 + +### Auxiliary inputs for ACE (stark vars), 10 extension field elements = 20 base elements. +const AUXILIARY_ACE_INPUTS_PTR = 3225420212 # AUX_BUS_BOUNDARY_PTR + 16 + +### Address at the start of the memory region holding the arithmetic circuit description (constants + ops). +const ACE_CIRCUIT_STREAM_PTR = 3225420232 # AUXILIARY_ACE_INPUTS_PTR + 20 -### Address at the start of the memory region holding the arithmetic circuit for constraint evaluation -const ACE_CIRCUIT_PTR = 3225420176 # AUXILIARY_ACE_INPUTS_PTR + 12 +### Address at the start of the evaluation-gates portion of the arithmetic circuit (EVAL section). +const ACE_CIRCUIT_PTR = 3225421380 # ACE_CIRCUIT_STREAM_PTR + num_const_felts ## FRI ## @@ -214,18 +249,31 @@ pub proc get_blowup_factor_log push.BLOWUP_FACTOR_LOG end +pub proc get_log_final_degree + push.LOG_FINAL_DEGREE +end + +pub proc get_fri_fold_arity + push.FRI_FOLD_ARITY +end + #! Store details about the LDE domain. #! #! The info stored is `[lde_size, log(lde_size), lde_g, 0]`. pub proc set_lde_domain_info_word - push.LDE_DOMAIN_INFO_PTR mem_storew_be + push.LDE_DOMAIN_INFO_PTR mem_storew_le end #! Load details about the LDE domain. #! #! The info stored is `[lde_size, log(lde_size), lde_g, 0]`. pub proc get_lde_domain_info_word - push.LDE_DOMAIN_INFO_PTR mem_loadw_be + push.LDE_DOMAIN_INFO_PTR mem_loadw_le +end + +#! Returns log(lde_size), i.e., the depth of the LDE domain Merkle tree. +pub proc get_lde_domain_depth + push.LDE_DOMAIN_LOG_SIZE_PTR mem_load end pub proc set_lde_domain_generator @@ -236,14 +284,6 @@ pub proc get_lde_domain_generator push.LDE_DOMAIN_GEN_PTR mem_load end -pub proc set_lde_domain_log_size - push.LDE_DOMAIN_LOG_SIZE_PTR mem_store -end - -pub proc get_lde_domain_log_size - push.LDE_DOMAIN_LOG_SIZE_PTR mem_load -end - pub proc set_lde_domain_size push.LDE_DOMAIN_SIZE_PTR mem_store end @@ -308,12 +348,28 @@ pub proc get_trace_length_log push.TRACE_LENGTH_LOG_PTR mem_load end -pub proc set_grinding_factor - push.GRINDING_FACTOR_PTR mem_store +pub proc set_query_pow_bits + push.QUERY_POW_BITS_PTR mem_store end -pub proc get_grinding_factor - push.GRINDING_FACTOR_PTR mem_load +pub proc get_query_pow_bits + push.QUERY_POW_BITS_PTR mem_load +end + +pub proc set_deep_pow_bits + push.DEEP_POW_BITS_PTR mem_store +end + +pub proc get_deep_pow_bits + push.DEEP_POW_BITS_PTR mem_load +end + +pub proc set_folding_pow_bits + push.FOLDING_POW_BITS_PTR mem_store +end + +pub proc get_folding_pow_bits + push.FOLDING_POW_BITS_PTR mem_load end pub proc main_trace_com_ptr @@ -347,10 +403,6 @@ pub proc ood_fixed_term_horner_evaluations_ptr push.OOD_FIXED_TERM_HORNER_EVALS_PTR end -pub proc num_public_inputs_ptr - push.NUM_PUBLIC_INPUTS_PTR -end - pub proc set_trace_domain_generator push.TRACE_DOMAIN_GENERATOR_PTR mem_store end @@ -398,6 +450,22 @@ pub proc tmp4 push.TMP4 end +pub proc random_coin_input_buf_ptr + push.RANDOM_COIN_INPUT_BUF_PTR +end + +pub proc random_coin_input_len_ptr + push.RANDOM_COIN_INPUT_LEN_PTR +end + +pub proc random_coin_output_len_ptr + push.RANDOM_COIN_OUTPUT_LEN_PTR +end + +pub proc bus_gamma_ptr + push.BUS_GAMMA_PTR +end + pub proc aux_rand_nd_ptr push.AUX_RAND_ND_PTR end @@ -418,10 +486,18 @@ pub proc ood_evaluations_ptr push.OOD_EVALUATIONS_PTR end +pub proc aux_bus_boundary_ptr + push.AUX_BUS_BOUNDARY_PTR +end + pub proc auxiliary_ace_inputs_ptr push.AUXILIARY_ACE_INPUTS_PTR end +pub proc ace_circuit_stream_ptr + push.ACE_CIRCUIT_STREAM_PTR +end + pub proc get_arithmetic_circuit_ptr push.ACE_CIRCUIT_PTR end @@ -450,10 +526,14 @@ pub proc get_procedure_digest_process_public_inputs_ptr push.DYNAMIC_PROCEDURE_3_PTR end +pub proc get_procedure_digest_observe_aux_trace_ptr + push.DYNAMIC_PROCEDURE_4_PTR +end + # HELPER # ================================================================================================= #! Overwrites the top stack word with zeros. pub proc zeroize_stack_word - exec.zero_word_ptr mem_loadw_be + exec.zero_word_ptr mem_loadw_le end diff --git a/crates/lib/core/asm/stark/deep_queries.masm b/crates/lib/core/asm/stark/deep_queries.masm index 49b3bb5ffa..bf58ff1b05 100644 --- a/crates/lib/core/asm/stark/deep_queries.masm +++ b/crates/lib/core/asm/stark/deep_queries.masm @@ -1,22 +1,26 @@ use miden::core::stark::constants +use miden::core::stark::utils #! Takes a query index and computes x := offset * domain_gen^index. It also computes the denominators #! (x - z) and (x - gz). #! -#! Input: [Y, Y, index, ...] -#! Output: [Z, Y, x, index, ...] +#! Input: [Y, Y, index, query_ptr, ...] +#! Output: [Z, Y, x, index, query_ptr, ...] #! #! where: -#! - Z := [-gz1, x -gz0, -z1, x - z0] +#! - Z := [x - z0, -z1, x - gz0, -gz1] +#! - x := offset * domain_gen^natural_index #! - Y is a "garbage" word -#! -#! Cycles: 58 proc compute_denominators - # Compute x = offset * domain_gen^index + # Compute x = offset * domain_gen^natural_index + # The natural (un-reversed) index is stored at query_ptr + 2 in memory, + # placed there by generate_list_indices to avoid a costly bit_reverse_len call here. exec.constants::get_lde_domain_info_word - #=> [lde_size, depth, domain_gen, 0, Y, index, ...] + #=> [lde_size, depth, domain_gen, 0, Y, index, query_ptr, ...] movup.2 - dup.8 + #=> [domain_gen, lde_size, depth, 0, Y, index, query_ptr, ...] + dup.9 add.2 mem_load + #=> [natural_index, domain_gen, lde_size, depth, 0, Y, index, query_ptr, ...] exp.u32 exec.constants::get_domain_offset mul #=> [x, lde_size, depth, 0, Y, index, ...] @@ -25,62 +29,71 @@ proc compute_denominators movdn.3 #=> [lde_size, depth, 0, x, Y, index, ...] push.0 - exec.constants::tmp1 mem_loadw_be - #=> [-z0, -gz0, -gz1, -z1, x, Y, index, ...] + exec.constants::tmp1 mem_loadw_le + #=> [-z0, -z1, -gz0, -gz1, x, Y, index, ...] + # Compute denominators and place x after Y for word alignment. + # The movup.4 dup movdn.9 moves x past the Y word while keeping a copy on top. dup.4 add - #=> [x-z0, -gz0, -gz1, -z1, x, Y, index, ...] - movdn.3 - #=> [-gz0, -gz1, -z1, x-z0, x, Y, index, ...] - + #=> [x - z0, -z1, -gz0, -gz1, x, Y, index, ...] movup.4 dup movdn.9 - #=> [x, -gz0, -gz1, -z1, x-z0, Y, x, index, ...] - - add swap - #=> [-gz1, x - gz0, -z1, x-z0, Y, x, index, ...] + #=> [x, x - z0, -z1, -gz0, -gz1, Y, x, index, ...] + movup.3 add + #=> [x - gz0, x - z0, -z1, -gz1, Y, x, index, ...] + movdn.2 + #=> [x - z0, -z1, x - gz0, -gz1, Y, x, index, ...] end #! Computes the DEEP query. #! #! Input: [Z, X, Y, W, query_ptr, ...] -#! Ouput: [eval1, eval0, Y, query_ptr, ...] +#! Output: [eval0, eval1, Y, query_ptr, ...] #! #! where: #! -#! 1. X is [q_x_at_alpha_1, q_x_at_alpha_0, q_x_at_alpha_1, q_x_at_alpha_0] -#! 2. W is [q_gz_1, q_gz_0, q_z_1, q_z_0] +#! 1. X is [q_x_at_alpha_0, q_x_at_alpha_1, q_x_at_alpha_0, q_x_at_alpha_1] +#! 2. W is [q_z_0, q_z_1, q_gz_0, q_gz_1] #! -#! Cycles: 62 +#! Cycles: 54 proc divide_and_add swapw #=> [X, Z, Y, W, query_ptr, ...] dupw.3 #=> [W, X, Z, Y, query_ptr, ...] - #=> [q_gz_1, q_gz_0, q_z_1, q_z_0, q_x_at_alpha_1, q_x_at_alpha_0, q_x_at_alpha_1, q_x_at_alpha_0, Z, Y, query_ptr, ...] + #=> [q_z_0, q_z_1, q_gz_0, q_gz_1, q_x_at_alpha_0, q_x_at_alpha_1, q_x_at_alpha_0, q_x_at_alpha_1, Z, Y, query_ptr, ...] - movup.5 movup.5 - movup.5 movup.5 - #=> [q_z_1, q_z_0, q_x_at_alpha_1, q_x_at_alpha_0, p_gz_1, p_gz_0, q_x_at_alpha_1, q_x_at_alpha_0, Z, Y, query_ptr, ...] + movdn.5 movdn.5 + #=> [q_gz_0, q_gz_1, q_x_at_alpha_0, q_x_at_alpha_1, q_z_0, q_z_1, q_x_at_alpha_0, q_x_at_alpha_1, Z, Y, query_ptr, ...] ext2add - #=> [num0_1, num0_0, p_gz_1, p_gz_0, q_x_at_alpha_1, q_x_at_alpha_0, Z, Y, query_ptr, ...] + #=> [num_gz_0, num_gz_1, q_z_0, q_z_1, q_x_at_alpha_0, q_x_at_alpha_1, Z, Y, query_ptr, ...] - movdn.9 movdn.9 - #=> [p_gz_1, p_gz_0, q_x_at_alpha_1, q_x_at_alpha_0, Z, num0_1, num0_0, Y, query_ptr, ...] + swap movdn.9 movdn.8 + #=> [q_z_0, q_z_1, q_x_at_alpha_0, q_x_at_alpha_1, Z, num_gz_0, num_gz_1, Y, query_ptr, ...] ext2add - #=> [num1_1, num1_0, Z, num0_1, num0_0, Y, query_ptr, ...] + #=> [num_z_0, num_z_1, Z, num_gz_0, num_gz_1, Y, query_ptr, ...] movup.3 movup.3 ext2div - #=> [res1_1, res1_0, z0_1, z0_0, num0_1, num0_0, Y, query_ptr, ...] + #=> [res_z_0, res_z_1, gz0_0, gz0_1, num_gz_0, num_gz_1, Y, query_ptr, ...] movdn.5 movdn.5 - #=> [z0_1, z0_0, num0_1, num0_0, res1_1, res1_0, Y, query_ptr, ...] + #=> [gz0_0, gz0_1, num_gz_0, num_gz_1, res_z_0, res_z_1, Y, query_ptr, ...] ext2div - #=> [res0_1, res0_0, res1_1, res1_0, Y, query_ptr, ...] + #=> [res_gz_0, res_gz_1, res_z_0, res_z_1, Y, query_ptr, ...] + + # Multiply res_gz by challenge_points (beta) for point batching. + # DEEP formula: Q(X) = res_z + beta * res_gz + # beta is stored at deep_rand_coef_ptr (positions 0,1). + exec.constants::deep_rand_coef_ptr mem_load + exec.constants::deep_rand_coef_ptr add.1 mem_load + swap + #=> [beta0, beta1, res_gz_0, res_gz_1, res_z_0, res_z_1, Y, query_ptr, ...] + ext2mul + #=> [beta_res_gz_0, beta_res_gz_1, res_z_0, res_z_1, Y, query_ptr, ...] ext2add - # => [eval1, eval0, Y, query_ptr, ...] + # => [eval0, eval1, Y, query_ptr, ...] end #! Prepares the stack for the computation of the DEEP composition polynomial FRI queries. @@ -103,9 +116,9 @@ pub proc prepare_stack_deep_queries_computation exec.constants::get_fri_queries_address # => [query_ptr, ...] - padw exec.constants::ood_fixed_term_horner_evaluations_ptr mem_loadw_be - # => [q_gz_1, q_gz_0, q_z_1, q_z_0, query_ptr, ...] - # => [W, query_ptr, ...] where W is [q_gz_1, q_gz_0, q_z_1, q_z_0] + padw exec.constants::ood_fixed_term_horner_evaluations_ptr mem_loadw_le + # => [q_z_0, q_z_1, q_gz_0, q_gz_1, query_ptr, ...] + # => [W, query_ptr, ...] where W is [q_z_0, q_z_1, q_gz_0, q_gz_1] # Get pointer to help test for the last query to be processed exec.constants::fri_com_ptr @@ -118,25 +131,26 @@ pub proc prepare_stack_deep_queries_computation push.0.0 exec.constants::deep_rand_alpha_nd_ptr exec.constants::current_trace_row_ptr - exec.constants::tmp2 mem_storew_be + exec.constants::tmp2 mem_storew_le # Compute the negations of z and gz where z is the OOD point # We do it here as this computation is common to all queries. - exec.constants::z_ptr mem_loadw_be - # => [zN_1, zN_0, z1, z0, query_ptr, query_end_ptr, W, query_ptr, ...] + exec.constants::z_ptr mem_loadw_le + # => [zN_0, zN_1, z0, z1, query_ptr, query_end_ptr, W, query_ptr, ...] drop drop neg swap neg - # => [-z0, -z1, query_ptr, query_end_ptr, W, query_ptr, ...] - dup.1 exec.constants::get_trace_domain_generator mul - # => [-gz1, -z0, -z1, query_ptr, query_end_ptr, W, query_ptr, ...] swap - # => [-z0, -gz1, -z1, query_ptr, query_end_ptr, W, query_ptr, ...] - dup exec.constants::get_trace_domain_generator mul - # => [-gz0, -z0, -gz1, -z1, query_ptr, query_end_ptr, W, query_ptr, ...] - swap - # => [-z0, -gz0, -gz1, -z1, query_ptr, query_end_ptr, W, query_ptr, ...] + # => [-z0, -z1, query_ptr, query_end_ptr, W, query_ptr, ...] + dup + exec.constants::get_trace_domain_generator mul + # => [-gz0, -z0, -z1, query_ptr, query_end_ptr, W, query_ptr, ...] + dup.2 + exec.constants::get_trace_domain_generator mul + # => [-gz1, -gz0, -z0, -z1, query_ptr, query_end_ptr, W, query_ptr, ...] + movdn.3 movdn.2 + # => [-z0, -z1, -gz0, -gz1, query_ptr, query_end_ptr, W, query_ptr, ...] # Save to temporary location `tmp1` for later use when computing the denominators - exec.constants::tmp1 mem_storew_be + exec.constants::tmp1 mem_storew_le # => [Y, query_ptr, query_end_ptr, W, query_ptr, ...] end @@ -162,15 +176,15 @@ pub proc compute_deep_query # # Cycles: 58 exec.compute_denominators - #=> [Z, X, x, index, query_ptr, query_end_ptr, W, query_ptr, ...] where Z := [-gz1, x - gz0, -z1, x - z0] + #=> [Z, X, x, index, query_ptr, query_end_ptr, W, query_ptr, ...] # 2) Compute final result # # Cycles: 62 exec.divide_and_add - #=> [eval1, eval0, x, index, query_ptr, query_end_ptr, W, query_ptr, ...] + #=> [eval0, eval1, x, index, query_ptr, query_end_ptr, W, query_ptr, ...] - # 3) Store [poe, index, eval_1, eval_0] where poe := g^index = x / offset and prepare stack + # 3) Store [poe, index, eval0, eval1] where poe := g^index = x / offset and prepare stack # for next iteration. ## a) Compute poe @@ -178,14 +192,14 @@ pub proc compute_deep_query ## Cycles: 4 movup.3 movup.3 exec.constants::get_domain_offset_inv mul - #=> [poe, index, eval1, eval0, query_ptr, query_end_ptr, W, query_ptr, ...] + #=> [poe, index, eval0, eval1, query_ptr, query_end_ptr, W, query_ptr, ...] - ## b) Store [eval0, eval1, index, poe] + ## b) Store [poe, index, eval0, eval1] ## ## Cycles: 5 dup.4 add.4 swap.5 - mem_storew_be - #=> [poe, index, eval1, eval0, query_ptr+1, query_end_ptr, W, query_ptr, ...] + mem_storew_le + #=> [poe, index, eval0, eval1, query_ptr+4, query_end_ptr, W, query_ptr, ...] ## c) Prepare stack for next iteration ## diff --git a/crates/lib/core/asm/stark/mod.masm b/crates/lib/core/asm/stark/mod.masm index e0018c35a3..733b52ad6a 100644 --- a/crates/lib/core/asm/stark/mod.masm +++ b/crates/lib/core/asm/stark/mod.masm @@ -5,20 +5,18 @@ use miden::core::stark::verifier #! The purpose of the following verifier is to serve as a generic core around which a specific #! verifier can be built. It expects the following parameters on the stack from the caller: #! -#! 1. `[D0, D1, D2, D3]` which are respectively the digests for dynamic execution of procedures +#! 1. `[D0, D1, D2, D3, D4]` which are respectively the digests for dynamic execution of procedures #! i. `compute_deep_composition_polynomial_queries` #! ii. `execute_constraint_evaluation_check` #! iii. `process_row_ood_evaluations` #! iv. `process_public_inputs` -#! 2. `num_constraints` which is the number of constraints in the AIR -#! 3. `trace_info` which is a field element encoding the layout of the AIR -#! 4. `num_fixed_len_pi` is the number of fixed length public inputs of the AIR +#! v. `observe_aux_trace` +#! 2. Per-proof parameter: `log(trace_length)` +#! 3. `[rd0, rd1, rd2, rd3]`: RELATION_DIGEST = hash(PROTOCOL_ID, CIRCUIT_COMMITMENT), +#! a compile-time constant that binds the Fiat-Shamir transcript to the AIR instance. #! -#! In addition to the above parameters, the verifier expects the following auxiliary proof parameters: -#! -#! 1. `log(trace_length)`, the logarithm base 2 of the trace length -#! 2. `num_queries`, the number of FRI queries -#! 3. `grinding`, the number of bits of grinding i.e., proof-of-work +#! Precondition: security parameters (num_queries, query_pow_bits, deep_pow_bits, +#! folding_pow_bits) must already be stored in memory before calling this procedure. #! #! The following simplifying assumptions are currently made and hardcoded: #! @@ -29,6 +27,6 @@ use miden::core::stark::verifier #! Similarly, elements of the auxiliary trace are quadratic extension field elements. The random #! values for computing random linear combinations are also in this extension field. #! -#! Inputs: [D3, D2, D1, D0, log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi] +#! Inputs: [D0, D1, D2, D3, D4, log(trace_length), rd0, rd1, rd2, rd3] #! Outputs: [] pub use verifier::verify diff --git a/crates/lib/core/asm/stark/ood_frames.masm b/crates/lib/core/asm/stark/ood_frames.masm index 81da520020..df19d672fb 100644 --- a/crates/lib/core/asm/stark/ood_frames.masm +++ b/crates/lib/core/asm/stark/ood_frames.masm @@ -5,11 +5,11 @@ use miden::core::stark::random_coin #! #! This also computes Q^z(alpha) and Q^gz(alpha) where: #! -#! Q^z(alpha) = (q_z_0, q_z_1) = \sum_{i=0}^{n+m+l} S_i * alpha^i +#! Q^z(alpha) = (q_z_0, q_z_1) = \sum_{i=0}^{n+m+l} S_i * alpha^{n+m+l-i} #! #! and #! -#! Q^gz(alpha) = (q_gz_0, q_gz_1) = \sum_{i=0}^{n+m+l} T_i * alpha^i +#! Q^gz(alpha) = (q_gz_0, q_gz_1) = \sum_{i=0}^{n+m+l} T_i * alpha^{n+m+l-i} #! #! where: #! @@ -37,11 +37,11 @@ pub proc load_and_horner_eval_ood_frames ## Load the random challenge non-deterministically adv_push.2 - # => [alpha_1, alpha_0] + # => [alpha_0, alpha_1] # Save the random challenge - dup.1 dup.1 - exec.constants::deep_rand_alpha_nd_ptr mem_storew_be + push.0.0 movup.3 movup.3 + exec.constants::deep_rand_alpha_nd_ptr mem_storew_le # => [Y] # --- Compute Q^z(alpha) -------------------------------------------------- @@ -58,53 +58,56 @@ pub proc load_and_horner_eval_ood_frames ## 2) Process the fully aligned OOD `current` evaluations at z of the execution trace ## and constraints polynomials evaluations. - ## Note that, by the assumption on the widths of committed traces, the capacity portion - ## of the sponge state is always initialized to `[0, 0, 0, 0]`. + ## We load the random coin state and overwrite the rate with OOD blocks; capacity carries over. - ### a) Set up the hasher state - padw padw - # => [ZERO, 0, 0, 0, 0, U, Y] - movupw.3 - # => [Y, ZERO, 0, 0, 0, 0, U] + ### a) Load the random coin state as the initial sponge state. + push.0 exec.constants::random_coin_output_len_ptr mem_store + push.0 exec.constants::random_coin_input_len_ptr mem_store + exec.random_coin::load_random_coin_state + # => [R0, R1, C, ood_frame_ptr, alpha_ptr, 0, 0] ### b) Process the `current` OOD evaluations exec.process_row_ood_evaluations - # => [Y, Y, C, ood_frame_ptr, alpha_ptr, acc1, acc0] + # => [Y, Y, C, ood_frame_ptr, alpha_ptr, acc0, acc1] ### c) Save -Q^z(alpha) swapw.3 - # => [ood_frame_ptr, alpha_ptr, acc1, acc0, Y, C, Y] + # => [ood_frame_ptr, alpha_ptr, acc0, acc1, Y, C, Y] movup.3 neg movup.3 neg push.0.0 - exec.constants::ood_fixed_term_horner_evaluations_ptr mem_storew_be - # => [0, 0, -acc1, -acc0, ood_frame_ptr, alpha_ptr, Y, C, Y] + movup.2 + movup.3 + swap.1 + exec.constants::ood_fixed_term_horner_evaluations_ptr mem_storew_le + dropw + push.0.0 + movdn.3 + movdn.3 + # => [ood_frame_ptr, alpha_ptr, 0, 0, Y, C, Y] # --- Compute Q^gz(alpha) ------------------------------------------------- - # Reset the Horner accumulator - movdn.5 movdn.5 drop drop - # => [ood_frame_ptr, alpha_ptr, 0, 0, Y, C, Y] - # Load the `next` trace polynomials OOD evaluations. swapw.3 # => [Y, Y, C, ood_frame_ptr, alpha_ptr, 0, 0] exec.process_row_ood_evaluations - # => [Y, D, C, ood_frame_ptr, alpha_ptr, acc1, acc0] + # => [R0, R1, C, ood_frame_ptr, alpha_ptr, acc0, acc1] - # Reseed with the digest of the OOD evaluations - swapw - exec.random_coin::reseed - # => [Y, C, ood_frame_ptr, alpha_ptr, acc1, acc0] + # Update the random coin state with the OOD stream digest. + exec.random_coin::store_random_coin_state + push.0 exec.constants::random_coin_input_len_ptr mem_store + push.8 exec.constants::random_coin_output_len_ptr mem_store + # => [ood_frame_ptr, alpha_ptr, acc0, acc1] - # Negate Q^z(alpha) and save it - dropw dropw drop drop - # => [acc1, acc0] - neg - exec.constants::ood_fixed_term_horner_evaluations_ptr add.3 mem_store - # => [acc0] + # Negate Q^gz(alpha) and save it + drop drop + # => [acc0, acc1] neg exec.constants::ood_fixed_term_horner_evaluations_ptr add.2 mem_store + # => [acc1] + neg + exec.constants::ood_fixed_term_horner_evaluations_ptr add.3 mem_store # => [] end @@ -115,8 +118,8 @@ end #! into the hasher state and simultaneously computing a random linear combination using Horner #! evaluation. #! -#! Inputs: [R2, R1, C, ptr, acc1, acc0] -#! Outputs: [R2, R1, C, ptr, acc1`, acc0`] +#! Inputs: [R0, R1, C, ptr, acc0, acc1] +#! Outputs: [R0, R1, C, ptr, acc0`, acc1`] proc process_row_ood_evaluations exec.constants::get_procedure_digest_process_row_ood_evaluations_ptr dynexec end diff --git a/crates/lib/core/asm/stark/public_inputs.masm b/crates/lib/core/asm/stark/public_inputs.masm index fb8c2468d8..26453d784e 100644 --- a/crates/lib/core/asm/stark/public_inputs.masm +++ b/crates/lib/core/asm/stark/public_inputs.masm @@ -2,72 +2,82 @@ use miden::core::stark::constants #! Processes the public inputs. #! +#! This is a generic dispatch procedure that calls the instance-specific implementation +#! via `dynexec`. The instance-specific implementation loads fixed-length and variable-length +#! public inputs from the advice stack, reduces the variable-length inputs using auxiliary +#! randomness, and stores everything into the ACE READ section. +#! #! This involves: #! #! 1. Loading from the advice stack the fixed-length public inputs and storing them in memory -#! starting from the address pointed to by `public_inputs_address_ptr`. +#! starting from the address pointed to by `public_inputs_address_ptr`. #! 2. Loading from the advice stack the variable-length public inputs, storing them temporarily -#! in memory, and then reducing them to an element in the challenge field using the auxiliary -#! randomness. This reduced value is then used to impose a boundary condition on the relevant -#! auxiliary column. -#! -#! Note that the fixed length public inputs are stored as extension field elements while -#! the variable length ones are stored as base field elements. -#! Note also that, while loading the above, we compute the hash of the public inputs. The hashing -#! starts with capacity registers of the hash function set to `C` that is the result of hashing -#! the proof context. +#! in memory, and then reducing them to an element in the challenge field using the auxiliary +#! randomness. This reduced value is then used to impose boundary conditions on the relevant +#! auxiliary columns. #! -#! The output D, that is the digest of the above hashing, is then used in order to reseed -#! the random coin. +#! Note that the fixed-length public inputs are stored as extension field elements while +#! the variable-length ones are stored as base field elements, because the ACE circuit operates +#! only on extension field elements and the latter inputs are not direct inputs to the circuit, +#! i.e., only their reduced values are. +#! Both fixed-length and variable-length public inputs are absorbed into the Fiat-Shamir +#! transcript via direct sponge absorption during loading. #! #! It is worth noting that: #! -#! 1. Only the fixed-length public inputs are stored for the lifetime of the verification procedure. -#! The variable-length public inputs are stored temporarily, as this simplifies the task of -#! reducing them using the auxiliary randomness. On the other hand, the resulting values from -#! the aforementioned reductions are stored right after the fixed-length public inputs. These -#! are stored in a word-aligned manner and padded with zeros if needed. -#! 2. The public inputs address is computed in such a way so as we end up with the following -#! memory layout: +#! 1. Only the fixed-length public inputs are stored for the lifetime of the verification +#! procedure. The variable-length public inputs are stored temporarily, as this simplifies +#! the task of reducing them using the auxiliary randomness. The resulting values from the +#! reductions are stored right after the fixed-length public inputs, in a word-aligned +#! manner and padded with zeros if needed. +#! 2. The public inputs address is computed so that we end up with the following memory layout: #! -#! [..., a_0...a_{m-1}, b_0...b_{n-1}, alpha0, alpha1, beta0, beta1, OOD-evaluations-start, ...] +#! [..., a_0..a_{m-1}, b_0..b_{n-1}, beta0, beta1, alpha0, alpha1, OOD-start, ...] #! #! where: #! -#! 1. [a_0...a_{m-1}] are the fixed-length public inputs stored as extension field elements. This -#! section is double-word-aligned. -#! 2. [b_0...b_{n-1}] are the results of reducing the variable length public inputs using +#! a) [a_0..a_{m-1}] are the fixed-length public inputs stored as extension field elements. +#! This section is double-word-aligned. +#! b) [b_0..b_{n-1}] are the results of reducing the variable-length public inputs using #! auxiliary randomness. This section is word-aligned. -#! 3. [alpha0, alpha1, beta0, beta1] is the auxiliary randomness. -#! 4. `OOD-evaluations-start` is the first field element of the section containing the OOD -#! evaluations. -#! 3. Note that for each bus message in a group in the variable length public inputs, each -#! message is expected to be padded to the next multiple of 8 and provided in reverse order. -#! This has the benefit of making the reduction using the auxiliary randomness more efficient -#! using `horner_eval_base`. -#! +#! c) [beta0, beta1, alpha0, alpha1] is the auxiliary randomness. +#! d) OOD-start is the first field element of the section containing the OOD evaluations. +#! 3. For each bus message in a group in the variable-length public inputs, each message is +#! expected to be padded to the next multiple of 8 and provided in reverse order. This has +#! the benefit of making the reduction using the auxiliary randomness more efficient using +#! `horner_eval_base`. #! -#! Input: [C, ...] +#! Input: [...] #! Output: [...] proc process_public_inputs exec.constants::get_procedure_digest_process_public_inputs_ptr dynexec end -#! Computes the address where the public inputs are to be stored and returns it. +#! Computes the addresses where the public inputs are to be stored. +#! +#! In order to call `eval_circuit`, we need to lay out the inputs to the constraint evaluation +#! circuit in a contiguous region of memory (called READ section in the ACE chiplet documentation) +#! right before the region storing the circuit description (called EVAL section). #! -#! In order to be able to call `eval_circuit`, we need to layout the inputs to -#! the constraint evaluation circuit in a contiguous region of memory (called `READ` section -#! in the ACE chiplet documentation) right before the region of memory storing the circuit -#! description (called `EVAL` section in the ACE chiplet documentation). #! As the number of public inputs is a per-instance parameter, while the sizes of the OOD -#! evaluation frames and the number of auxiliary random values are fixed, we can lay out -#! the public inputs right before the auxiliary random values and OOD evaluations. -#! Hence the address where public inputs are stored is computed using a negative offset -#! from the address where the OOD are stored. -#! We compute two pointers, one to the public inputs and the other is for the portion -#! within the public inputs region storing the variable length public inputs. This will be -#! the region storing, temporarily, the variable length public inputs that are to be reduced -#! by the auxiliary randomness and, permanently, the results of the aforementioned reductions. +#! evaluation frames and the number of auxiliary random values are fixed, we lay out the public +#! inputs right before the auxiliary random values and OOD evaluations. +#! Hence the address where public inputs are stored is computed using a negative offset from the +#! address where the OOD evaluations are stored. +#! +#! We compute two pointers: +#! var_len_ptr = OOD_EVALUATIONS_PTR - 4 - num_var_len_pi_groups * 4 +#! pi_ptr = var_len_ptr - num_fixed_len_pi * 2 +#! +#! The `* 4` for VLPI groups provides word-alignment (each group uses 4 base felts = 2 EF +#! slots, even though the reduced value is only 1 EF). The `* 2` for FLPI converts the base +#! felt count to EF slots (each base felt is stored as [val, 0]). +#! +#! The `-4` accounts for the auxiliary randomness word [beta0, beta1, alpha0, alpha1] at +#! AUX_RAND_ELEM_PTR (4 base felts between var_len_ptr and OOD_EVALUATIONS_PTR). +#! +#! The var_len_ptr is the region that will temporarily store the variable-length public inputs +#! and permanently store the results of reducing them by the auxiliary randomness. #! #! Input: [num_var_len_pi_groups, num_fixed_len_pi, ...] #! Output: [...] @@ -78,11 +88,10 @@ proc compute_and_store_public_inputs_address # 2) Compute the pointer to the reductions of the variable length public inputs # - # We need to account for the number of variable-length - # public inputs groups. For each group we allocate 2 slots and we pad with zeros so that - # things are word aligned. As of now, we only have one group. - # We also need to account for the auxiliary randomness i.e., 4 base field elements. - sub.4 # 2 auxiliary random values + # We need to account for the number of variable-length public inputs groups. + # For each group we allocate a word (4 base elements = 2 EF slots) for word-alignment. + # We also need to account for the auxiliary randomness (4 base elements for alpha/beta). + sub.4 swap mul.4 sub # subtract number of variable length public input groups, with padding for word-alignment # => [res_var_len_pi_reductions_ptr, num_fixed_len_pi, ...] @@ -101,66 +110,76 @@ proc compute_and_store_public_inputs_address exec.constants::variable_length_public_inputs_address_ptr mem_store end -#! Loads 8 base field elements from the advice stack and saves them as extension field elements. +#! Loads 8 base field elements from the advice stack, stores them as extension field elements +#! in memory, and returns the original base element words in the rate positions for absorption +#! by the caller via `poseidon2::permute`. #! +#! The procedure does NOT absorb the elements into the transcript -- the caller is responsible +#! for calling `poseidon2::permute` after this procedure to complete the absorption. #! #! Input: [Y, Y, C, ptr, ...] -#! Output: [A1, A0, C, ptr + 16, ..] +#! Output: [A0, A1, C, ptr + 16, ..] +#! +#! where A0 and A1 are the original base element words (from advice), positioned in the rate +#! slots so that a subsequent `poseidon2::permute` absorbs them into the sponge state. proc load_base_store_extension_double_word # 1) Load the first 4 base elements from the advice stack and save them temporarily adv_loadw - exec.constants::tmp1 mem_storew_be + exec.constants::tmp1 mem_storew_le # 2) Represent the first 4 base field elements as elements in the quadratic extension field swapw exec.constants::zeroize_stack_word # => [0, 0, 0, 0, a3, a2, a1, a0, C, ptr, ...] - movdn.6 - # => [0, 0, 0, a3, a2, a1, 0, a0, C, ptr, ...] - movdn.4 - # => [0, 0, a3, a2, 0, a1, 0, a0, C, ptr, ...] - movdn.2 - # => [0, a3, 0, a2, 0, a1, 0, a0, C, ptr, ...] + movdn.7 + # => [0, 0, 0, a3, a2, a1, a0, 0, C, ptr, ...] + movdn.5 + # => [0, 0, a3, a2, a1, 0, a0, 0, C, ptr, ...] + movdn.3 + # => [0, a3, a2, 0, a1, 0, a0, 0, C, ptr, ...] + swap + # => [a3, 0, a2, 0, a1, 0, a0, 0, C, ptr, ...] # 3) Save the first 2 extension field elements - swapw dup.12 - mem_storew_be + mem_storew_le # 4) Load the second 4 base elements from the advice stack and save them temporarily adv_loadw - exec.constants::tmp2 mem_storew_be + exec.constants::tmp2 mem_storew_le swapw - # => [0, a3, 0, a2, a7, a6, a5, a4, C, ptr, ...] + # => [a3, 0, a2, 0, a7, a6, a5, a4, C, ptr, ...] # 5) Save the second 2 extension field elements dup.12 add.4 - mem_storew_be + mem_storew_le # 6) Represent the second 4 base field elements as elements in the quadratic extension field exec.constants::zeroize_stack_word # => [0, 0, 0, 0, a7, a6, a5, a4, C, ptr, ...] - movdn.6 - movdn.4 - movdn.2 - # => [0, a7, 0, a6, 0, a5, 0, a4, C, ptr, ...] + movdn.7 + movdn.5 + movdn.3 + swap + # => [a7, 0, a6, 0, a5, 0, a4, 0, C, ptr, ...] # 7) Save the third 2 extension field elements - # We also load the first 4 base elements as a word for use by `poseidon2::permute` - swapw + # We also load the second 4 base elements into the R2 rate position. dup.12 add.8 - mem_storew_be - exec.constants::tmp1 mem_loadw_be + mem_storew_le + exec.constants::tmp2 mem_loadw_le swapw # 8) Save the fourth 2 extension field elements - # We also load the second 4 base elements as a word for use by `poseidon2::permute` and update the pointer + # We also load the first 4 base elements into the R1 rate position and update the pointer. + # This ordering (first word on top = R1, second word below = R2) matches the Rust + # challenger's absorption order: first 4 elements -> rate[0..3], next 4 -> rate[4..7]. dup.12 add.16 swap.13 add.12 - mem_storew_be - exec.constants::tmp2 mem_loadw_be - # => [a7, a6, a5, a4, a3, a2, a1, a0, C, ptr, ...] + mem_storew_le + exec.constants::tmp1 mem_loadw_le + # => [a3, a2, a1, a0, a7, a6, a5, a4, C, ptr + 16, ...] end diff --git a/crates/lib/core/asm/stark/random_coin.masm b/crates/lib/core/asm/stark/random_coin.masm index 0b8d736c02..1faa4519f3 100644 --- a/crates/lib/core/asm/stark/random_coin.masm +++ b/crates/lib/core/asm/stark/random_coin.masm @@ -1,48 +1,25 @@ -#! Disclaimer: most of the procedures in this file assume that the input pointers are word-aligned. +#! Random coin for the STARK verifier, built on a Poseidon2 sponge. +#! +#! The sponge state is stored in memory as three words: rate R1 (r1_ptr), rate R2 (r2_ptr), +#! and capacity C (c_ptr). R1 and R2 are contiguous (r2_ptr = r1_ptr + 4), so rate elements +#! 0..7 can be addressed as r1_ptr + index. +#! +#! Sampling uses an output_len counter that tracks how many rate elements remain. Each +#! permutation sets output_len=8; each sample_felt decrements it by 1 and reads +#! rate[output_len - 1]. Absorption (reseed_direct, reseed_with_felt, etc.) writes directly +#! to rate memory and permutes, bypassing any input buffer. use miden::core::crypto::hashes::poseidon2 use miden::core::stark::constants use miden::core::stark::utils - -#! Helper procedure to compute addition of two words component-wise. -#! Input: [b3, b2, b1, b0, a3, a2, a1, a0] -#! Output: [c3, c2, c1, c0] -#! -#! Cycles: 16 -proc add_two_words - movup.3 - movup.7 - add - #=> [c0, b3, b2, b1, a3, a2, a1] - - movup.3 - movup.6 - add - #=> [c1, c0, b3, b2, a3, a2] - - movup.3 - movup.5 - add - #=> [c2, c1, c0, b3, a3] - - movup.3 - movup.4 - add - #=> [c3, c2, c1, c0] -end - -#! Return the first half of the rate portion of the random coin state -#! -#! The random coin uses Poseidon2 to generate data. The Poseidon2 state is composed of 3 -#! words, 2 words for the rate, and 1 word for the capacity. This procedure -#! returns the first word of the Poseidon2 state. +#! Return the first half of the rate portion of the random coin state. #! #! Input: [...] #! Output: [R1, ...] #! Cycles: 6 pub proc get_rate_1 - padw exec.constants::r1_ptr mem_loadw_be + padw exec.constants::r1_ptr mem_loadw_le end #! Store the first half of the rate portion of the random coin state. @@ -51,20 +28,16 @@ end #! Output: [...] #! Cycles: 6 pub proc set_rate_1 - exec.constants::r1_ptr mem_storew_be dropw + exec.constants::r1_ptr mem_storew_le dropw end -#! Return the second half of the rate portion of the random coin state -#! -#! The random coin uses Poseidon2 to generate data. The Poseidon2 state is composed of 3 -#! words, 2 words for the rate, and 1 word for the capacity. This procedure -#! returns the first word of the Poseidon2 state. +#! Return the second half of the rate portion of the random coin state. #! #! Input: [...] #! Output: [R2, ...] #! Cycles: 6 pub proc get_rate_2 - padw exec.constants::r2_ptr mem_loadw_be + padw exec.constants::r2_ptr mem_loadw_le end #! Store the second half of the rate portion of the random coin state. @@ -73,20 +46,16 @@ end #! Output: [...] #! Cycles: 6 pub proc set_rate_2 - exec.constants::r2_ptr mem_storew_be dropw + exec.constants::r2_ptr mem_storew_le dropw end -#! Return the capacity portion of the random coin state -#! -#! The random coin uses Poseidon2 to generate data. The Poseidon2 state is composed of 3 -#! words, 2 words for the rate, and 1 word for the capacity. This procedure -#! returns the first word of the Poseidon2 state. +#! Return the capacity portion of the random coin state. #! #! Input: [...] #! Output: [C, ...] #! Cycles: 6 pub proc get_capacity - padw exec.constants::c_ptr mem_loadw_be + padw exec.constants::c_ptr mem_loadw_le end #! Set the capacity portion of the random coin state. @@ -95,205 +64,368 @@ end #! Output: [...] #! Cycles: 6 pub proc set_capacity - exec.constants::c_ptr mem_storew_be dropw + exec.constants::c_ptr mem_storew_le dropw end #! Load the random coin state on the stack. #! #! Input: [...] -#! Output: [R2, R1, C, ...] +#! Output: [R0, R1, C, ...] #! Cycles: 18 pub proc load_random_coin_state exec.get_capacity - exec.get_rate_1 exec.get_rate_2 + exec.get_rate_1 end #! Store the random coin state to memory. #! -#! Input: [R2, R1, C, ...] +#! Input: [R0, R1, C, ...] #! Output: [...] #! Cycles: 18 pub proc store_random_coin_state - exec.set_rate_2 exec.set_rate_1 + exec.set_rate_2 exec.set_capacity end -#! Initializes the seed for randomness generation by computing the hash of the proof context using -#! the trace length, number of queries, the number of bits of grinding. -#! Currently, this part, as well as the rest of the STARK verifier assumes a blowup factor -#! equal to 8. -#! The ouput of this procedure is the capacity portion of the state after applying `poseidon2::permute`. +#! Sample a single base field element from the transcript. #! -#! Input: [log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] -#! Output: [C, ...] -#! Cycles: 210 +#! SAFETY: Requires output_len > 0. All call sites in the recursive verifier guarantee this +#! invariant because every sponge permutation sets output_len=8 and at most 8 elements are +#! consumed before the next permutation. An assertion guards against caller bugs. +#! +#! Input: [...] +#! Output: [x, ...] +pub proc sample_felt + exec.constants::random_coin_output_len_ptr mem_load + dup push.0 neq assert.err="sample_felt: output buffer is empty" + sub.1 + dup exec.constants::random_coin_output_len_ptr mem_store + + exec.constants::r1_ptr add mem_load +end + +#! Sample a quadratic extension field element from the transcript. +#! +#! Input: [...] +#! Output: [x0, x1, ...] +pub proc sample_ext + exec.sample_felt + exec.sample_felt + swap +end + +#! Sample a number of bits from the transcript. +#! +#! Input: [bits, ...] +#! Output: [value, ...] +pub proc sample_bits + dup + pow2 + u32assert u32overflowing_sub.1 assertz + # => [mask, bits, ...] + + exec.sample_felt + u32split + swap + drop + # => [lo, mask, bits, ...] + u32and + swap + drop +end + +#! Initializes the random coin state with domain-separated Fiat-Shamir (DSFS) seeding, +#! then derives trace domain parameters. +#! +#! Implements a two-phase transcript initialization: +#! +#! Phase 1 (INSTANCE_SEED -- compile-time constant per AIR): +#! Use the caller-supplied RELATION_DIGEST as initial sponge capacity, +#! absorb PCS parameters into the rate, and permute. +#! Rate layout: R1 = [nq, query_pow_bits, deep_pow_bits, folding_pow_bits] +#! R2 = [log_blowup, log_final_degree, fold_arity, 0] +#! The resulting capacity is the INSTANCE_SEED. +#! +#! Phase 2 (PROOF_SEED -- per-proof): +#! Use INSTANCE_SEED as capacity, absorb log(trace_length) into rate[0] +#! (with rate[1..7] = 0), and permute. +#! The resulting capacity is the PROOF_SEED. +#! +#! The challenger starts with capacity = PROOF_SEED, rate zeroed. +#! +#! RELATION_DIGEST = hash(PROTOCOL_ID, CIRCUIT_COMMITMENT) is a compile-time constant +#! computed once per AIR and pushed by the caller (the specific verifier). +#! +#! Currently assumes a blowup factor equal to 8. +#! +#! Precondition: num_queries, query_pow_bits, deep_pow_bits, and folding_pow_bits must +#! already be stored in memory before calling this procedure. +#! +#! Input: [log(trace_length), rd0, rd1, rd2, rd3, ...] +#! Output: [...] pub proc init_seed - # Save the parameters in memory for later use + # Save log(trace_length) in memory for later use. dup exec.constants::set_trace_length_log - dup.1 exec.constants::set_number_queries - dup.2 exec.constants::set_grinding_factor - # Pre-load constants used by poseidon2::permute into memory and initialize the state of the random coin to zeros. - # Since memory beyond 3 * 2^30 does not have any special meaning, we can use the memory region - # starting from address 2^32 - 1 in decreasing order to hold constants that are used throughout - # the `verify` procedure. + # Initialize the zero word and buffers to zero. + padw + exec.constants::zero_word_ptr mem_storew_le + dropw + push.0 exec.constants::random_coin_input_len_ptr mem_store + push.0 exec.constants::random_coin_output_len_ptr mem_store + #=> [log(tl), rd0, rd1, rd2, rd3, ...] + + # ---- Phase 1: RELATION_DIGEST + PCS_PARAMS -> INSTANCE_SEED ---- + + # Build the sponge state [R1, R2, C] for hperm: + # R1 = [nq, query_pow_bits, deep_pow_bits, folding_pow_bits] + # R2 = [log_blowup, log_final_degree, fold_arity, 0] + # C = [rd0, rd1, rd2, rd3] (RELATION_DIGEST) + # + # Drop log(tl) from the stack (saved in memory, not part of Phase 1 rate). + + drop + #=> [rd0, rd1, rd2, rd3, ...] + + # Build R1 from security parameters stored in memory. + exec.constants::get_folding_pow_bits + exec.constants::get_deep_pow_bits + exec.constants::get_query_pow_bits + exec.constants::get_number_queries + #=> [nq, query_pow, deep_pow, folding_pow, rd0, rd1, rd2, rd3, ...] + # ^-- R1 ^-- C (digest) + + # Build R2 = [log_blowup, log_final_degree, fold_arity, 0] + push.0 + exec.constants::get_fri_fold_arity + exec.constants::get_log_final_degree + exec.constants::get_blowup_factor_log + #=> [log_blowup, log_final_deg, fold_arity, 0, nq, query_pow, deep_pow, folding_pow, rd0, rd1, rd2, rd3, ...] + # ^-- R2 ^-- R1 ^-- C + + swapw + #=> [nq, query_pow, deep_pow, folding_pow, log_blowup, log_final_deg, fold_arity, 0, rd0, rd1, rd2, rd3, ...] + # ^-- R1 ^-- R2 ^-- C + + # Permute: capacity now holds INSTANCE_SEED. + exec.poseidon2::permute + #=> [R1', R2', C', ...] + + # Discard the permuted rate words, keep INSTANCE_SEED (capacity) on the stack. + dropw dropw + #=> [C0, C1, C2, C3, ...] (INSTANCE_SEED) + + # ---- Phase 2: INSTANCE_SEED + log(tl) -> PROOF_SEED ---- + + # Build R2 = [0, 0, 0, 0] on top of capacity. padw - exec.constants::zero_word_ptr mem_storew_be - exec.constants::c_ptr mem_storew_be - exec.constants::r1_ptr mem_storew_be - exec.constants::r2_ptr mem_storew_be + #=> [0, 0, 0, 0, C0, C1, C2, C3, ...] + # ^-- R2 ^-- C (INSTANCE_SEED) + + # Build R1 = [lth, 0, 0, 0] on top. + push.0.0.0 + exec.constants::get_trace_length_log + #=> [lth, 0, 0, 0, 0, 0, 0, 0, C0, C1, C2, C3, ...] + # ^-- R1 ^-- R2 ^-- C (INSTANCE_SEED) + + exec.poseidon2::permute + #=> [R1', R2', C', ...] + + # Store PROOF_SEED state to memory (capacity = PROOF_SEED, rate = permuted). + exec.store_random_coin_state + #=> [...] + + # Zero the rate in memory. Capacity = PROOF_SEED is now stored. + padw + exec.constants::r1_ptr mem_storew_le + exec.constants::r2_ptr mem_storew_le dropw - #=> [log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + #=> [...] - # Create the initial seed for randomness generation from proof context + # ---- Derive trace domain parameters ---- + # + # Reload log(trace_length) from memory (it was saved earlier) and derive + # trace_length, LDE domain size, LDE generator, and trace generator. - ## Compute trace_length + exec.constants::get_trace_length_log + #=> [log(trace_length), ...] + + ## Compute trace_length = 2^log(trace_length) dup pow2 - dup - u32test - assert.err="range check failed: trace length" - #=> [trace_length, log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + u32test assert.err="trace length overflows u32" + #=> [trace_length, log(trace_length), ...] - ## Save the trace length and its log to memory - dup.0 exec.constants::set_trace_length - #=> [trace_length, log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + ## Save the trace length to memory + dup exec.constants::set_trace_length + #=> [trace_length, log(trace_length), ...] ## Compute log size of LDE domain swap exec.constants::get_blowup_factor_log add - #=> [log(lde_size), trace_length, num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + #=> [log(lde_size), trace_length, ...] ## Compute size of LDE domain dup pow2 - #=> [lde_size, log(lde_size), trace_length, num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + #=> [lde_size, log(lde_size), trace_length, ...] # Compute lde_domain generator dup.1 exec.utils::compute_lde_generator movdn.2 - #=> [lde_size, log(lde_size), lde_g, trace_length, num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + #=> [lde_size, log(lde_size), lde_g, trace_length, ...] push.0 movdn.3 - #=> [lde_size, log(lde_size), lde_g, 0, trace_length, num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + #=> [lde_size, log(lde_size), lde_g, 0, trace_length, ...] # Save `[0, lde_g, log(lde_size), lde_size]` exec.constants::set_lde_domain_info_word - #=> [lde_size, log(lde_size), lde_g, 0, trace_length, num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + #=> [lde_size, log(lde_size), lde_g, 0, trace_length, ...] # clean stack drop drop - #=> [lde_g, 0, trace_length, num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + #=> [lde_g, 0, trace_length, ...] # Compute trace generator `trace_g` = `lde_g^blowup_factor` repeat.3 dup mul end - #=> [trace_g, 0, trace_length, num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + #=> [trace_g, 0, trace_length, ...] # Save `trace_g` to memory exec.constants::set_trace_domain_generator - #=> [0, trace_length, num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] + #=> [0, trace_length, ...] - # clean stack - drop - #=> [trace_length, num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...] - - # Construct the proof context - exec.build_proof_context - # => [num_queries, grinding, proof_options, num_constraints, modulus1, modulus0, trace_length, trace_info, num_fixed_len_pi, ...] - - # We get the number of the variable length public inputs section non-deterministically so that - # we can initialize the capacity portion of the sponge state. The total number of public inputs - # is easily derived using an addition. - movup.8 - # => [num_fixed_len_pi, num_queries, grinding, proof_options, num_constraints, modulus1, modulus0, trace_length, trace_info, ...] - adv_push.1 add - dup exec.constants::num_public_inputs_ptr mem_store - u32divmod.8 - # => [rem, quo, num_queries, grinding, proof_options, num_constraints, modulus1, modulus0, trace_length, trace_info, ...] - - # Hash proof context - swap drop - push.0.0.0 - movdnw.2 - # => [B, A, 0, 0, 0, c, ...] + # Clean up the stack. + drop drop +end + +#! Reseed with a commitment word and absorb an additional single felt, then permute. +#! +#! Writes the commitment word to rate[0..3] and the felt to rate[4], leaving rate[5..7] +#! unchanged from the previous permutation, then permutes. Used in the FRI layer loop +#! where each round absorbs a layer commitment plus a PoW nonce felt. +#! +#! SAFETY: +#! 1. input_len=0 (asserted). +#! 2. On exit: input_len=0, output_len=8 (fresh permutation output). +#! +#! Input: [felt, w0, w1, w2, w3, ...] +#! Output: [...] +pub proc reseed_with_felt + # Assert input buffer is empty. + exec.constants::random_coin_input_len_ptr mem_load + assertz.err="reseed_with_felt: input buffer must be empty" + + # Write the felt to rate[4] (= r2_ptr position 0), since we can only modify one + # element of R2 and need the rest from memory. + exec.constants::r2_ptr mem_store + # => [w0, w1, w2, w3, ...] + + # Build sponge state [R1, R2, C] on the stack directly. + # R1 = commitment word (already on the stack). + # R2 and C are loaded from memory. + exec.get_capacity + exec.get_rate_2 + # => [R2, C, R1, ...] + movupw.2 + # => [R1, R2, C, ...] exec.poseidon2::permute - dropw - dropw - # => [C, ...] + exec.store_random_coin_state + + # Mark output buffer as full. + push.8 exec.constants::random_coin_output_len_ptr mem_store end -#! Builds the proof context. +#! Reseed by writing a word directly to rate[0..3] and permuting. +#! +#! Overwrites rate[0..3] with the given word, leaves rate[4..7] unchanged from the +#! previous permutation, then permutes. This is the standard overwrite-and-permute +#! absorption pattern for a single word. #! -#! Input: [trace_length, num_queries, grinding, num_constraints, trace_info, ...] -#! Output: [num_queries, grinding, proof_options, num_constraints, modulus1, modulus0, trace_length, trace_info, ...] -proc build_proof_context - ## trace layout info, which is the concatenation as u8-s of: - ## 1. main segment width - ## 2. num auxiliary segments, which always 1 - ## 3. auxiliary segment width - ## 4. number of auxiliary random values - ## 5. trace length (this is already on the stack) +#! SAFETY: +#! 1. input_len=0 (asserted). +#! 2. The word to absorb is on top of the stack. +#! 3. On exit: input_len=0, output_len=8 (fresh permutation output). +#! +#! Input: [w0, w1, w2, w3, ...] +#! Output: [...] +pub proc reseed_direct + # Assert input buffer is empty. + exec.constants::random_coin_input_len_ptr mem_load + assertz.err="reseed_direct: input buffer must be empty" - movup.4 - swap - ## field modulus bytes (2 field elements) - push.0x01 # lower half of the modulus - push.0xffffffff # upper half of the modulus - ## field extension and FRI parameters - ## field extension degree || FRI folding factor || FRI remainder polynomial max degree || blowup factor - push.0x02047f08 - # => [proof_options, modulus1, modulus0, trace_length, trace_info, num_queries, grinding, num_constraints, ...] - movup.6 - movup.6 - # => [num_queries, grinding, proof_options, modulus1, modulus0, trace_length, trace_info, num_constraints, ...] - - movup.7 - movdn.3 - # => [num_queries, grinding, proof_options, num_constraints, modulus1, modulus0, trace_length, trace_info, ...] + # Write the word to rate[0..3] and consume it from the stack. + exec.set_rate_1 + + # Permute (rate[4..7] and capacity from memory are unchanged). + exec.load_random_coin_state + exec.poseidon2::permute + exec.store_random_coin_state + + # Fresh output available. + push.8 exec.constants::random_coin_output_len_ptr mem_store end -#! Reseed the random coin with `DATA` +#! Verify per-round FRI folding proof-of-work and sample one extension field element, +#! reading rate elements directly instead of going through `sample_felt`. #! -#! Input: [DATA, ...] -#! Ouput: [...] -#! Cycles: 54 -pub proc reseed - # Load previous state and update it - # -------------------------------------------------------------------------------------------- - exec.get_rate_1 - # => [R1, DATA, ...] (6 cycles) +#! Reads rate[7] (grinding), rate[6] and rate[5] (ext element) from r2_ptr memory, +#! matching what `sample_felt` would return at output_len=8,7,6. +#! +#! The folding PoW bit count is read from memory (set by load_security_params). +#! When folding_pow_bits=0 the check is trivially satisfied (mask=0). +#! +#! Equivalent to: `get_folding_pow_bits sample_bits assertz; sample_ext` +#! +#! SAFETY: +#! 1. MUST be called immediately after `reseed_with_felt` with no intervening +#! random coin operations (output_len=8, input_len=0 guaranteed). +#! 2. Sets output_len=5 on exit (3 elements consumed), input_len=0 unchanged. +#! 3. folding_pow_bits must already be stored in memory. +#! +#! Input: [...] +#! Output: [a0, a1, ...] +pub proc sample_folding_pow_and_ext + # Assert precondition: input buffer must be empty. + exec.constants::random_coin_input_len_ptr mem_load + assertz.err="sample_folding_pow_and_ext: input buffer must be empty" - exec.add_two_words - # => [R1, ...] (16 cycles) + exec.constants::r2_ptr + # => [r2, ...] - exec.get_capacity - swapw - exec.get_rate_2 - # => [R2, R1, C, ...] (13 cycles) + # Grinding check: read rate[7], extract low 32 bits, mask with 2^folding_pow_bits - 1. + dup add.3 mem_load + u32split swap drop + # => [lo, r2, ...] - exec.poseidon2::permute - # => [R2', R1', C`, ...] (1 cycles) + exec.constants::get_folding_pow_bits + pow2 + u32assert u32overflowing_sub.1 assertz + # => [mask, lo, r2, ...] - # Save the new state to memory - # -------------------------------------------------------------------------------------------- - exec.constants::r2_ptr mem_storew_be - dropw - exec.constants::r1_ptr mem_storew_be - dropw - exec.constants::c_ptr mem_storew_be - dropw - # => [...] (18 cycles) -end + u32and + assertz.err="per-round FRI folding grinding check failed" + # => [r2, ...] + + # Ext element: read rate[6] (first sampled) and rate[5] (second sampled) + # sample_ext does: sample_felt -> rate[6], sample_felt -> rate[5], swap -> [rate[6], rate[5]] + dup add.2 mem_load + swap add.1 mem_load + # => [rate[5], rate[6], ...] -- but sample_ext swaps, so final is [rate[6], rate[5]] + swap + # => [rate[6], rate[5], ...] = [a0, a1, ...] + # Update output_len to 5 (consumed rate[7], rate[6], rate[5]) + push.5 exec.constants::random_coin_output_len_ptr mem_store +end # COEFFICIENT GENERATION # ============================================================================================= @@ -305,39 +437,53 @@ end #! has the form `h(m) = alpha + \sum_{i=0}^{|m| - 1} m_i * beta^i` for a message `m`. #! #! As these random challenges have already been used non-deterministically in prior computations, we -#! also check that the generated challenges matche the non-deterministically provided one. +#! also check that the generated challenges match the non-deterministically provided one. #! #! Input: [...] #! Output: [...] #! Cycles: 20 pub proc generate_aux_randomness - padw exec.constants::r1_ptr mem_loadw_be - exec.constants::aux_rand_elem_ptr mem_storew_be - #=> [beta1, beta0, alpha1, alpha0, ...] - padw exec.constants::aux_rand_nd_ptr mem_loadw_be - # => [alpha1, alpha0, beta1, beta0, beta1, beta0, alpha1, alpha0, ...] + exec.sample_ext + exec.sample_ext + # => [beta0, beta1, alpha0, alpha1, ...] - movup.6 assert_eq.err="comparison failed: aux randomness" - movup.5 assert_eq.err="comparison failed: aux randomness" - # => [beta1, beta0, beta1, beta0, ...] + exec.constants::aux_rand_elem_ptr mem_storew_le + # => [beta0, beta1, alpha0, alpha1, ...] - movup.2 assert_eq.err="comparison failed: aux randomness" - assert_eq.err="comparison failed: aux randomness" + # Pad with zeros, load with mem_loadw_le overwriting the padding so that we can compare + padw + # => [0, 0, 0, 0, beta0, beta1, alpha0, alpha1, ...] + exec.constants::aux_rand_nd_ptr mem_loadw_le + # => [nd_beta0, nd_beta1, nd_alpha0, nd_alpha1, beta0, beta1, alpha0, alpha1, ...] + + # Assert sampled values match the non-deterministically provided ones. + # Comparison order: beta0, beta1, alpha0, alpha1 (memory offset 0, 1, 2, 3). + movup.4 assert_eq.err="aux randomness mismatch at element 0 (beta0)" + movup.3 assert_eq.err="aux randomness mismatch at element 1 (beta1)" + movup.2 assert_eq.err="aux randomness mismatch at element 2 (alpha0)" + assert_eq.err="aux randomness mismatch at element 3 (alpha1)" #=> [...] end -#! Draw constraint composition random coefficient and save it at `compos_coef_ptr`. +#! Draw constraint composition random coefficient and save it at `compos_coef_ptr`. #! #! Input: [...] #! Output: [...] #! Cycles: 13 pub proc generate_constraint_composition_coefficients + # Sample alpha (constraint folding challenge). + exec.sample_ext + push.0.0 + movup.3 + movup.3 exec.constants::composition_coef_ptr - padw exec.constants::r1_ptr mem_loadw_be - # => [y, y, alpha1, alpha0, compos_coef_ptr, ...] where y is a "garbage" value - movup.4 mem_storew_be dropw - #=> [...] + mem_storew_le dropw + + # Sample beta (multi-AIR accumulation challenge) to keep transcript in sync. + # For a single AIR, beta is unused but must be sampled from the random coin. + exec.sample_ext + drop drop end #! Draw deep composition polynomial random coefficient and save it at `deep_rand_coef_ptr`. @@ -349,19 +495,28 @@ end #! Output: [...] #! Cycles: 22 pub proc generate_deep_composition_random_coefficients - padw exec.constants::r1_ptr mem_loadw_be - # => [y, y, alpha1, alpha0, ...] where y is a "garbage" value - push.0.0 - exec.constants::deep_rand_alpha_nd_ptr mem_loadw_be - drop drop - # => [alpha1_nd, alpha0_nd, alpha1, alpha0, ...] where y is a "garbage" value + # Sample challenge_columns (deep alpha) for batching columns. + exec.sample_ext + padw + exec.constants::deep_rand_alpha_nd_ptr mem_loadw_le + # => [alpha0_nd, alpha1_nd, 0, 0, alpha0, alpha1, ...] - dup.2 assert_eq - dup.2 assert_eq - push.0.0 + dup.4 assert_eq + dup.4 assert_eq exec.constants::deep_rand_coef_ptr - mem_storew_be + mem_storew_le dropw + + # Sample challenge_points (deep beta) for batching evaluation points. + # p3-miden's DEEP formula weights the gz term by beta: + # Q(X) = [f(z)-f(X)]/(z-X) + beta * [f(gz)-f(X)]/(gz-X) + exec.sample_ext + # => [beta0, beta1, ...] + + # Store [beta0, beta1, alpha0, alpha1] at deep_rand_coef_ptr. + # (alpha was already stored at positions 2,3 by the mem_storew_le above) + exec.constants::deep_rand_coef_ptr mem_store + exec.constants::deep_rand_coef_ptr add.1 mem_store #=> [...] end @@ -370,7 +525,7 @@ end # ============================================================================================= #! Generate the OOD challenge point `z = (z0, z1)` and compute `z^N` where N is -#! the trace length. The resulting word `[(z_1, z_0)^N, z1, z0]` is stored in the +#! the trace length. The resulting word `[(z_0, z_1)^N, z0, z1]` is stored in the #! global memory address `exec.z_ptr` reserved for it. #! #! Input: [X, ...] @@ -378,31 +533,30 @@ end #! Note: The top word on the stack is consumed by this procedure. #! Cycles: 21 + 10 * log(N) pub proc generate_z_zN - # Load z (first two felts of the random coin state) and log trace length N - exec.constants::r1_ptr mem_loadw_be - drop drop + # Sample z and load log trace length N + exec.sample_ext exec.constants::get_trace_length_log - # => [log(trace_len), z_1, z_0, ...] + # => [log(trace_len), z_0, z_1, ...] dup.2 dup.2 - # => [z_1, z_0, log(trace_len), z_1, z_0, ...] + # => [z_0, z_1, log(trace_len), z_0, z_1, ...] # Compute z^N using the fact that z^N = z^(2^log(N)) # Loop starts with `i=log(trace_len)` push.1 while.true dup.1 dup.1 ext2mul - # => [(z_1, z_0)^n, i, z_1, z_0, ...] + # => [(z_0, z_1)^n, i, z_0, z_1, ...] dup.2 sub.1 swap.3 push.1 neq - # => [b, (z_1, z_0)^n, i-1, z_1, z_0, ...] + # => [b, (z_0, z_1)^n, i-1, z_0, z_1, ...] end movup.2 drop - # => [(z_1, z_0)^n, z_1, z_0, ...] + # => [(z_0, z_1)^n, z_0, z_1, ...] # Store z and z^N - exec.constants::z_ptr mem_storew_be + exec.constants::z_ptr mem_storew_le dropw end @@ -410,330 +564,185 @@ end # INDEX GENERATION # ============================================================================================= -# Helper function for generating a list of indices that takes a word of random felts and saves -# to memory region (referenced by `ptr`) 4 random integers in the range 0..=(mask+1). -# `depth` is saved next to each of the 4 integers for use in subsequent steps. -# -# Input: [R, ptr, mask, depth, ...] -# Output:[R, ptr+16, mask, depth, ...] -# -# Cycles: 100 -proc generate_four_integers - # Get the first random felt - dup.3 # [r0, R1, ptr, mask, depth, ...] - u32split swap # [r0_lo, r0_hi, R1, ptr, mask, depth, ...] - dup.7 # [mask, r0_lo, r0_hi, R1, ptr, mask, depth, ...] - u32and # [r, r0_hi, R1, ptr, mask, depth, ...] - dup.8 swap # [r, depth, r0_hi, R1, ptr, mask, depth, ...] - push.0 movdn.3 # [r, depth, r0_hi, 0, R1, ptr, mask, depth, ...] - - # Store and update pointer - dup.8 add.4 swap.9 # [ptr, r, depth, r0_hi, 0, R1, ptr + 4, mask, depth, ...] - mem_storew_be - dropw # [R1, ptr + 4, mask, depth, ...] - - # Get the second random felt - dup.2 # [r1, R1, ptr+4, mask, depth, ...] - u32split swap # [r1_lo, r1_hi, R1, ptr+4, mask, depth, ...] - dup.7 # [mask, r1_lo, r1_hi, R1, ptr+4, mask, depth, ...] - u32and # [r, r1_hi, R1, ptr+4, mask, depth, ...] - dup.8 swap # [r, depth, r1_hi, R1, ptr+4, mask, depth, ...] - push.0 movdn.3 # [r, depth, r1_hi, 0, R1, ptr+4, mask, depth, ...] - - # Store and update pointer - dup.8 add.4 swap.9 # [ptr, r, depth, r1_hi, 0, R1, ptr+8, mask, depth, ...] - mem_storew_be - dropw # [R1, ptr + 8, mask, depth, ...] - - # Get the third random felt - dup.1 - u32split swap - dup.7 - u32and - dup.8 swap - push.0 movdn.3 - - # Store and update pointer - dup.8 add.4 swap.9 - mem_storew_be - dropw - - # Get the fourth random felt - dup - u32split swap - dup.7 - u32and - dup.8 swap - push.0 movdn.3 - - # Store and update pointer - dup.8 add.4 swap.9 - mem_storew_be - dropw -end - -# Helper function for generating a list of indices. It takes a word of random felts and saves -# to a memory region, referenced by `ptr`, 3 random integers in the range 0..=(mask+1). This procedure -# is used to generate a list of random indices that are used in FRI. Moreover, this procedure -# is called first, and right after the PoW check, thus the first element in the rate portion of -# the state is discarded. -# `depth` is saved next to each of the 3 integers for use in subsequent steps. -# -# Input: [R, ptr, mask, depth, ...] -# Output:[R, ptr + 12, mask, depth, ...] -# -# Cycles: 75 -proc generate_three_integers - # Get the second random felt - dup.2 # [r0, R1, ptr, mask, depth, ...] - u32split swap # [r0_lo, r0_hi, R1, ptr, mask, depth, ...] - dup.7 # [mask, r0_lo, r0_hi, R1, ptr, mask, depth, ...] - u32and # [r, r0_hi, R1, ptr, mask, depth, ...] - dup.8 swap # [r, depth, r0_hi, R1, ptr, mask, depth, ...] - push.0 movdn.3 # [r, depth, r0_hi, 0, R1, ptr, mask, depth, ...] - - # Store and update pointer - dup.8 add.4 swap.9 # [ptr, r, depth, r0_hi, 0, R1, ptr + 4, mask, depth, ...] - mem_storew_be - dropw # [R1, ptr + 4, mask, depth, ...] - - # Get the second random felt - dup.1 # [r1, R1, ptr, mask, depth, ...] - u32split swap # [r1_lo, r1_hi, R1, ptr, mask, depth, ...] - dup.7 # [mask, r1_lo, r1_hi, R1, ptr, mask, depth, ...] - u32and # [r, r1_hi, R1, ptr, mask, depth, ...] - dup.8 swap # [r, depth, r1_hi, R1, ptr, mask, depth, ...] - push.0 movdn.3 # [r, depth, r1_hi, 0, R1, ptr, mask, depth, ...] - - # Store and update pointer - dup.8 add.4 swap.9 # [ptr, r, depth, r1_hi, 0, R1, ptr + 4, mask, depth, ...] - mem_storew_be - dropw # [R1, ptr + 4, mask, depth, ...] - - # Get the third random felt - dup.0 - u32split swap - dup.7 - u32and - dup.8 swap - push.0 movdn.3 - - # Store and update pointer - dup.8 add.4 swap.9 - mem_storew_be - dropw -end - #! Generate a list of `num_queries` number of random indices in the range #! [0, lde_size] and store it in memory starting from `query_ptr`. -#! The list is stored as `(r, depth, y, y)` where `depth` is `log(lde_domain_size)`. -#!`depth` is needed when computing the deep queries. +#! The list is stored as `(rev_index, depth, natural_index, 0)` where +#! `depth` is `log(lde_domain_size)` which is needed when computing the DEEP queries. #! -#! Input: [query_ptr, num_queries, ...] -#! Output: [...] +#! Reads rate elements directly from memory (decrementing from output_len-1 down to 0), +#! permuting when the rate is exhausted, rather than calling sample_felt per query. #! -#! Cycles: 267 + q * 236 + r * 29 where q = num_queries / 8 and r = num_queries % 8 +#! Input: [...] +#! Output: [...] #! -#! NOTE: This procedure is called first, and right after the PoW check, thus the first element -#! in the rate portion of the state is discarded. -#! NOTE: The cycles count can be estimated, using the fact that r < 8, via the more compact formula -#! 470 + 236 * (num_queries / 8) +#! NOTE: This procedure is called right after the PoW check. The PoW check consumes one +#! rate element via sample_bits, leaving output_len = 7. pub proc generate_list_indices - # Get the number of query indices we need to generate and the address to where we need - # to store them at. exec.constants::get_number_queries exec.constants::get_fri_queries_address #=> [query_ptr, num_queries, ...] - # Create mask - exec.constants::get_lde_domain_log_size - exec.constants::get_lde_domain_size - sub.1 - #=> [mask, depth, query_ptr, num_queries, ...] where depth = log(lde_size) - - # Get address holding the integers (this will later hold the FRI queries) - movup.2 - #=> [query_ptr, mask, depth, num_queries, ...] - - # Load the first half of the rate portion of the state of the random coin. We discard the first - # element as it is used for PoW and use the remaining the 3. - exec.get_rate_1 - #=> [R1, query_ptr, mask, depth, num_queries, ...] - exec.generate_three_integers - #=> [R1, query_ptr+12, mask, depth, num_queries, ...] - - - # Load the second half of the rate portion of the state of the random coin. - exec.constants::r2_ptr mem_loadw_be - #=> [R2, query_ptr+12, mask, depth, num_queries, ...] - exec.generate_four_integers - #=> [R2, query_ptr+26, mask, depth, num_queries, ..., ...] - - # Squeeze - exec.constants::c_ptr mem_loadw_be - exec.get_rate_1 - exec.get_rate_2 - exec.poseidon2::permute - #=> [R2', R1, C, query_ptr+26, mask, depth, num_queries, ...] - - # Save the new state - exec.constants::r2_ptr mem_storew_be - dropw - # => [R1, C] - exec.constants::r1_ptr mem_storew_be - swapw - # => [C, R1] - exec.constants::c_ptr mem_storew_be - dropw - #=> [R1, query_ptr+26, mask, depth, num_queries, ...] - - - # Use `num_queries` to iterate. - - ## Subtract the 7 elements we have already generated above. - movup.7 - push.7 sub - #=> [num_queries-7, R1, query_ptr+26, mask, depth, ...] - - ## Divide by 8 to get the number of iterations - u32assert u32divmod.8 - #=> [num_queries_remainder, num_queries_quotient, X, query_ptr+26, mask, depth, ...] - - ## Save remainder for later use - movdn.8 - #=> [num_queries_quotient, X, query_ptr+26, mask, depth, num_queries_remainder, ...] - - ## Use `quotient` to iterate - dup movdn.8 - #=> [num_queries_quotient, X, query_ptr+26, mask, depth, num_queries_quotient, num_queries_remainder, ...] - - push.0 neq + exec.constants::get_lde_domain_depth + #=> [depth, query_ptr, num_queries, ...] + + # Pre-compute pow2_shift = 2^(32 - depth) and mask = 2^depth - 1. + # Keep both on the stack to avoid per-element procedure call overhead for memory loads. + dup push.32 swap u32wrapping_sub pow2 + #=> [pow2_shift, depth, query_ptr, num_queries, ...] + swap dup pow2 u32assert u32overflowing_sub.1 assertz + #=> [mask, depth, pow2_shift, query_ptr, num_queries, ...] + + # Rearrange to loop layout: [query_ptr, num_queries, mask, depth, pow2_shift, ...] + movup.3 movup.4 swap + #=> [query_ptr, num_queries, mask, depth, pow2_shift, ...] + + # Load current output_len from random coin state (7 after PoW). + # Assert it is nonzero: this procedure expects a freshly permuted sponge with at least + # one element already consumed (by the PoW check). A zero output_len would mean the + # sponge was never permuted or was fully drained, which is a caller bug. + exec.constants::random_coin_output_len_ptr mem_load + dup push.0 neq assert.err="generate_list_indices: output_len must be nonzero" + #=> [output_len, query_ptr, num_queries, mask, depth, pow2_shift, ...] + + # Stack layout during loop: + # pos 0: output_len (rate elements remaining before next permute) + # pos 1: query_ptr (advances by 4 each iteration) + # pos 2: num_queries (decrements to 0) + # pos 3: mask (constant) + # pos 4: depth (constant, needed for inclusion in the stored word) + # pos 5: pow2_shift (constant, needed for bit_reverse) + + dup.2 push.0 neq while.true - #=> [X, query_ptr', mask, depth, num_remaining_iterations, remainder, ...] - - exec.generate_four_integers - #=> [X, query_ptr'+16, mask, depth, num_remaining_iterations, remainder, ...] - - exec.constants::r2_ptr mem_loadw_be - exec.generate_four_integers - #=> [R2, query_ptr'+32, mask, depth, num_remaining_iterations, remainder, ...] - - # Squeeze - exec.constants::c_ptr mem_loadw_be - exec.get_rate_1 - exec.get_rate_2 - exec.poseidon2::permute - #=> [R2, R1, C, query_ptr'+32, mask, depth, num_remaining_iterations, remainder, ...] - - # Save the new state - exec.constants::r2_ptr mem_storew_be - dropw - #=> [R1, C, query_ptr'+32, mask, depth, num_remaining_iterations, remainder, ...] - exec.constants::r1_ptr mem_storew_be - swapw - #=> [C, R1, query_ptr'+32, mask, depth, num_remaining_iterations, remainder, ...] - exec.constants::c_ptr mem_storew_be + # --- Ensure rate has an element; permute if exhausted --- + dup push.0 eq + if.true + drop + exec.load_random_coin_state + exec.poseidon2::permute + exec.store_random_coin_state + push.8 + end + #=> [output_len, query_ptr, num_queries, mask, depth, pow2_shift, ...] + + # --- Read rate element at index (output_len - 1) --- + sub.1 + #=> [idx, query_ptr, num_queries, mask, depth, pow2_shift, ...] + # R1 and R2 are contiguous in memory (R1_PTR, R1_PTR+4 = R2_PTR), so + # rate[idx] is simply at R1_PTR + idx. + dup exec.constants::r1_ptr add mem_load + #=> [felt, idx, query_ptr, num_queries, mask, depth, pow2_shift, ...] + + # --- Extract masked index: lo 32 bits AND mask --- + u32split swap drop + #=> [lo, idx, query_ptr, num_queries, mask, depth, pow2_shift, ...] + dup.4 u32and + #=> [natural_index, idx, query_ptr, num_queries, mask, depth, pow2_shift, ...] + + # --- Bit-reverse --- + # Set up [natural_index, pow2_shift, depth, natural_index, idx, query_ptr, ...] + # so bit_reverse_len_parallel consumes [natural_index, pow2_shift] and leaves + # [rev_index, depth, natural_index, idx, query_ptr, ...]. + dup.5 dup.7 dup.2 + #=> [natural_index, pow2_shift, depth, natural_index, idx, query_ptr, num_queries, mask, depth, pow2_shift, ...] + exec.utils::bit_reverse_len_parallel + #=> [rev_index, depth, natural_index, idx, query_ptr, num_queries, mask, depth, pow2_shift, ...] + + # --- Store [rev_index, depth, natural_index, 0] at query_ptr --- + push.0 movdn.3 + #=> [rev_index, depth, natural_index, 0, idx, query_ptr, num_queries, mask, depth, pow2_shift, ...] + dup.5 + #=> [query_ptr, rev_index, depth, natural_index, 0, idx, query_ptr, num_queries, mask, depth, pow2_shift, ...] + mem_storew_le dropw - #=> [R1, query_ptr'+32, mask, depth, num_remaining_iterations, remainder, ...] + #=> [idx, query_ptr, num_queries, mask, depth, pow2_shift, ...] - movup.7 sub.1 dup movdn.8 - #=> [num_remaining_iterations-1, R1, query_ptr'+32, mask, depth, num_remaining_iterations-1, remainder, ...] + # --- Advance query_ptr, decrement num_queries --- + swap add.4 swap + #=> [idx, query_ptr', num_queries, mask, depth, pow2_shift, ...] + movup.2 sub.1 movdn.2 + #=> [idx, query_ptr', num_queries-1, mask, depth, pow2_shift, ...] - push.0 neq + # --- Check loop condition --- + # idx is our output_len for next iteration (already decremented). + dup.2 push.0 neq end - #=> [R1, query_ptr', mask, depth, 0, remainder, ...] - - ## Use remainder - ## Note: we rename the `remainder` variable to `num_queries`, as it now indicates the number of - ## queries left. - ### Put the remaining number of queries to generate in the appropriate stack position - movup.8 movdn.7 - #=> [R1, query_ptr', mask, depth, num_queries, ...] + # --- Restore random coin output_len so subsequent operations see correct state --- + # pos 0 = output_len (remaining), store it back. + exec.constants::random_coin_output_len_ptr mem_store + #=> [query_ptr, num_queries, mask, depth, pow2_shift, ...] - ### Load the second half of the rate portion of the state of the random coin. - padw exec.constants::r2_ptr mem_loadw_be - #=> [R2, R1, query_ptr, mask, depth, num_queries, ...] + # Also clear the input_len to 0 (should already be 0, but it is better to be safe). + push.0 exec.constants::random_coin_input_len_ptr mem_store - ### Iterate over remainder - dup.11 sub.1 swap.12 - #=> [num_queries, R2, R1, query_ptr, mask, depth, num_queries-1, ...] - - neq.0 - while.true - #=> [R2, R1, query_ptr, mask, depth, num_queries, ...] - movup.7 - u32split swap # [r0_lo, r0_hi, R2, r3, r2, r1, ptr, mask, depth, num_queries, ...] - dup.10 # [mask, r0_lo, r0_hi, R2, r3, r2, r1, ptr, mask, depth, num_queries, ...] - u32and # [r, r0_hi, R2, r3, r2, r1, ptr, mask, depth, num_queries, ...] - dup.11 swap # [r, depth, r0_hi, R2, r3, r2, r1, ptr, mask, depth, num_queries, ...] - push.0 movdn.3 # [r, depth, r0_hi, 0, R2, r3, r2, r1, ptr, mask, depth, num_queries, ...] - - # Store and update pointer - dup.11 add.4 swap.12 # [ptr, r, depth, r0_hi, 0, R2, r3, r2, r1, ptr + 4, mask, depth, num_queries, ...] - mem_storew_be - drop drop drop # [x, R2, r3, r2, r1, ptr + 1, mask, depth, num_queries, ...] - dup.11 sub.1 swap.12 - #=> [num_queries, x, R2, r3, r2, r1, ptr + 1, mask, depth, num_queries-1, ...] - push.0 neq - end - #=> [R2, R1, query_ptr, mask, depth, 0, ...] - - dropw dropw dropw drop + dropw drop end # PROOF-OF-WORK CHECK # ============================================================================================= -#! Check that the Proof-of-Work contained in the nonce is equal to the required number -#! of bits prescribed by grinding bits. The grinding factor is assumed to be less than 32. +#! Verify a proof-of-work witness given pow_bits on the stack. #! -#! Input: [...] +#! When pow_bits != 0, reads the nonce from advice, writes it to rate[0], permutes, +#! and checks that the low pow_bits of the output are zero. +#! When pow_bits == 0, consumes the witness (must be zero) without affecting the transcript. +#! +#! Used by check_query_pow (query phase) and check_deep_pow (DEEP phase). +#! FRI folding PoW uses a separate path (sample_folding_pow_and_ext) because the +#! witness is bundled with the commitment reseed. +#! +#! SAFETY: Requires input_len=0. +#! +#! Input: [pow_bits, ...] #! Output: [...] -#! Cycles: 73 -pub proc check_pow - # Load the grinding factor - exec.constants::get_grinding_factor - - # Compute the mask. - pow2 - u32assert u32overflowing_sub.1 assertz.err="range check failed: pow" - #=> [mask, ...] - - # Load Capacity portion - exec.get_capacity - #=> [C, mask, ...] - - # Load first half of rate portion and add pow witness to first element of rate - exec.get_rate_1 - adv_push.1 - dup.4 - add - swap.4 - drop - - # Load the second half of rate portion and apply the permutation - padw - exec.constants::r2_ptr mem_loadw_be - exec.poseidon2::permute - #=> [R2, R1, C, mask, ...] +proc check_pow + dup + push.0 neq + if.true + adv_push.1 + # Assert input buffer is empty, then write nonce directly to rate[0] and permute. + exec.constants::random_coin_input_len_ptr mem_load + assertz.err="check_pow: input buffer must be empty" + exec.constants::r1_ptr mem_store + exec.load_random_coin_state + exec.poseidon2::permute + exec.store_random_coin_state + push.8 exec.constants::random_coin_output_len_ptr mem_store + # sample_bits reads from fresh output (no duplex triggered). + exec.sample_bits + assertz.err="proof-of-work check failed" + else + # Consume witness to keep advice layout, but do not affect transcript. + adv_push.1 + assertz.err="proof-of-work nonce must be zero when grinding factor is zero" + drop + end +end - # Save the new random coin state - exec.constants::r2_ptr mem_storew_be - dropw - exec.constants::r1_ptr mem_storew_be - swapw - exec.constants::c_ptr mem_storew_be - dropw - drop drop drop - #=> [R10, mask] +#! Check the DEEP proof-of-work. +#! +#! Called before sampling DEEP composition polynomial challenges. +#! +#! SAFETY: Requires input_len=0. +#! +#! Input: [...] +#! Output: [...] +pub proc check_deep_pow + exec.constants::get_deep_pow_bits + exec.check_pow +end - # Make sure the PoW is valid - u32split - drop - u32and - assertz.err="range check failed: pow" - drop - #=> [...] +#! Check the query proof-of-work. +#! +#! Called after loading the FRI remainder, before sampling query indices. +#! +#! SAFETY: Requires input_len=0 (guaranteed after load_and_verify_remainder). +#! +#! Input: [...] +#! Output: [...] +pub proc check_query_pow + exec.constants::get_query_pow_bits + exec.check_pow end diff --git a/crates/lib/core/asm/stark/utils.masm b/crates/lib/core/asm/stark/utils.masm index e3340fdc3f..a012b6dae6 100644 --- a/crates/lib/core/asm/stark/utils.masm +++ b/crates/lib/core/asm/stark/utils.masm @@ -18,110 +18,281 @@ end #! Validates the inputs to the recursive verifier. #! -#! Input: [log(trace_length), num_queries, grinding, ...] -#! Output: [log(trace_length), num_queries, grinding, ...] +#! Checks log(trace_length) from the stack and security parameters from memory. +#! The security parameters must already be stored in memory before calling this +#! procedure (done by the specific verifier's load_security_params). #! -#! Cycles: 45 +#! Input: [log(trace_length), ...] +#! Output: [log(trace_length), ...] pub proc validate_inputs - # 1) Assert that all inputs are u32 so that we can use u32 operations in what follows - push.0 - dupw - u32assertw - # => [0, log(trace_length), num_queries, grinding, 0, log(trace_length), num_queries, grinding, ...] + # 1) Assert log(trace_length) is u32 + dup u32assert # 2) Assert that the trace length is at most 29. The 2-adicity of our field is 32 and since # the blowup factor is 8, we need to make sure that the LDE size is at most 2^32. # We also check that the trace length is greater than the minimal length supported i.e., 2^6. - drop - dup u32lt.30 assert.err="range check failed: input bounds" - u32gt.5 assert.err="range check failed: input bounds" + dup u32lt.30 assert.err="log(trace_length) must be less than 30" + u32gt.5 assert.err="log(trace_length) must be greater than 5" # 3) Assert that the number of FRI queries is at most 150. This restriction is a soft one # and is due to the memory layout in the `constants.masm` files but can be updated # therein. # We also make sure that the number of FRI queries is at least 7. - dup u32lt.151 assert.err="range check failed: input bounds" - u32gt.6 assert.err="range check failed: input bounds" + exec.constants::get_number_queries + dup u32lt.151 assert.err="num_queries must be less than 151" + u32gt.6 assert.err="num_queries must be greater than 6" + + # 4) Assert that PoW bit counts are less than 32 (must fit in u32 bit masking) + exec.constants::get_query_pow_bits + u32lt.32 assert.err="query_pow_bits must be less than 32" - # 4) Assert that the grinding factor is at most 31 - u32lt.32 assert.err="range check failed: input bounds" + exec.constants::get_deep_pow_bits + u32lt.32 assert.err="deep_pow_bits must be less than 32" - # 5) Clean up the stack - drop + exec.constants::get_folding_pow_bits + u32lt.32 assert.err="folding_pow_bits must be less than 32" end -#! Sets up auxiliary inputs to the arithmetic circuit for the constraint evaluation check. +#! Reverse the lowest `bits` bits of `index` using parallel bit-swap. +#! `pow2_shift` must equal 2^(32 - bits); the caller pre-computes it once. +#! +#! The algorithm has two parts: +#! +#! 1) Left-shift: multiply index by pow2_shift = 2^(32-bits) to place the `bits` +#! meaningful bits into the top of a 32-bit word. Since index < 2^bits, the +#! product is always < 2^32 so u32wrapping_mul is exact. #! -#! These inputs are: +#! 2) Full 32-bit reversal via 5 parallel swap steps. Each step k (for k=1,2,4,8,16) +#! swaps every adjacent group of k bits. A mask isolates the even-positioned +#! groups; the odd-positioned groups are the complement. Shifting each half by +#! k positions and combining swaps all groups simultaneously. After all 5 steps, +#! bit position i has moved to position 31-i, which (because of the initial +#! left-shift) is exactly position (bits-1-i) of the original -- i.e., the +#! reversed index. No final shift is needed. +#! +#! The two halves never overlap, so XOR = OR = ADD; we use XOR (2 cycles vs 4 for +#! u32wrapping_add). +#! +#! Input: [index, pow2_shift, ...] +#! Output: [rev_index, ...] +#! Cycles: 83 +pub proc bit_reverse_len_parallel + u32wrapping_mul + + # Step 1: swap adjacent bits + # x = ((x >> 1) & 0x55555555) ^ ((x & 0x55555555) << 1) + dup u32shr.1 push.0x55555555 u32and + swap push.0x55555555 u32and u32shl.1 + u32xor + #=> [x1, ...] + + # Step 2: swap bit pairs + # x = ((x >> 2) & 0x33333333) ^ ((x & 0x33333333) << 2) + dup u32shr.2 push.0x33333333 u32and + swap push.0x33333333 u32and u32shl.2 + u32xor + #=> [x2, ...] + + # Step 3: swap nibbles + # x = ((x >> 4) & 0x0F0F0F0F) ^ ((x & 0x0F0F0F0F) << 4) + dup u32shr.4 push.0x0F0F0F0F u32and + swap push.0x0F0F0F0F u32and u32shl.4 + u32xor + #=> [x3, ...] + + # Step 4: swap bytes + # x = ((x >> 8) & 0x00FF00FF) ^ ((x & 0x00FF00FF) << 8) + dup u32shr.8 push.0x00FF00FF u32and + swap push.0x00FF00FF u32and u32shl.8 + u32xor + #=> [x4, ...] + + # Step 5: swap halfwords + # x = (x >> 16) ^ (x << 16) (no mask needed, both halves fit in 16 bits) + dup u32shr.16 + swap u32shl.16 + u32xor + #=> [rev_index, ...] +end + +#! Sets up the stark-vars region of the ACE circuit input layout. #! -#! 1) OOD evaluation point z, -#! 2) random challenge used in computing the DEEP composition polynomial, -#! 3) z^N where N is the execution trace length -#! 4) z^k where k = min_num_cycles = trace_len / max_cycle_len and max_cycle_len is the longest cycle -#! among all the cycles of periodic columns. -#! 5) g^{-1} where g is the trace domain generator. +#! The stark-vars block is 10 EF slots (5 words) laid out as: #! -#! The only input to this procedure is the log2 of the max cycle length across all periodic columns. +#! Word 0 (slots 0-1): alpha, z^N (EF: composition challenge, trace-length power) +#! Word 1 (slots 2-3): z_k, is_first (EF: periodic eval point, first-row selector) +#! Word 2 (slots 4-5): is_last, is_transition (EF: last-row selector, transition selector) +#! Word 3 (slots 6-7): gamma, weight0 (EF: batching challenge; base as EF: barycentric weight) +#! Word 4 (slots 8-9): f, s0 (base as EF: chunk shift ratio h^N, first shift) #! #! Input: [max_cycle_len_log, ...] #! Output: [...] pub proc set_up_auxiliary_inputs_ace - padw exec.constants::composition_coef_ptr mem_loadw_be + # ================================================================== + # Phase 1: alpha, z^N -> Word 0 (z_k and z remain on stack) + # ================================================================== - # z and z^N - push.0.0 exec.constants::z_ptr mem_loadw_be - # => [(z_1, z_0)^n, z_1, z_0, alpha1, alpha0, max_cycle_len_log, ...] + padw exec.constants::composition_coef_ptr mem_loadw_le + # => [alpha0, alpha1, 0, 0, max_cycle_len_log, ...] + movup.3 movup.3 + push.0.0 exec.constants::z_ptr mem_loadw_le + # => [z_n_0, z_n_1, z_0, z_1, alpha0, alpha1, max_cycle_len_log, ...] + + # Compute z_k = z^(N / max_cycle_len) via repeated squaring. exec.constants::get_trace_length_log movup.7 sub - # => [log(min_num_cycles), (z_1, z_0)^n, z_1, z_0, alpha1, alpha0, ...] where min_num_cycles = trace_len / max_cycle_len + # => [k, z_n_0, z_n_1, z_0, z_1, alpha0, alpha1, ...] + # where k = log(trace_len) - log(max_cycle_len) dup.4 dup.4 - # => [z_1, z_0, k, (z_1, z_0)^n, z_1, z_0, alpha1, alpha0, ...] where k = min_num_cycles + # => [z_0, z_1, k, z_n_0, z_n_1, z_0, z_1, alpha0, alpha1, ...] push.1 while.true dup.1 dup.1 - # => [z_1, z_0, z_1, z_0, k, (z_1, z_0)^n, z_1, z_0, alpha1, alpha0, ...] where k = min_num_cycles ext2mul - # => [z_exp_1, z_exp_0, k, (z_1, z_0)^n, z_1, z_0, alpha1, alpha0, ...] where k = min_num_cycles dup.2 sub.1 swap.3 push.1 neq end movup.2 drop - # => [z_k_1, z_k_0, (z_1, z_0)^n, z_1, z_0, alpha1, alpha0, ...] where k = min_num_cycles + # => [z_k_0, z_k_1, z_n_0, z_n_1, z_0, z_1, alpha0, alpha1, ...] + + # Rearrange for Word 0 = [alpha0, alpha1, z_n_0, z_n_1] + movup.3 movup.3 + # => [z_n_0, z_n_1, z_k_0, z_k_1, z_0, z_1, alpha0, alpha1, ...] + movup.7 movup.7 + # => [alpha0, alpha1, z_n_0, z_n_1, z_k_0, z_k_1, z_0, z_1, ...] + + exec.constants::auxiliary_ace_inputs_ptr + mem_storew_le + drop drop + # => [z_n_0, z_n_1, z_k_0, z_k_1, z_0, z_1, ...] + + # ================================================================== + # Phase 2: is_first, is_last, is_transition -> Words 1-2 + # ================================================================== + + # Compute vanishing = z^N - 1 (z^N is still on the stack from Phase 1). + sub.1 + # => [van_0, van_1, z_k_0, z_k_1, z_0, z_1, ...] + + # is_first = vanishing * inv(z - 1) + dup.5 dup.5 + # => [z_0, z_1, van_0, van_1, z_k_0, z_k_1, z_0, z_1, ...] + sub.1 ext2inv + # => [inv_z1_0, inv_z1_1, van_0, van_1, z_k_0, z_k_1, z_0, z_1, ...] + dup.3 dup.3 + # => [van_0, van_1, inv_z1_0, inv_z1_1, van_0, van_1, z_k_0, z_k_1, z_0, z_1, ...] + ext2mul + # => [is_first_0, is_first_1, van_0, van_1, z_k_0, z_k_1, z_0, z_1, ...] + # Store Word 1: [z_k_0, z_k_1, is_first_0, is_first_1] + movup.5 movup.5 + # => [z_k_0, z_k_1, is_first_0, is_first_1, van_0, van_1, z_0, z_1, ...] + exec.constants::auxiliary_ace_inputs_ptr add.4 + mem_storew_le + dropw + # => [van_0, van_1, z_0, z_1, ...] + + # is_transition = z - g^{-1} (g_inv is base-field, only coord 0 changes) exec.constants::get_trace_domain_generator inv - # => [g^-1, z_k_1, z_k_0, (z_1, z_0)^n, z_1, z_0, alpha1, alpha0, ...] where k = min_num_cycles - movdn.2 - push.0 - movdn.2 - # => [z_k_1, z_k_0, 0, g^-1, (z_1, z_0)^n, z_1, z_0, alpha1, alpha0, ...] where k = min_num_cycles + # => [g_inv, van_0, van_1, z_0, z_1, ...] + movup.3 swap sub + # => [is_trans_0, van_0, van_1, z_1, ...] + movup.3 + swap + # => [is_trans_0, is_trans_1, van_0, van_1, ...] - exec.constants::get_trace_domain_generator - inv dup mul - push.0 - # => [0, g^-2, z_k_1, z_k_0, 0, g^-1, (z_1, z_0)^n, z_1, z_0, alpha1, alpha0, ...] where k = min_num_cycles + # is_last = vanishing * inv(is_transition) + dup.1 dup.1 + # => [is_trans_0, is_trans_1, is_trans_0, is_trans_1, van_0, van_1, ...] + ext2inv + # => [inv_t_0, inv_t_1, is_trans_0, is_trans_1, van_0, van_1, ...] + movup.5 movup.5 + # => [van_0, van_1, inv_t_0, inv_t_1, is_trans_0, is_trans_1, ...] + ext2mul + # => [is_last_0, is_last_1, is_trans_0, is_trans_1, ...] - # Save [z_k_0, z_k_1, g^-2, 0] + # Store Word 2: [is_last_0, is_last_1, is_trans_0, is_trans_1] exec.constants::auxiliary_ace_inputs_ptr add.8 - mem_storew_be + mem_storew_le dropw - # => [0, g^-1, (z_1, z_0)^n, z_1, z_0, alpha1, alpha0, ...] + # => [...] - # Save [(z_0, z_1)^n, g^-1, 0] - exec.constants::auxiliary_ace_inputs_ptr add.4 - mem_storew_be + # ================================================================== + # Phase 3: f, s0, weight0, gamma -> Words 3-4 + # ================================================================== + + # Compute s0 = offset^N + push.0.7 + exec.constants::get_trace_length + exp.u32 + # => [s0, 0, ...] + + # Compute f = h^N (chunk shift ratio between cosets) + push.0 + exec.constants::get_lde_domain_generator + exec.constants::get_trace_length + exp.u32 + # => [f, 0, s0, 0, ...] + + # Compute weight0 = 1 / (8 * s0^7) + dup.2 dup + mul + # => [s0^2, f, 0, s0, 0, ...] + dup dup mul + # => [s0^4, s0^2, f, 0, s0, 0, ...] + mul + # => [s0^6, f, 0, s0, 0, ...] + dup.3 mul + mul.8 inv + # => [weight0, f, 0, s0, 0, ...] + + # Store Word 4: [f, 0, s0, 0] + movdn.4 + # => [f, 0, s0, 0, weight0, ...] + exec.constants::auxiliary_ace_inputs_ptr add.16 + mem_storew_le dropw + # => [weight0, ...] - # Save [alpha0, alpha1, z_0, z_1] - exec.constants::auxiliary_ace_inputs_ptr - mem_storew_be + # Store Word 3: [gamma_0, gamma_1, weight0, 0] + # weight0 is still on the stack -- sample gamma and assemble the word. + exec.sample_gamma + # => [gamma_0, gamma_1, weight0, ...] + push.0 movdn.3 + # => [gamma_0, gamma_1, weight0, 0, ...] + exec.constants::auxiliary_ace_inputs_ptr add.12 + mem_storew_le dropw - # => [...] +end + +#! Sample the batching challenge gamma (EF element). +#! +#! gamma batches the constraint evaluation with the auxiliary trace boundary checks: +#! output = constraint_check + gamma * product_check + gamma^2 * sum_check +#! +#! WORKAROUND (unsound): Reads gamma directly from the sponge rate buffer without +#! consuming it. This gives gamma == deep_alpha (the next challenge that will be +#! properly sampled in generate_deep_composition_random_coefficients). Using the +#! same value for both is unsound. +#! +#! TODO: Replace with a proper `sample_ext` call once the Rust-side +#! StarkTranscript is updated to draw gamma between OOD and DEEP phases. +#! +#! Input: [...] +#! Output: [gamma_0, gamma_1, ...] +proc sample_gamma + # Assert output_len == 8 so the rate buffer indices are correct. + exec.constants::random_coin_output_len_ptr mem_load push.8 assert_eq + # Read the top 2 elements of the sponge rate buffer. + exec.constants::r1_ptr add.7 mem_load + exec.constants::r1_ptr add.6 mem_load + swap end #! Executes the constraints evalution check. @@ -132,14 +303,26 @@ proc execute_constraint_evaluation_check exec.constants::get_procedure_digest_execute_constraint_evaluation_check_ptr dynexec end +#! Observes the auxiliary trace: draws aux randomness, reseeds with the aux trace commitment, +#! and absorbs aux trace boundary values into the transcript. +#! +#! For AIRs without an auxiliary trace, the implementation should be a no-op. +#! +#! Input: [...] +#! Output: [...] +proc observe_aux_trace + exec.constants::get_procedure_digest_observe_aux_trace_ptr dynexec +end + #! Stores digests of dynamically executed procedures. #! -#! Input: [D3, D2, D1, D0, ...] +#! Input: [D0, D1, D2, D3, D4, ...] #! Output: [...] pub proc store_dynamically_executed_procedures - exec.constants::get_procedure_digest_process_public_inputs_ptr mem_storew_be dropw - exec.constants::get_procedure_digest_process_row_ood_evaluations_ptr mem_storew_be dropw - exec.constants::get_procedure_digest_execute_constraint_evaluation_check_ptr mem_storew_be dropw - exec.constants::get_procedure_digest_compute_deep_composition_polynomial_queries_ptr mem_storew_be dropw + exec.constants::get_procedure_digest_observe_aux_trace_ptr mem_storew_le dropw + exec.constants::get_procedure_digest_process_public_inputs_ptr mem_storew_le dropw + exec.constants::get_procedure_digest_process_row_ood_evaluations_ptr mem_storew_le dropw + exec.constants::get_procedure_digest_execute_constraint_evaluation_check_ptr mem_storew_le dropw + exec.constants::get_procedure_digest_compute_deep_composition_polynomial_queries_ptr mem_storew_le dropw # => [...] end diff --git a/crates/lib/core/asm/stark/verifier.masm b/crates/lib/core/asm/stark/verifier.masm index 99bd0b9794..09d64f1d95 100644 --- a/crates/lib/core/asm/stark/verifier.masm +++ b/crates/lib/core/asm/stark/verifier.masm @@ -13,21 +13,18 @@ use miden::core::stark::utils #! The purpose of the following verifier is to serve as a generic core around which a specific #! verifier can be built. It expects the following parameters on the stack from the caller: #! -#! 1. `[D0, D1, D2, D3]` which are respectively the digests for dynamic execution of procedures -#! i. `compute_deep_composition_polynomial_queries` -#! ii. `execute_constraint_evaluation_check` -#! iii. `process_row_ood_evaluations` -#! iv. `process_public_inputs` -#! 2. `num_constraints` which is the number of constraints in the AIR -#! 3. `trace_info` which is a field element encoding the layout of the AIR -#! 4. `num_fixed_len_pi` is the number of fixed length public inputs of the AIR -#! 5. `is_aux_trace` flag indicating the existence of an auxiliary segment in this AIR +#! 1. `[D0, D1, D2, D3, D4]` which are the digests for dynamic execution of: +#! D0. `observe_aux_trace` +#! D1. `process_public_inputs` +#! D2. `process_row_ood_evaluations` +#! D3. `execute_constraint_evaluation_check` +#! D4. `compute_deep_composition_polynomial_queries` +#! 2. Per-proof parameter: `log(trace_length)` +#! 3. `[rd0, rd1, rd2, rd3]`: RELATION_DIGEST = hash(PROTOCOL_ID, CIRCUIT_COMMITMENT), +#! a compile-time constant that binds the Fiat-Shamir transcript to the AIR instance. #! -#! In addition to the above parameters, the verifier expects the following auxiliary proof parameters: -#! -#! 1. `log(trace_length)`, the logarithm base 2 of the trace length -#! 2. `num_queries`, the number of FRI queries -#! 3. `grinding`, the number of bits of grinding i.e., proof-of-work +#! Precondition: security parameters (num_queries, query_pow_bits, deep_pow_bits, +#! folding_pow_bits) must already be stored in memory before calling this procedure. #! #! The following simplifying assumptions are currently made and hardcoded: #! @@ -38,66 +35,52 @@ use miden::core::stark::utils #! Similarly, elements of the auxiliary trace are quadratic extension field elements. The random #! values for computing random linear combinations are also in this extension field. #! -#! Inputs: [D3, D2, D1, D0, log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, is_aux_trace] +#! Inputs: [D0, D1, D2, D3, D4, log(trace_length), rd0, rd1, rd2, rd3] #! Outputs: [] pub proc verify #============================================================================================== - # I) Hash proof context and hash-&-load public inputs + # I) Observe proof context and load public inputs #============================================================================================== # Store digests of dynamically executed procedures exec.utils::store_dynamically_executed_procedures - # => [log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, is_aux_trace, ...] + # => [log(trace_length), rd0, rd1, rd2, rd3] # Validate inputs - # - # Cycles: 45 exec.utils::validate_inputs - # => [log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, is_aux_trace, ...] + # => [log(trace_length), rd0, rd1, rd2, rd3] - # Initialize the seed using proof context - # - # Cycles: 210 + # Initialize sponge with DSFS seeding and derive trace domain parameters. + # Consumes [log(tl), rd0, rd1, rd2, rd3]. Security params are read from memory. exec.random_coin::init_seed - # => [C, is_aux_trace, ...] + # => [...] - # Load public inputs + # Load and observe public inputs exec.public_inputs::process_public_inputs - # => [is_aux_trace, ...] + # => [...] + + # Load main trace commitment and re-seed with it. + # + # SAFETY: reseed_direct bypasses the duplex input buffer and requires input_len=0. + # The process_public_inputs implementation (dispatched via dynexec) must guarantee + # this postcondition. + padw adv_loadw + exec.constants::main_trace_com_ptr mem_storew_le + # => [main_trace_commitment, ...] + exec.random_coin::reseed_direct + # => [...] + #============================================================================================== - # II) Generate the auxiliary trace random elements if auxiliary segment exists + # II) Observe auxiliary trace #============================================================================================== - # Load main trace commitment and re-seed with it - # - # Cycles: 56 - padw - adv_loadw - exec.constants::main_trace_com_ptr mem_storew_be - # => [main_trace_commitment, is_aux_trace, ...] - exec.random_coin::reseed - # => [is_aux_trace, ...] - - # If auxiliary segment exists, generate auxiliary randomness and reseed with commitment - # to auxiliary segment - if.true - # Draw random ExtFelt for the auxiliary trace - # - # Cycles: 12 - exec.random_coin::generate_aux_randomness - # => [...] - - # Reseed with auxiliary trace commitment - # - # Cycles: 64 - padw - adv_loadw - exec.constants::aux_trace_com_ptr mem_storew_be - exec.random_coin::reseed - # => [...] - end + # The AIR-specific implementation handles: drawing aux randomness, reseeding with the + # aux trace commitment, and absorbing aux trace boundary values into the transcript. + # For AIRs without an auxiliary trace, the implementation is a no-op. + exec.utils::observe_aux_trace + # => [...] #============================================================================================== # III) Draw constraint composition coefficients @@ -112,13 +95,14 @@ pub proc verify # and generate the Out-of-Domain (OOD) challenge z #============================================================================================== - # Reseed with constraint composition polynomial commitment + # Reseed with constraint composition polynomial commitment. # - # Cycles: 88 + 18 * log(trace_length) - padw - adv_loadw - exec.constants::composition_poly_com_ptr mem_storew_be - exec.random_coin::reseed + # SAFETY: reseed_direct requires input_len=0 (see SAFETY note above for rationale). + # Guaranteed here because generate_constraint_composition_coefficients only samples + # (decrements output_len) and never observes (input_len stays 0). + padw adv_loadw + exec.constants::composition_poly_com_ptr mem_storew_le + exec.random_coin::reseed_direct exec.random_coin::generate_z_zN # => [...] @@ -126,12 +110,14 @@ pub proc verify # V) Read the OOD frames for the main trace, auxiliary trace and the trace of evaluations # of H over the LDE domain. This also computes some values needed for the computation # of the DEEP queries. + # + # Cycles: 307 #============================================================================================== exec.ood_frames::load_and_horner_eval_ood_frames #============================================================================================== - # VI) Constraint evaluation check + # VI) Draw gamma for reduced_aux_values batching and evaluate constraints #============================================================================================== exec.utils::execute_constraint_evaluation_check @@ -141,11 +127,12 @@ pub proc verify #============================================================================================== #============================================ - # 1) Draw random coefficients for computing - # DEEP composition polynomial. + # 1) Check DEEP PoW and draw random + # coefficients for DEEP composition + # polynomial. #============================================ - # Cycles: 14 + exec.random_coin::check_deep_pow exec.random_coin::generate_deep_composition_random_coefficients #============================================ @@ -157,7 +144,7 @@ pub proc verify # - Number of FRI layers. #============================================ - # Cycles: 77 + # Cycles: 45 exec.helper::generate_fri_parameters # => [...] @@ -167,7 +154,7 @@ pub proc verify # computing the degree respecting projection #============================================ - # Cycles: 40 + 108 * num_fri_layers + # Cycles: 21 + 225 * num_fri_layers exec.helper::load_fri_layer_commitments # => [...] @@ -177,19 +164,16 @@ pub proc verify #============================================ # Cycles: - # 1- Remainder polynomial of degree less - # than 64: 157 - # 2- Remainder polynomial of degree less - # than 128: 191 + # 1- Remainder polynomial of degree less than 64: 156 + # 2- Remainder polynomial of degree less than 128: 188 exec.helper::load_and_verify_remainder # => [...] #============================================ - # 5) Check PoW nonce + # 5) Check FRI Queries PoW nonce #============================================ - # Cycles: 78 - exec.random_coin::check_pow + exec.random_coin::check_query_pow # => [...] #============================================ @@ -201,11 +185,11 @@ pub proc verify # the first layer commitment and the total number of queries. exec.helper::compute_query_pointer - # Draw random query indices + # Cycles: ~134 * num_queries exec.random_coin::generate_list_indices # => [...] - # Compute deep composition polynomial queries + # Cycles: ~348 * num_queries exec.deep_queries::compute_deep_composition_polynomial_queries # => [...] @@ -216,7 +200,7 @@ pub proc verify # Call FRI verifier # # Cycles: - # 1- Remainder of size 64: 18 + num_queries * (107 + num_layers * 83) - # 2- Remainder of size 128: 18 + num_queries * (140 + num_layers * 83) + # 1- Remainder of size 64: 22 + num_queries * (43 + num_layers * 93) + # 2- Remainder of size 128: 22 + num_queries * (75 + num_layers * 93) exec.frie2f4::verify end diff --git a/crates/lib/core/asm/sys/vm/aux_trace.masm b/crates/lib/core/asm/sys/vm/aux_trace.masm new file mode 100644 index 0000000000..0e3ad79f2f --- /dev/null +++ b/crates/lib/core/asm/sys/vm/aux_trace.masm @@ -0,0 +1,81 @@ +use miden::core::crypto::hashes::poseidon2 +use miden::core::stark::constants +use miden::core::stark::random_coin + +#! Observes the auxiliary trace for the Miden VM AIR. +#! +#! Draws auxiliary randomness, reseeds the transcript with the auxiliary trace commitment, +#! and absorbs the 4 words of auxiliary trace boundary values (8 aux columns, each an +#! extension field element = 16 base field elements = 4 words). +#! +#! The advice provider must supply exactly 5 words in order: +#! [commitment, W0, W1, W2, W3] +#! +#! The commitment is stored at aux_trace_com_ptr and the boundary values at +#! aux_bus_boundary_ptr (sequentially). +#! +#! Precondition: input_len=0 (guaranteed by the preceding reseed_direct in the generic verifier). +#! Postcondition: input_len=0, output_len=8. +#! +#! Input: [...] +#! Output: [...] +pub proc observe_aux_trace + # Draw random extension field elements for the auxiliary trace. + exec.random_coin::generate_aux_randomness + # => [...] + + # Assert precondition: input buffer must be empty. + exec.constants::random_coin_input_len_ptr mem_load + assertz.err="observe_aux_trace: input buffer must be empty" + + # Reseeding clears the output buffer. + push.0 exec.constants::random_coin_output_len_ptr mem_store + + # --- Permutation 1: Absorb [COM, W0] --- + + padw adv_loadw + exec.constants::aux_trace_com_ptr mem_storew_le + # => [COM, ...] + + padw adv_loadw + exec.constants::aux_bus_boundary_ptr mem_storew_le + # => [W0, COM, ...] + + swapw + exec.random_coin::get_capacity + movdnw.2 + exec.poseidon2::permute + # => [R1', R2', C', ...] + + # --- Permutation 2: Absorb [W1, W2] --- + + # Overwrite R2' with W1, then R1' with W2. + swapw adv_loadw + exec.constants::aux_bus_boundary_ptr add.4 mem_storew_le + # => [W1, R1', C', ...] + + swapw adv_loadw + exec.constants::aux_bus_boundary_ptr add.8 mem_storew_le + # => [W2, W1, C', ...] + + swapw + exec.poseidon2::permute + # => [R1'', R2'', C'', ...] + + # --- Permutation 3: Absorb [W3] into rate slot 1 only --- + + # Overwrite R1'' with W3 from advice, keeping R2'' and C''. + adv_loadw + exec.constants::aux_bus_boundary_ptr add.12 mem_storew_le + # => [W3, R2'', C'', ...] + + exec.poseidon2::permute + # => [R1_final, R2_final, C_final, ...] + + # Store final sponge state. + exec.random_coin::store_random_coin_state + # => [...] + + # Mark output buffer as full (8 elements available for sampling). + push.8 exec.constants::random_coin_output_len_ptr mem_store +end diff --git a/crates/lib/core/asm/sys/vm/constraints_eval.masm b/crates/lib/core/asm/sys/vm/constraints_eval.masm index 93fbb8ee07..9cc4fd287c 100644 --- a/crates/lib/core/asm/sys/vm/constraints_eval.masm +++ b/crates/lib/core/asm/sys/vm/constraints_eval.masm @@ -5,30 +5,23 @@ use miden::core::stark::utils # CONSTANTS # ================================================================================================= -# Number of constraints, both boundary and transitional -const NUM_CONSTRAINTS = 6 - -# Number of inputs to the constraint evaluation circuit -const NUM_INPUTS_CIRCUIT = 244 +# Number of READ variables (inputs + constants) for the constraint evaluation circuit. +# Breakdown: 270 READ slots + 302 constants = 572 +# This value must match AceConfig and the layout in `constants.masm`. +# If NUM_VAR_LEN_PI_GROUPS changes, this must be regenerated via ace-codegen. +const NUM_INPUTS_CIRCUIT = 572 # Number of evaluation gates in the constraint evaluation circuit -const NUM_EVAL_GATES_CIRCUIT = 108 +const NUM_EVAL_GATES_CIRCUIT = 5588 # Max cycle length for periodic columns -const MAX_CYCLE_LEN_LOG = 3 - -# --- constant getters -------------------------------------------------------- - -proc get_num_constraints - push.NUM_CONSTRAINTS -end +const MAX_CYCLE_LEN_LOG = 4 # ERRORS # ================================================================================================= const ERR_FAILED_TO_LOAD_CIRCUIT_DESCRIPTION = "failed to load the circuit description for the constraints evaluation check" - # CONSTRAINT EVALUATION CHECKER # ================================================================================================= @@ -36,17 +29,17 @@ const ERR_FAILED_TO_LOAD_CIRCUIT_DESCRIPTION = "failed to load the circuit descr #! chiplet. #! #! The circuit description is hardcoded into the verifier using its commitment, which is computed as -#! the sequential hash of its description using Poseidon2 hasher. The circuit description, containing both -#! constants and evaluation gates description, is stored at the contiguous memory region starting -#! at `ACE_CIRCUIT_PTR`. The variable part of the circuit input is stored at the contiguous memory +#! the sequential hash of its description using Poseidon2 hasher. The circuit description, +#! containing both constants and evaluation gates description, is stored starting at +#! `ACE_CIRCUIT_STREAM_PTR` (right after the circuit inputs). The evaluation gates portion begins at +#! `ACE_CIRCUIT_PTR`. The variable part of the circuit input is stored at the contiguous memory #! region starting at `pi_ptr`. The (variable) inputs to the circuit are laid out such that the #! aforementioned memory regions are together contiguous with the (variable) inputs section. #! #! Inputs: [] #! Outputs: [] pub proc execute_constraint_evaluation_check() - # Compute and store at the appropriate memory location the auxiliary inputs needed by - # the arithmetic circuit. + # Compute and store all stark vars at the appropriate memory location. push.MAX_CYCLE_LEN_LOG exec.utils::set_up_auxiliary_inputs_ace # => [] @@ -81,9 +74,9 @@ end proc load_ace_circuit_description push.CIRCUIT_COMMITMENT adv.push_mapval - exec.constants::get_arithmetic_circuit_ptr + exec.constants::ace_circuit_stream_ptr padw padw padw - repeat.14 + repeat.774 adv_pipe exec.poseidon2::permute end @@ -93,121 +86,782 @@ proc load_ace_circuit_description # => [] end - # CONSTRAINT EVALUATION CIRCUIT DESCRIPTION # ================================================================================================= adv_map CIRCUIT_COMMITMENT = [ - 1, - 0, - 0, - 0, - 2305843126251553075, - 114890375379, - 2305843283017859381, - 2305843266911732021, - 1152921616275996777, - 2305843265837990197, - 1152921614128513127, - 2305843319525081397, - 1152921611981029477, - 2305843318451339573, - 1152921609833545827, - 2305843317377597749, - 1152921607686062177, - 2305843316303855925, - 1152921605538578527, - 1152921604464836831, - 1152921614128513128, - 1152921602317353060, - 1152921601243611234, - 1152921600169869408, - 1152921599096127582, - 1152921598022385920, - 2305843101555490908, - 1152921604464836735, - 1152921614128513129, - 1152921593727418468, - 1152921592653676642, - 1152921591579934816, - 1152921590506192990, - 1152921776263528702, - 270582939757, - 1152921587284967502, - 1152921586211225679, - 1152921611981029479, - 1152921584063742050, - 1152921582990000224, - 1152921581916258398, - 1152921580842516556, - 2305843084375621707, - 1152921609833545829, - 1152921577621291104, - 1152921576547549278, - 315680096365, - 1152921574400065828, - 314606354541, - 1152921572252581952, - 1152921571178840130, - 2305843074711945285, - 1152921607686062179, - 1152921567957614686, - 1152921566883872830, - 2305843070416977980, - 1152921605538578529, - 1152921563662647358, - 2305843067195752504, - 1152921571178840159, - 2305843065048268853, - 2305843063974527060, - 53687091285, - 333933707485, - 117037858930, - 118111600754, - 120259084402, - 117037858929, - 1152921557220196467, - 2305843055384592490, - 1152921553998970927, - 1152921548630261805, - 1152921547556519982, - 1152921546482778154, - 1152921628087156851, - 1152921544335294771, - 1152921544335294579, - 1152921542187811039, - 2305843045720916004, - 1152921542187810931, - 1152921538966585392, - 2305843042499690529, - 1152921551851487278, - 1152921535745359902, - 2305843039278465062, - 1152921538966585459, - 1152921532524134623, - 1152921551851487279, - 1152921530376650777, - 2305843033909755931, - 1152921625939673300, - 2305843031762272469, - 1152921526081683569, - 2305843029614788822, - 1152921523934199921, - 2305843027467305175, - 1152921521786716273, - 2305843025319821528, - 1152921519639232625, - 2305843023172337881, - 1152921517491748977, - 2305843021024854234, - 1152921515344265329, - 2305843018877370587, - 1152921548630261804, - 1152921512123039752, - 6442450966, - 1152921509975556101, - 1152921508901814276, - 1152921507828072451, - 1152921506754330626, - 1152921505680588801 + 17293822565076172801,0,0,0,11529215043384115201,0,299140176084720,0, + 1152921504339460096,0,72039928838487824,0,1152903912152367104,0,18374422528162594833,0, + 1152921573057888240,0,71758595593666800,0,18446480251047444721,0,1152921504337362944,0, + 18374668818767151377,0,1152939096524455936,0,72356588187222032,0,1152921435618934800,0, + 18374950426885684977,0,10376293539045703681,0,1224679958200254480,0,18446744069413535745,0, + 1080600096228311280,0,18446726477228539905,0,1153185451552472816,0,18446744000695107601,0, + 1080881438063066896,0,1081127728667623440,0,1048576,0,1225278234257456880,0, + 17592186044416,0,1152622510189117680,0,68719476720,0,1224996617548988688,0, + 256,0,4294967296,0,72057594037927936,0,281474976645120,0, + 1152921504338411520,0,18446744069414584065,0,18446744065119617025,0,18374686475376656385,0, + 18446462594437939201,0,13506450331346961525,0,1220060926486833092,0,15289945474699020367,0, + 10080285661408854814,0,7056201302604023426,0,13870961636502358441,0,11181970014612250858,0, + 2263989043493551858,0,7021945588023361315,0,3637755601080351657,0,11994061785393688135,0, + 15933964477054035317,0,14303114990560505081,0,13712991196315763967,0,5649818220516819012,0, + 2281722520371668701,0,16179464883396004044,0,5508577990254168895,0,12900944264650033356,0, + 1790798523172755581,0,648527659962338404,0,7000883374074734167,0,11976864282148750745,0, + 4345701392714390734,0,14648803090404994705,0,2559539914729344226,0,8063653970832556457,0, + 8752889350027678997,0,5399077151114037649,0,14286750482834966066,0,9533880535744934927,0, + 9040200629101104401,0,8830665781029957836,0,14880754969559215189,0,10115872490820423390,0, + 122922138494589770,0,6049475111361333809,0,3816230378359147739,0,16485436779640540592,0, + 15999160671148163603,0,7793391273136215850,0,7375453422563383092,0,15727465800456661448,0, + 17604474207884486051,0,16311278769261608080,0,12229019500121537086,0,5115474250774582499,0, + 9853196461104309197,0,17881666388449638104,0,16666394781378211508,0,13485721503250451362,0, + 17538579226039010365,0,9324358263331059291,0,9431224685432275531,0,14352769487075254372,0, + 10394000667754223111,0,3863742218954159982,0,9189088713770063131,0,17882368282699348817,0, + 2669874548580171960,0,11609388145590593001,0,3715890505894502683,0,9146314019201542231,0, + 9494531110289004550,0,1215846508483385725,0,10769472835802134382,0,15120084924436367840,0, + 2409854718166686917,0,12611807655159677898,0,6194600797308869879,0,15985800743640437130,0, + 13706629396021380488,0,17226312540324137322,0,17076998920676414740,0,10714455172347297500,0, + 10737646911324969129,0,15549715087232586323,0,14098088243370493341,0,12378208969032677709,0, + 7362195708571034250,0,1942698693963992628,0,7528813266379185038,0,9937467207233454003,0, + 16664378465012507901,0,4872475500441857048,0,14329983667734104309,0,5783837547550234175,0, + 17085344416645756047,0,14235112306529067868,0,13792136309666777285,0,6563429178210015618,0, + 6034349441124231390,0,11452553603455937636,0,2866957227454593452,0,9124371651607698999,0, + 4056726964389686874,0,681014837720862499,0,3303119831890681118,0,12294872131488898818,0, + 9562093600544865194,0,10290167051015114909,0,3610766868984241006,0,7399723478196938523,0, + 7940490424257645340,0,7566343854685332757,0,3118114980642221848,0,36505548729526372,0, + 14881263750443725044,0,2471080946433257851,0,7229836574508822565,0,10172039981998141256,0, + 1266061798995870870,0,13696472808521858472,0,8172540520828620197,0,6066700792379843120,0, + 2902435192254421716,0,17243161309620410771,0,11566354596024378109,0,18436205014769240465,0, + 12942016006619377473,0,4428364532927351915,0,17550708978324807967,0,3227074310485866338,0, + 10526784394206789892,0,1012812621152338313,0,10627553279586214293,0,13544218254559197214,0, + 3366616676571496961,0,1185926521574269147,0,2797137607232632471,0,7378476058878128673,0, + 11472823999425505273,0,6426770371114890086,0,8344543475752135508,0,2037711414516144606,0, + 1002212915765425025,0,15429253385178963727,0,1884175150292008318,0,8517525717352190773,0, + 17078912966192349589,0,3702396818487532663,0,16813028956792564865,0,11770956504672294412,0, + 15502925789736377359,0,10108618202177051889,0,10058246739382562279,0,2898550573977775146,0, + 15414823412825521822,0,13635735147884026055,0,8534910183325198132,0,6894925738120887046,0, + 1155604511900039128,0,14183576722912116648,0,17276011797343470775,0,11800013335275200655,0, + 17472205982442522728,0,4695754115444372153,0,5532398984513739978,0,5543895808451907073,0, + 12763612101924866144,0,3932388051002360716,0,12567328766287897212,0,1898697119458861645,0, + 2757139537974467281,0,9066915857827737439,0,3122781916728353510,0,7367915640346560395,0, + 9477007979080135218,0,10093927718065036845,0,7537861698812080491,0,15882320805449904668,0, + 7372913098978788409,0,14188709260829449414,0,6664771524923680343,0,4438926477479481854,0, + 17369996407673990512,0,3917705574714323619,0,2778663024013093070,0,6365225074103382184,0, + 6394114259051379208,0,1544555490264202584,0,15044592435296754555,0,4793660808636315108,0, + 14101374348988450957,0,12906295516933811002,0,16165137851232782658,0,2914102009105693254,0, + 16882131584667299040,0,7993232952439841307,0,4805821119940375546,0,17571690224505910672,0, + 281377096927929017,0,16140901060737761281,0,2305843008676823041,0,2097152,0, + 18446708885042495489,0,137438953440,0,18446744069412487169,0,35184372088832,0, + 18446743931975630881,0,1,0,65535,0,3,0, + 9,0,27,0,81,0,243,0, + 729,0,2187,0,16,0,8,0, + 7,0,4,0,18446462594437873665,0,18446744069414584320,0, + 281474976710656,0,2,0,4294967295,0,65536,0, + 128,0,5,0,6,0,14102670999874605824,0, + 15585654191999307702,0,940187017142450255,0,8747386241522630711,0,6750641561540124747,0, + 7440998025584530007,0,6136358134615751536,0,12413576830284969611,0,11675438539028694709,0, + 17580553691069642926,0,892707462476851331,0,15167485180850043744,0,17850970025369572891,0, + 0,1,32,0,64,0,28,0, + 12,0,1073741824,0,1152921504606846976,0,94,0, + 19,0,41,0,33,0,23,0, + 31,0,87,0,84,0,85,0, + 108,0,4294967294,0,2147483648,0,88,0, + 92,0,104,0,35,0,20,0, + 48,0,10,0,1152927827872454409,2305849008209270529,1152927502528681737,2305849006061786881, + 1152927500381198089,2305849003914303233,1152927498233714441,2305849001766819585,1152927496086230793,2305848999619335937,1152927493938747145,2305848997471852289, + 1152927491791263497,2305848995324368641,1152927489643779849,2305848993176884993,1152927487496296201,2305848991029401345,1152927485348812553,2305848988881917697, + 1152927483201328905,2305848986734434049,1152927481053845257,2305848984586950401,1152927478906361609,2305848982439466753,1152927476758877961,2305848980291983105, + 1152927474611394313,2305848978144499457,1152927810692585225,2305848975997015794,1152927470316427017,2305848973849532147,1152927468168943369,2305848971702048500, + 1152927466021459721,2305848969554564853,1152927463873976073,2305848967407081206,1152927461726492425,2305848965259597559,1152927459579008777,1152927458505266953, + 2305848962038372088,1152927456357783305,2305848959890888441,1152927454210299657,2305848957743404794,1152927452062816009,2305848955595921147,1152927449915332361, + 2305848953448437500,1152927447767848713,2305848951300953853,1152927445620365065,2305848949153470206,1152927443472881417,2305848947005986559,1152927794586457865, + 2305848944858502883,1152927439177914121,2305848942711019236,1152927437030430473,2305848940563535589,1152927434882946825,2305848938416051942,1152927432735463177, + 2305848936268568295,1152927430587979529,2305848934121084648,1152927428440495881,2305848931973601025,1152927426293012233,2305848929826117353,1152927424145528585, + 2305848927678633706,1152927421998044937,2305848925531150059,1152927419850561289,2305848923383666412,1152927417703077641,2305848921236182765,1152927415555593993, + 2305848919088699118,1152927413408110345,2305848916941215471,1152927411260626697,2305848914793731824,1152927784922781449,2305848912646248170,1152927406965659401, + 2305848910498764506,1152927404818175753,2305848908351280876,1152927402670692105,2305848906203797211,1152927400523208457,2305848904056313582,1152927398375724809, + 2305848901908829916,1152927396228241161,2305848899761346269,1152927394080757513,2305848897613862622,1152927391933273865,2305848895466378979,1152927389785790217, + 2305848893318895327,1152927387638306569,2305848891171411685,1152927385490822921,2305848889023928032,1152927383343339273,2305848886876444391,1152927381195855625, + 2305848884728960737,1152927379048371977,2305848882581477121,1152927767742912265,2305848880433993418,1152927374753404681,2305848878286509771,1152927372605921033, + 2305848876139026124,1152927370458437385,2305848873991542477,1152927368310953737,2305848871844058830,1152927366163470089,2305848869696575183,1152927364015986441, + 2305848867549091536,1152927361868502793,2305848865401607889,1152927359721019145,2305848863254124242,1152927357573535497,2305848861106640595,1152927355426051849, + 2305848858959156948,1152927353278568201,2305848856811673301,1152927351131084553,2305848854664189654,1152927348983600905,2305848852516706007,1152927346836117257, + 2305848850369222360,1152927750563043081,2305848848221738682,1152927342541149961,2305848846074255035,1152927340393666313,2305848843926771388,1152927338246182665, + 2305848841779287741,1152927336098699017,2305848839631804094,1152927333951215369,2305848837484320447,1152927331803731721,2305848835336836800,1152927329656248073, + 2305848833189353153,1152927327508764425,2305848831041869506,1152927325361280777,2305848828894385859,1152927323213797129,2305848826746902212,1152927321066313481, + 2305848824599418565,1152927318918829833,2305848822451934918,1152927316771346185,2305848820304451271,1152927314623862537,2305848818156967624,1152927733383173897, + 2305848816009483946,1152927310328895241,2305848813862000299,1152927308181411593,2305848811714516652,1152927306033927945,2305848809567033005,1152927303886444297, + 2305848807419549358,1152927301738960649,2305848805272065711,1152927299591477001,2305848803124582064,1152927297443993353,2305848800977098417,1152927295296509705, + 2305848798829614770,1152927293149026057,2305848796682131123,1152927291001542409,2305848794534647476,1152927288854058761,2305848792387163829,1152927286706575113, + 2305848790239680182,1152927284559091465,2305848788092196535,1152927282411607817,2305848785944712888,1152927716203304713,2305848783797229210,1152927278116640521, + 2305848781649745563,1152927275969156873,2305848779502261916,1152927273821673225,2305848777354778269,1152927271674189577,2305848775207294622,1152927269526705929, + 2305848773059810975,1152927267379222281,2305848770912327328,1152927265231738633,2305848768764843681,1152927263084254985,2305848766617360034,1152927260936771337, + 2305848764469876387,1152927258789287689,2305848762322392740,1152927256641804041,2305848760174909093,1152927254494320393,2305848758027425446,1152927252346836745, + 2305848755879941799,1152927250199353097,2305848753732458152,1152927699023435529,2305848751584974474,1152927245904385801,2305848749437490827,1152927243756902153, + 2305848747290007180,1152927241609418505,2305848745142523533,1152927239461934857,2305848742995039886,1152927237314451209,2305848740847556239,1152927235166967561, + 2305848738700072592,1152927233019483913,2305848736552588945,1152927230872000265,2305848734405105298,1152927228724516617,2305848732257621651,1152927226577032969, + 2305848730110138004,1152927224429549321,2305848727962654357,1152927222282065673,2305848725815170710,1152927220134582025,2305848723667687063,1152927217987098377, + 2305848721520203416,1152927681843566345,2305848719372719738,1152927213692131081,2305848717225236091,1152927211544647433,2305848715077752444,1152927209397163785, + 2305848712930268797,1152927207249680137,2305848710782785150,1152927205102196489,2305848708635301503,1152927202954712841,2305848706487817856,1152927200807229193, + 2305848704340334209,1152927198659745545,2305848702192850562,1152927196512261897,2305848700045366915,1152927194364778249,2305848697897883268,1152927192217294601, + 2305848695750399621,1152927190069810953,2305848693602915974,1152927187922327305,2305848691455432327,1152927185774843657,2305848689307948680,1152927664663697161, + 2305848687160465002,1152927181479876361,2305848685012981355,1152927179332392713,2305848682865497708,1152927177184909065,2305848680718014061,1152927175037425417, + 2305848678570530414,1152927172889941769,2305848676423046767,1152927170742458121,2305848674275563120,1152927168594974473,2305848672128079473,1152927166447490825, + 2305848669980595826,1152927164300007177,2305848667833112179,1152927162152523529,2305848665685628532,1152927160005039881,2305848663538144885,1152927157857556233, + 2305848661390661238,1152927155710072585,2305848659243177591,1152927153562588937,2305848657095693944,1152927647483827977,2305848654948210266,1152927149267621641, + 2305848652800726619,1152927147120137993,2305848650653242972,1152927144972654345,2305848648505759325,1152927142825170697,2305848646358275678,1152927140677687049, + 2305848644210792031,1152927138530203401,2305848642063308384,1152927136382719753,2305848639915824737,1152927134235236105,2305848637768341090,1152927132087752457, + 2305848635620857443,1152927129940268809,2305848633473373796,1152927127792785161,2305848631325890149,1152927125645301513,2305848629178406502,1152927123497817865, + 2305848627030922855,1152927121350334217,2305848624883439208,1152927630303958793,2305848622735955530,1152927117055366921,2305848620588471883,1152927114907883273, + 2305848618440988236,1152927112760399625,2305848616293504589,1152927110612915977,2305848614146020942,1152927108465432329,2305848611998537295,1152927106317948681, + 2305848609851053648,1152927104170465033,2305848607703570001,1152927102022981385,2305848605556086354,1152927099875497737,2305848603408602707,1152927097728014089, + 2305848601261119060,1152927095580530441,2305848599113635413,1152927093433046793,2305848596966151766,1152927091285563145,2305848594818668119,1152927089138079497, + 2305848592671184472,1152927613124089609,2305848590523700794,1152927084843112201,2305848588376217147,1152927082695628553,2305848586228733500,1152927080548144905, + 2305848584081249853,1152927078400661257,2305848581933766206,1152927076253177609,2305848579786282559,1152927074105693961,2305848577638798912,1152927071958210313, + 2305848575491315265,1152927069810726665,2305848573343831618,1152927067663243017,2305848571196347971,1152927065515759369,2305848569048864324,1152927063368275721, + 2305848566901380677,1152927061220792073,2305848564753897030,1152927059073308425,2305848562606413383,1152927056925824777,2305848560458929736,1152927595944220425, + 2305848558311446058,1152927052630857481,2305848556163962411,1152927050483373833,2305848554016478764,1152927048335890185,2305848551868995117,1152927046188406537, + 2305848549721511470,1152927044040922889,2305848547574027823,1152927041893439241,2305848545426544176,1152927039745955593,2305848543279060529,1152927037598471945, + 2305848541131576882,1152927035450988297,2305848538984093235,1152927033303504649,2305848536836609588,1152927031156021001,2305848534689125941,1152927029008537353, + 2305848532541642294,1152927026861053705,2305848530394158647,1152927024713570057,2305848528246675000,1152927578764351241,2305848526099191322,1152927020418602761, + 2305848523951707675,1152927018271119113,2305848521804224028,1152927016123635465,2305848519656740381,1152927013976151817,2305848517509256734,1152927011828668169, + 2305848515361773087,1152927009681184521,2305848513214289440,1152927007533700873,2305848511066805793,1152927005386217225,2305848508919322146,1152927003238733577, + 2305848506771838499,1152927001091249929,2305848504624354852,1152926998943766281,2305848502476871205,1152926996796282633,2305848500329387558,1152926994648798985, + 2305848498181903911,1152926992501315337,2305848496034420264,1152927836462389001,1152927577690608628,2305848492813194776,1152926987132605428,2305848490665711128, + 1152926984985121780,2305848488518227480,1152926982837638132,2305848486370743832,1152926980690154484,2305848484223260184,1152926978542670836,2305848482075776536, + 1152926976395187188,2305848479928292888,1152927570174415860,2305848477780809234,1152926972100219892,2305848475633325587,1152926969952736244,2305848473485841944, + 1152926967805252596,2305848471338358292,1152926965657768948,2305848469190874645,1152926963510285300,2305848467043390998,1152926961362801652,2305848464895907351, + 6064493828016,1152926958141577136,6064493827996,1152926955994093468,1152926957067835147,2305848458453455828,2305849498909284272,6064493827025, + 1152926950625383377,1152926952772867851,2305848453084746703,2305849387240134472,6064493827020,1152926945256675248,1152926944182933254,1152926947404158731, + 2305848446642295753,1152927904108124060,1152926939887965958,1152926940961707787,2305848442347328453,5447092278800,1152926935592998728,1152926934519256838, + 1152926936666740491,2305848436978619328,1152926935592998708,1152926930224289542,1152926931298031371,2305848432683652028,6064493828015,1152926925929322415, + 1152926924855579586,1152926927003064075,2305848427314942903,1152928014703530946,6064493828014,1152926919486871470,1152926918413128628,1152926921634354955, + 2305848420872491953,1152928013629789108,6064493828013,1152926913044420525,1152926911970677678,1152926915191904011,2305848414430041003,1152928012556047278, + 6064493828012,1152926906601969580,1152926905528226728,1152926908749453067,2305848407987590053,6510096684871,1152926901233259444,1152926900159518470, + 1152926902307002123,2305848402618880928,6509022943046,1152926895864550318,1152926894790809350,1152926896938293003,2305848397250171803,6507949201221, + 1152926890495841192,1152926889422100230,1152926891569583883,2305848391881462678,1152928011482305448,6506875459396,1152926884053390227,1152926882979649286, + 1152926886200874763,2305848385439011728,1152927834314905520,1152926879758423819,2305848382217786253,1152927834314905500,1152926876537198347,2305848378996560778, + 1152927834314904505,1152926873315972875,2305848375775335303,1152927834314904499,1152926870094747403,2305848372554109828,1152927834314904493,1152926866873521931, + 2305848369332884353,1152927834314904487,1152926863652296459,2305848366111658878,1152928070538106632,1152926860431070987,2305848362890433403,2305849575144953360, + 5351529256827,1152926855062361862,1152926857209845515,2305848357521724278,6554120099344,1152928060874430425,1152926849693651827,1152928039399592817, + 6557341324816,1152926846472426354,6558415066640,1152926844324942702,1152926843251201991,2305848346784306032,5351529256826,1152926840029975402, + 1152926838956234502,1152926851841136395,2305848341415596903,6556267582992,1152926834661267417,1152926833587524467,1152926832513783750,1152926831440041850, + 1152926830366299910,1152926835735009035,2305848332825662303,2305848336046887792,2305848330678178667,6555193841168,1152926823923848036,1152926822850107352, + 1152926821776365510,2305848325309469531,5315022034448,6564857517946,1152926817481397077,1152926816407656198,1152926827145074443,2305848318867018578, + 6550898874233,1152926812112687978,1152926811038947078,1152926813186430731,2305848313498309453,6549825132408,1152926806743978858,1152926805670237958, + 1152926807817721611,2305848308129600328,6548751390583,1152926801375269738,1152926800301528838,1152926802449012491,2305848302760891203,6547677648758, + 1152926796006560618,1152926794932819718,1152926797080303371,2305848297392182078,2305848325309469546,5286031005200,6563783776121,1152926788490367802, + 1152926787416626950,1152926791711594251,2305848289875989303,6562710034296,1152926783121658682,1152926782047917830,1152926784195401483,2305848284507280178, + 6561636292471,1152926777752949562,1152926776679208710,1152926778826692363,2305848279138571053,6560562550646,1152926772384240442,1152926771310499590, + 1152926773457983243,2305848273769861928,1152928016851015432,1152926768089274123,2305848270548636453,6063420086193,1152926763794306823,1152926764868048651, + 2305848266253669153,6512244168521,6064493826846,1152926758425596702,6062346343198,1152926756278113052,6061272601374,1152926754130629402, + 6060198859550,1152926751983145752,6059125117726,1152926749835662102,6058051375902,1152926747688178452,6056977634078,1152926745540694802, + 6055903892254,1152926743393211152,1152926742319470342,1152926760573081355,2305848244778832653,6553046357520,1152926738024502131,6551972615696, + 1152926735877018377,1152926822850106223,1152926733729534727,1152926732655793005,1152928056579461898,1152926730508309363,1152926833587525595,1152926728360825602, + 2305848231893930756,1152926733729535964,1152926725139601351,1152926823923849178,1152926722992117723,1152926721918374765,1152926720844634055,2305848224377737981, + 2305848223303996159,1152926721918375900,1152926716549666759,1152926738024503256,1152926714402181896,1152928061948171122,1152926712254698227,1152926711180957660, + 2305848214714061557,1152926833587525592,1152926707959732166,1152926849693652952,1152926705812248518,2305848209345352429,2305848208271610607,2305848207197868791, + 6545530164752,1152926700443538263,2305848203976643440,2305848202902901480,1152928057653203827,1152926696148570888,1152926695074829062,1152926694001087341, + 1152926728360825607,1152926734803276654,2305848195386708703,1152926713328440070,1152926822850107355,1152926687558636275,2305848191091741404,2305848190017999581, + 1152926722992116591,1152926683263668979,1152926713328440059,2305848185723032278,1152926713328440065,2305848183575548628,2305848182501806808,1152926676821219292, + 2305848180354323168,1152926833587524463,1152926673599992546,1152926672526251996,1152926695074829166,1152926670378768348,2305848173911872204,2305848172838130383, + 1152926695074829042,1152926666083799917,1152926666083801052,2305848168543163078,1152926683263669101,1152926661788833735,1152926683263670236,1152926659641350087, + 2305848163174453954,2305848162100712132,2305848161026970312,1152928050137011031,1152926673599992685,1152926653198899143,2305848156732003004,2305848155658261355, + 2305848154584519357,2305848153510777572,1152926647830189917,1152928038325850852,1152928037252108983,2305848149215810228,5138928374453,1152926642461480710, + 1152926739098244875,2305848144920842928,1152926732655794140,2305848142773359364,1152926687558636295,1152926636019028845,2305848139552133804,1152926636019029980, + 2305848137404650153,1152926683263668999,1152926630650319725,2305848134183424679,1152926630650320860,2305848132035941028,1152926721918374663,1152926625281610605, + 2305848128814715554,1152926625281611740,2305848126667231903,5226975203997,2305848124519748324,1152926694001088476,2305848122372264672,1152926687558636258, + 1152926615617934189,2305848119151039129,1152926615617935324,2305848117003555478,1152926683263668962,1152926610249225069,2305848113782330004,1152926610249226204, + 2305848111634846353,1152926695074829051,1152926604880515949,2305848108413620879,1152926604880517084,2305848106266137228,5188320498314,2305848104118653623, + 2305848103044911771,1152928057653204952,1152926596290581256,1152926595216839430,1152926594143097709,1152926594143098844,2305848096602460803,1152926595216839387, + 1152926589848130413,2305848093381235329,1152926589848131548,2305848091233751678,1152926595216839383,1152926584479421293,2305848088012526204,1152926584479422428, + 2305848085865042553,1152926595216839419,1152926579110712173,2305848082643817079,1152926579110713308,2305848080496333428,1152926595216839374,1152926573742003053, + 2305848077275107954,1152926573742004188,2305848075127624303,1152926595216839425,1152926568373293933,2305848071906398829,1152926568373295068,2305848069758915178, + 1152926595216839534,1152926563004584813,2305848066537689704,1152926563004585948,2305848064390206053,1152926595216839410,1152926557635875693,2305848061168980579, + 1152926557635876828,2305848059021496928,1152926728360826844,1152926552267167687,2305848055800271454,1152926676821218157,2305848053652787803,2305848052579046023, + 1152926546898458460,1152926618839160772,1152928036178367112,2305848048284078678,1152926547972200389,2305848046136595028,5035849159255,1152926539382265606, + 1152926639240255243,2305848041841627728,1152926673599992583,1152926535087297389,1152926729434567514,2305848037546660428,2305848036472918683,1152926695074829057, + 1152926529718588269,1152926729434567534,2305848032177951303,1152926712254698242,2305848030030467653,1152926691853604828,5018669290051,2305848026809242248, + 2305848025735500361,1152926673599992578,2305848023588016729,2305848022514274879,1152926516833687387,1152926530792331203,1152928035104625216,2305848018219307578, + 1152926517907429316,2305848016071823928,5005784388155,1152926509317494534,1152926536161040139,2305848011776856628,2305848035399176927,1152926690779863004, + 4999341938432,2305848007481889344,2305848006408147505,1152926691853603693,4995046971136,2305848003186922045,2305848002113180205,1152926496432592730, + 1152926505022527426,1152928034030883374,2305847997818212903,1152926497506334659,2305847995670729253,4985383293480,1152926488916399878,1152926506096269067, + 2305847991375761953,1152926712254698247,2305847989228278494,1152926713328440174,1152926673599992563,1152926481400207324,2305847984933311004,2305847983859569181, + 1152926822850106227,1152926477105240006,2305847980638343704,2305847979564601905,1152926670378767213,1152926688632379356,4967129682451,2305847975269634606, + 2305847974195892756,1152926690779861869,4962834716416,2305847970974667306,2305847969900925455,1152926464220338009,1152926473884014529,1152928032957141520, + 2305847965605958153,1152926465294079938,2305847963458474503,4953171038730,1152926456704145158,1152926485695174411,2305847959163507203,2305847978490860252, + 1152926686484895708,4946728589056,2305847954868539920,2305847953794798080,1152926688632378221,4942433621760,2305847950573572620,2305847949499830780, + 1152926443819243352,1152926452409178048,1152928031883399677,2305847945204863478,1152926444892985281,2305847943057379828,4932769944055,1152926436303050502, + 1152926453482919691,2305847938762412528,2305847957016023770,1152926682189928412,4926327494400,2305847934467445245,2305847933393703405,1152926686484894573, + 4922032527104,2305847930172477945,2305847929098736105,1152926423418148695,1152926432008083391,1152928030809657834,2305847924803768803,1152926424491890624, + 2305847922656285153,4912368849380,1152926415901955846,1152926433081825035,2305847918361317853,2305847936614929110,1152926681116186588,4905926399744, + 2305847914066350570,2305847912992608730,1152926682189927277,4901631432448,2305847909771383270,2305847908697641430,1152926403017054038,1152926411606988734, + 1152928029735915991,2305847904402674128,1152926404090795967,2305847902255190478,4891967754705,1152926395500861190,1152926412680730379,2305847897960223178, + 1152926481400206189,2305847895812739797,4977867100614,2305847893665255898,1152926529718589404,1152926678968702940,4881230336451,2305847889370288599, + 2305847888296546756,1152926681116185453,4876935370496,2305847885075321299,2305847884001579455,1152926378320992085,1152926387984668605,1152928028662174144, + 2305847879706612153,1152926379394734014,2305847877559128503,4867271692730,1152926370804799238,1152926392279635723,2305847873264161203,2305847892591514323, + 2305847871116677568,1152926678968701805,4859755501312,2305847867895452092,2305847866821710255,1152926361141122900,1152926366509832124,1152928027588432320, + 2305847862526742953,1152926362214864829,2305847860379259303,4850091823530,1152926353624930054,1152926367583573771,2305847856084292003,1152927915919282603, + 1152928027588432304,1152928026514690496,2305847851789324703,1152926362214864828,2305847849641841053,4839354405280,1152926342887511814,1152926350403704587, + 2305847845346873753,1152927914845540779,1152928026514690480,1152928025440948672,2305847841051906453,1152928027588432300,2305847838904422803,4828616987030, + 1152926332150093574,1152926339666286347,2305847834609455503,1152926733729534829,1152926327855126471,2305847831388230172,1152926482473949148,4820027052426, + 2305847828167004592,2305847827093262784,2305847826019520940,1152926320338933585,1152926322486417337,1152928024367206848,2305847821724553603,1152928026514690476, + 2305847819577069953,4809289634180,1152926312822740742,1152926328928868107,2305847815282102653,1152927912698057093,1152928024367206791,1152928023293465024, + 2305847810987135353,1152928025440948652,2305847808839651703,4798552215930,1152926302085322502,1152926309601515275,2305847804544684403,1152927911624315269, + 1152928023293464967,1152928022219723200,2305847800249717103,1152928024367206828,2305847798102233453,4787814797680,1152926291347904262,1152926298864097035, + 2305847793807266153,2305847827093262764,1152926287052937038,1152928022219723143,1152928023293465004,2305847788438557028,4778151121253,1152926281684227846, + 1152926288126678795,2305847784143589728,6054830151605,1152926277389260552,1152926278463002379,2305847779848622428,1152926277389260551,1152926274168035083, + 2305847776627396953,1152928020072240904,1152926270946809611,2305847773406171478,1152928020072240903,1152926267725584139,2305847770184946003,6516539135821, + 2305848336046887786,4757750027792,2305849552596375503,1152926260209390423,4754528801102,1152926258061906256,1152926735877019607,1152926255914423155, + 1152926729434568665,1152926253766940634,2305847757300044104,2305847756226302655,1152926722992117720,1152926249471973318,2305847753005077180,2305847751931335354, + 2305847750857593156,1152928018998497629,1152926244103262527,2305847747636367690,1152926255914424280,2305847745488884316,2305847744415142462,4734127706428, + 6054830151501,1152926236587069775,2305847740120174904,1152926234439587590,1152926264504358667,2305847736898949428,4739496416784,1152926230144618845, + 1152926231218362123,2305847732603982128,6565931259724,1152926225849651513,1152926224775911174,1152926226923394827,2305847727235273003,1152926245177005902, + 1152926220480942385,1152926219407202054,1152926221554685707,2305847721866563878,1152926593069356893,1152926215112234758,1152926216185976587,2305847717571596578, + 6533719005021,1152926210817266306,1152926209743525638,1152926211891009291,2305847712202887453,6532645263197,1152926205448557183,1152926204374816518, + 1152926206522300171,2305847706834178328,6531571521373,1152926200079848061,1152926199006107398,1152926201153591051,2305847701465469203,6530497779549, + 1152926194711138938,1152926193637398278,1152926195784881931,2305847696096760078,6529424037725,1152926189342429816,1152926188268689158,1152926190416172811, + 2305847690728050953,6528350295901,1152926183973720693,1152926182899980038,1152926185047463691,2305847685359341828,6527276554077,1152926178605011571, + 1152926177531270918,1152926179678754571,2305847679990632703,6526202812253,1152926173236302448,1152926172162561798,1152926174310045451,2305847674621923578, + 6524055328605,1152926167867593326,1152926166793852678,1152926168941336331,2305847669253214453,6521907844957,1152926162498884203,1152926161425143558, + 1152926163572627211,2305847663884505328,6519760361309,1152926157130175081,1152926156056434438,1152926158203918091,2305847658515796203,6517612877661, + 1152926151761465958,1152926150687725318,1152926152835208971,2305847653147087078,6565931259741,1152926146392756831,1152926145319016198,1152926147466499851, + 2305847647778377953,1152926205448557132,1152926141024048902,1152926142097790731,2305847643483410653,6533719005020,1152926136729080396,1152926135655339782, + 1152926137802823435,2305847638114701528,1152926200079847980,1152926131360372486,1152926132434114315,2305847633819734228,1152926194711138830,1152926127065405190, + 1152926128139147019,2305847629524766928,1152926189342429691,1152926122770437894,1152926123844179723,2305847625229799628,1152926183973720552,1152926118475470598, + 1152926119549212427,2305847620934832328,1152926178605011413,1152926114180503302,1152926115254245131,2305847616639865028,1152926173236302270,1152926109885536006, + 1152926110959277835,2305847612344897728,6525129070429,1152926105590567342,1152926104516826886,1152926106664310539,2305847606976188603,6533719005019, + 1152926100221858370,1152926099148117766,1152926101295601419,2305847601607479478,6533719005018,1152926094853149232,1152926093779408646,1152926095926892299, + 2305847596238770353,6533719005017,1152926089484440082,1152926088410699526,1152926090558183179,2305847590870061228,6533719005016,1152926084115730943, + 1152926083041990406,1152926085189474059,2305847585501352103,6533719005015,1152926078747021804,1152926077673281286,1152926079820764939,2305847580132642978, + 6533719005014,1152926073378312665,1152926072304572166,1152926074452055819,2305847574763933853,6533719005013,1152926068009603522,1152926066935863046, + 1152926069083346699,2305847569395224728,1152926189342429639,1152926062640895750,1152926063714637579,2305847565100257428,6528350295900,1152926058345927111, + 1152926057272186630,1152926059419670283,2305847559731548303,6527276554075,1152926052977217991,1152926051903477510,1152926054050961163,2305847554362839178, + 6526202812250,1152926047608508871,1152926046534768390,1152926048682252043,2305847548994130053,1152926089484440007,1152926042239801094,1152926043313542923, + 2305847544699162753,6532645263192,1152926037944832455,1152926036871091974,1152926039018575627,2305847539330453628,6531571521367,1152926032576123335, + 1152926031502382854,1152926033649866507,2305847533961744503,6530497779542,1152926027207414215,1152926026133673734,1152926028281157387,2305847528593035378, + 1152926482473948013,1152926021838704829,1152926020764964614,1152926022912448267,2305847523224326253,6524055328604,1152926016469995631,1152926015396255494, + 1152926017543739147,2305847517855617128,6522981586779,1152926011101286511,1152926010027546374,1152926012175030027,2305847512486908003,6521907844954, + 1152926005732577391,1152926004658837254,1152926006806320907,2305847507118198878,1152926021838704794,1152926000363869958,1152926001437611787,2305847502823231578, + 6532645263188,1152925996068900975,1152925994995160838,1152925997142644491,2305847497454522453,6531571521363,1152925990700191855,1152925989626451718, + 1152925991773935371,2305847492085813328,6530497779538,1152925985331482735,1152925984257742598,1152925986405226251,2305847486717104203,6520834103133, + 1152925979962773897,1152925978889033478,1152925981036517131,2305847481348395078,6519760361308,1152925974594064777,1152925973520324358,1152925975667808011, + 2305847475979685953,6518686619483,1152925969225355657,1152925968151615238,1152925970299098891,2305847470610976828,6517612877658,1152925963856646537, + 1152925962782906118,1152925964930389771,2305847465242267703,6533719005009,1152925958487937417,1152925957414196998,1152925959561680651,2305847459873558578, + 6532645263184,1152925953119228297,1152925952045487878,1152925954192971531,2305847454504849453,6531571521359,1152925947750519177,1152925946676778758, + 1152925948824262411,2305847449136140328,6530497779534,1152925942381810057,1152925941308069638,1152925943455553291,2305847443767431203,1152926711180956525, + 1152925937013100733,1152925935939360518,1152925938086844171,2305847438398722078,1152925937013100650,1152925931644393222,1152925932718135051,2305847434103754778, + 1152925937013100645,1152925927349425926,1152925928423167755,2305847429808787478,1152925937013100640,1152925923054458630,1152925924128200459,2305847425513820178, + 6520834103129,1152925918759489568,1152925917685749510,1152925919833233163,2305847420145111053,6519760361304,1152925913390780448,1152925912317040390, + 1152925914464524043,2305847414776401928,6518686619479,1152925908022071328,1152925906948331270,1152925909095814923,2305847409407692803,6517612877654, + 1152925902653362208,1152925901579622150,1152925903727105803,2305847404038983678,1152925937013100698,1152925897284654854,1152925898358396683,2305847399744016378, + 1152925937013100631,1152925892989687558,1152925894063429387,2305847395449049078,1152925937013100626,1152925888694720262,1152925889768462091,2305847391154081778, + 1152925937013100621,1152925884399752966,1152925885473494795,2305847386859114478,6529424037713,1152925880104783904,1152925879031043846,1152925881178527499, + 2305847381490405353,6528350295888,1152925874736074784,1152925873662334726,1152925875809818379,2305847376121696228,6527276554063,1152925869367365664, + 1152925868293625606,1152925870441109259,2305847370752987103,6526202812238,1152925863998656544,1152925862924916486,1152925865072400139,2305847365384277978, + 6064493828037,1152925858629949381,1152925857556206151,1152925856482465542,1152925859703691019,2305847358941827028,1152928036178368453,6533719004688, + 1152925851113756612,2305847354646859729,4344359425885,1152925847892529735,1152925846818789126,1152925853261240075,2305847349278150603,1152928037252110277, + 1152925851113756611,2305847346056925128,4335769491292,1152925839302595143,1152925838228854534,1152925843597563659,2305847340688216003,1152925857556206019, + 1152925833933887238,1152925835007629067,2305847336393248703,1152928032957142981,2305847334245765071,4323958331229,1152925827491434947,1152925826417694470, + 1152925830712661771,2305847328877055928,1152928031883401157,2305847326729572295,4316442138460,1152925819975242179,1152925818901501702,1152925823196469003, + 2305847321360863153,1152928030809659333,1152925851113756610,2305847318139637678,4307852203867,1152925811385307587,1152925810311567110,1152925815680276235, + 2305847312770928553,1152928029735917509,1152925851113756609,2305847309549703078,4299262269274,1152925802795372995,1152925801721632518,1152925807090341643, + 2305847304180993953,1152925851113756608,2305847302033510344,4291746076505,1152925795279180227,1152925794205439750,1152925798500407051,2305847296664801178, + 1152925851113756607,2305847294517317585,4284229883736,1152925787762987459,1152925786689246982,1152925790984214283,2305847289148608403,1152928035104626629, + 1152925851113756606,2305847285927382928,4275639949143,1152925779173052867,1152925778099312390,1152925783468021515,2305847280558673803,1152928034030884805, + 1152925851113756605,2305847277337448328,4267050014550,1152925770583118275,1152925769509377798,1152925774878086923,2305847271968739203,1152925858629948128, + 1152925765214410502,1152925766288152331,2305847267673771903,1152926535087298524,6563783776093,1152925759845699452,1152925758771959558,1152925761993185035, + 2305847261231320953,6562710034268,1152925754476990332,1152925753403250438,1152925755550734091,2305847255862611828,6561636292443,1152925749108281212, + 1152925748034541318,1152925750182024971,2305847250493902703,6560562550618,1152925743739572092,1152925742665832198,1152925744813315851,2305847245125193578, + 6516539135837,1152925738370863713,1152925737297123078,1152925739444606731,2305847239756484453,1152926722992116595,1152925733002155974,1152925731928413958, + 6525129070421,1152925729780928352,1152925734075897611,2305847232240291678,6524055328596,1152925725485961056,1152925726559704843,2305847227945324378, + 6522981586771,1152925721190993760,1152925722264737547,2305847223650357078,6521907844946,1152925716896026464,1152925717969770251,2305847219355389778, + 2305849062970103737,4207994214225,1152925711527317344,1152925713674802955,2305847213986680653,2305849062970103736,4202625505104,1152925706158608224, + 1152925708306093835,2305847208617971528,6518686619471,1152925701863640928,1152925702937384715,2305847204323004228,6517612877646,1152925697568673632, + 1152925698642417419,2305847200028036928,1152926673599993820,1152925693273708487,1152926210817267462,1152925691126222652,1152925694347450123,2305847193585585978, + 6532645263196,1152925686831257350,1152925685757513532,1152925687904999179,2305847188216876853,6531571521371,1152925681462548230,1152925680388804412, + 1152925682536290059,2305847182848167728,6530497779546,1152925676093839110,1152925675020095292,1152925677167580939,2305847177479458603,6529424037721, + 1152925670725129990,1152925669651386172,1152925671798871819,2305847172110749478,6528350295896,1152925665356420870,1152925664282677052,1152925666430162699, + 2305847166742040353,6527276554071,1152925659987711750,1152925658913967932,1152925661061453579,2305847161373331228,6526202812246,1152925654619002630, + 1152925653545258812,1152925655692744459,2305847156004622103,1152925729780930310,1152925649250291516,1152925650324035339,2305847151709654803,1152925725485963014, + 1152925644955324220,1152925646029068043,2305847147414687503,1152925721190995718,1152925640660356924,1152925641734100747,2305847143119720203,1152925716896028422, + 1152925636365389628,1152925637439133451,2305847138824752903,6520834103121,1152925632070424326,1152925630996680508,1152925633144166155,2305847133456043778, + 6519760361296,1152925626701715206,1152925625627971388,1152925627775457035,2305847128087334653,1152928053358237651,1152928052284495826,1152925620259264005, + 2305847123792367354,1152925618111780791,1152928052284495827,2305847120571141877,1152925614890555318,1152925613816813061,2305847117349916406,1152928038325852115, + 2305847115202432753,2305847114128693188,4103841257423,1152925607374360380,1152925622406747915,2305847109833723628,1152925614890555319,1152925618111780790, + 2305847106612498153,1152928038325852114,2305847104465014503,4094177581006,1152925597710683964,1152925604153136907,2305847100170047203,1152925618111780819, + 1152925614890555346,1152925592341976581,2305847095875079904,1152925590194493391,1152925618111780818,1152925614890555347,2305847091580112603,1152925585899526094, + 1152925584825783813,2305847088358887132,1152925618111780803,2305847086211403478,1152928035104626643,2305847084063919828,2305847082990180289,4072702744529, + 1152925576235847484,1152925594489460491,2305847078695210703,1152925585899526095,1152925590194493390,2305847075473985228,1152925614890555331,2305847073326501578, + 1152928035104626642,2305847071179017928,4060891584464,1152925564424687420,1152925573014624011,2305847066884050628,1152925590194493393,1152925585899526096, + 1152925559055980037,2305847062589083329,1152925618111780800,2305847060441599678,1152928031883401171,2305847058294116028,2305847057220376510,4046932940623, + 1152925550466045702,1152925549392301884,1152925561203463947,2305847051851665078,1152925585899526097,1152925590194493392,2305847048630439603,1152925614890555328, + 2305847046482955953,1152928031883401170,2305847044335472303,4034048038734,1152925537581143814,1152925536507399996,1152925546171078411,2305847038966763178, + 1152926728360825709,1152925532212434887,1152925531138690875,1152925533286176523,2305847033598054053,1152925531138690870,1152925527917467403,2305847030376828578, + 1152925531138690865,1152925524696241931,2305847027155603103,1152925531138690860,1152925521475016459,2305847023934377628,1152925531138690855,1152925518253790987, + 2305847020713152153,1152925531138690850,1152925515032565515,2305847017491926678,1152925531138690845,1152925511811340043,2305847014270701203,1152925531138690840, + 1152925508590114571,2305847011049475728,1152925531138690836,1152925505368889099,2305847007828250253,1152925531138690832,1152925502147663627,2305847004607024778, + 1152925531138690828,1152925498926438155,2305847001385799303,1152925531138690824,1152925495705212683,2305846998164573828,1152925531138690819,1152925492483987211, + 2305846994943348353,1152925531138690814,1152925489262761739,2305846991722122878,1152928037252110290,1152925484967794181,2305846988500897520,2305846987427155697, + 2305846986353416131,3976065980367,1152925479599083174,1152925486041536267,2305846982058446453,1152928037252110291,2305846979910962918,2305846978837221095, + 2305846977763481538,3967476045774,1152925471009148582,1152925476377859851,2305846973468511853,1152925618111780815,1152925614890555342,1152925465640441349, + 2305846969173544554,1152928034030884819,1152928032957142994,1152925461345474053,2305846964878577254,2305846963804835431,2305846962731095999,3952443660111, + 1152925455976765190,1152925454903021222,1152925467787925259,2305846957362384478,1152925614890555343,1152925618111780814,2305846954141159003,1152928032957142995, + 1152928034030884818,2305846950919933528,2305846949846191705,2305846948772452286,3938485016398,1152925442018121478,1152925440944377510,1152925451681797899, + 2305846943403740753,1152926672526250861,6064493827929,1152925435575670617,1152925434501926478,1152925437723154187,2305846936961289803,6064493827928, + 1152925430206961496,1152925429133217358,1152925431280703243,2305846931592580678,6064493827927,1152925424838252375,1152925423764508238,1152925425911994123, + 2305846926223871553,6064493827926,1152925419469543254,1152925418395799118,1152925420543285003,2305846920855162428,2305849425894840153,2305846918707681111, + 2305846917633939286,6064493825591,1152925410879606350,1152925415174575883,2305846913338969653,1152927556215773009,2305849425894840152,2305846910117746519, + 1152927919140509198,2305846907970260528,2305846906896518706,3896609085372,1152925400142188110,1152925407658383115,2305846902601551403,1152927555142031192, + 2305846900454070105,1152927554068289367,2305846898306584103,1152927552994547542,2305846896159100453,3885871667028,1152925389404769870,1152925396920964875, + 2305846891864133153,1152928027588433748,3880502958031,1152925384036060750,1152925386183546635,2305846886495424028,1152928047989528527,6064493825561, + 1152925378667351630,1152925380814837515,2305846881126714903,1152928047989528504,3869765539795,1152925373298642510,1152925375446128395,2305846875758005778, + 1152928047989528503,3864396830674,1152925367929933390,1152925370077419275,2305846870389296653,4113504933841,1152925363634966094,1152925364708710155, + 2305846866094329353,4110283708368,1152925359339998798,1152925360413742859,2305846861799362053,2305849431263549277,2305849540785215429,6531571521477, + 1152925352897550291,6530497779652,1152925350750066642,1152925349676324357,2305846853209427455,2305846852135685633,3841848249858,1152925345381355086, + 1152925356118775563,2305846847840718328,2305849430189807452,2305849539711473604,1152925352897550290,1152925350750066643,2305846842472009203,2305846841398267380, + 3831110831605,1152925334643936846,1152925342160131851,2305846837103300078,2305849429116065627,2305849536490248129,6527276554177,1152927555142031315, + 1152925327127743977,6526202812352,1152927555142031314,1152925323906518502,1152925322832778757,2305846826365881831,2305846825292140010,3815004704235, + 1152925318537809486,1152925331422713611,2305846820997172703,2305849428042323802,2305849535416506304,1152925323906518505,1152925324980260328,2305846815628463578, + 2305846814554721755,3804267285980,1152925307800391246,1152925315316586251,2305846810259754453,2305849417304905552,2305849429116065629,6419902371677, + 1152925301357942737,6418828629852,1152925299210459088,1152925298136716805,2305846801669819855,2305846800596078033,3790308642258,1152925293841747534, + 1152925304579168011,2305846796301110728,2305849416231163727,2305849428042323804,1152925301357942736,1152925299210459089,2305846790932401603,2305846789858659780, + 3779571224005,1152925283104329294,1152925290620524299,2305846785563692478,1152927922361735109,1152927921287993281,2305846782342467003,1152927920214251459, + 2305846780194983353,1152927919140509631,2305846778047499703,3767760066490,1152925271293169230,1152925279883106059,2305846773752532403,1152927922361735108, + 1152927921287993280,2305846770531306928,1152927920214251458,2305846768383823278,1152927919140509630,2305846766236339628,3755948906425,1152925259482009166, + 1152925268071945995,2305846761941372328,1152928027588433851,3750580197205,1152925254113300046,1152925256260785931,2305846756572663203,1152927918066767701, + 3745211488082,1152925248744590926,1152925250892076811,2305846751203954078,2305849062970103734,3739842778963,1152925243375881806,1152925245523367691, + 2305846745835244953,6525129070417,1152925239080914510,1152925240154658571,2305846741540277653,2305849541858957253,3730179102557,1152925233712206487, + 1152925232638465798,1152925235859691275,2305846735097826703,2305849542932698973,1152925228343497386,1152925227269756678,1152925229417240331,2305846729729117578, + 4337916974941,1152925222974788245,1152925221901047558,1152925224048531211,2305846724360408453,1152928038325851997,6064493825410,1152925216532337320, + 1152925215458596614,1152925218679822091,2305846717917957503,2305849542932698640,3706556782429,1152925210089886373,1152925209016145670,1152925212237371147, + 2305846711475506553,1152925857556206243,1152925205794920203,2305846708254281078,6064493825420,1152925201499952902,1152925200426209955,1152925202573694731, + 2305846702885571953,1152925857556206226,1152925197204985611,2305846699664346478,6064493828036,1152925192910018500,1152925191836275346,1152925193983760139, + 2305846694295637353,1152925222974789382,1152925187541308050,1152925188615051019,2305846690000670053,1152925857556206224,1152925184320083723,2305846686779444578, + 1152925191836275344,1152925181098858251,2305846683558219103,4337916972434,3672197044061,1152925175730149126,1152925174656406160,1152925177877632779, + 2305846677115768153,1152926617765418758,6532645263301,1152925169287698269,1152925168213953878,1152925171435181835,2305846670673317203,1152925169287698387, + 3659312141840,3658238400349,1152925161771502934,1152925164992730891,2305846664230866253,1152926638166513414,1152925157476535682,1152925158550279947, + 2305846659935898953,4105988740624,3648574723933,1152925152107826506,1152925154255312651,2305846654567189828,1152926484621432796,1152925147812861702, + 1152928037252110276,3641058531164,1152925144591633728,1152925148886603531,2305846647050997053,1152925192910018397,2305846644903515664,3634616080339, + 1152925138149182784,1152925141370410763,2305846640608546103,1152928036178368467,3629247371099,1152925132780473664,1152925134927959819,2305846635239836978, + 1152927551920805722,2305846633092355933,3622804920258,1152925126338022720,1152925129559250699,2305846628797386028,6064493827933,1152925122043058013, + 1152925120969313600,1152925123116799755,2305846623428676903,1152926480326465286,1152925116674347295,1152925117748090635,2305846619133709603,1152925116674346807, + 1152925113453123339,2305846615912484128,1152928035104626628,1152925109158155781,2305846612691259345,3602403825499,1152925105936928036,1152925110231897867, + 2305846608396291353,2305849539711473603,1152925101641960850,4347580648725,3604551306516,3593813890906,1152925097346993444,1152925102715705099, + 2305846599806356753,1152926683263668994,2305846597658874430,2305846596585132612,1152927549773322192,2305846594437650385,3584150214143,1152925087683319759, + 3582002730512,1152927549773322194,2305846589068941267,1152925083388349703,1152925082314607884,1152925094125770507,2305846584773971203,1152926729434567430, + 2305846582626488894,2305846581552747078,2305846580479003918,2305846579405263428,1152925073724675846,3578781505373,1152925071577189627,1152925079093384971, + 2305846574036552953,3584150214492,1152925067282222331,1152925068355966731,2305846569741585653,1152927552994547664,1152928051210753760,2305846566520360197, + 2305846565446618354,3555159185349,1152925058692289086,1152925064060999435,2305846561151651053,3556232924562,1152925054397320448,1152925055471064843, + 2305846556856683753,2305846739392796611,3556232924390,1152925049028612678,1152925051176097547,2305846551487974628,1152926687558636290,1152925044733646598, + 2305849430189807557,1152927926656702176,3536905571551,3535831832516,1152925039364934880,1152925045807388427,2305846541824298203,1152925043659902248, + 1152925036143712011,2305846538603072728,3578781505372,1152925031848742112,1152925032922486539,2305846534308105428,3555159183304,1152925027553774862, + 1152925028627519243,2305846530013138128,2305847347130668995,3555159182541,1152925022185067076,1152925024332551947,2305846524644429003,1152926721918374658, + 1152925017890100998,1152927925582960581,2305846520349464413,3510062028740,1152925013595131079,1152925018963842827,2305846516054494403,6420976113604, + 3578781502656,1152925008226421959,1152925010373908235,2305846510685785278,6422049855429,2305846593363908112,3498250865851,1152925001783971015, + 1152925005005199115,2305846504243334328,1152926727287084806,3584150214493,1152924996415261877,1152924998562748171,2305846498874625203,1152924997489003733, + 1152924993194039051,2305846495653399728,1152928046915786504,1152924989972813579,2305846492432174253,6064493828045,1152924985677846477,1152924986751588107, + 2305846488137206953,6064493827941,1152924981382877945,1152924980309137158,1152924982456620811,2305846482768497828,1152924981382877933,1152924976014169862, + 1152924977087911691,2305846478473530528,6064493828060,1152924971719202780,1152924972792944395,2305846474178563228,6064493828059,1152924967424235483, + 1152924968497977099,2305846469883595928,6064493828058,1152924963129268186,1152924964203009803,2305846465588628628,6064493828057,1152924958834300889, + 1152924959908042507,2305846461293661328,6064493828056,1152924954539333592,1152924955613075211,2305846456998694028,6064493828055,1152924950244366295, + 1152924951318107915,2305846452703726728,6064493828054,1152924945949398998,1152924947023140619,2305846448408759428,1152926730508310488,3437047584711, + 1152924942728173323,2305846444113792128,1152928056579463127,3432752617414,1152924938433206027,2305846439818824828,6534792746966,6535866485881, + 1152924931990755292,1152924934138238731,2305846434450115703,1152928063021914054,1152924928769529611,2305846431228890228,1152928061948172230,1152924925548304139, + 2305846428007664753,1152925857556206271,1152924922327078667,2305846424786439278,1152928051210752698,1152924919105853195,2305846421565213803,1152926652125157328, + 1152924915884627723,2305846418343988328,1152928049063269050,1152924912663402251,2305846415122762853,1152928047989527226,1152924909442176779,2305846411901537378, + 1152925858629947714,1152924906220951307,2305846408680311903,6064493828049,1152924901925982530,1152924902999725835,2305846404385344603,1152928038325852112, + 1152924897631015767,1152924898704758539,2305846400090377303,1152926820702623494,1152927947057796958,6443524691472,1152927949205277778,1152924890114821203, + 1152924889041079380,6550898874221,1152924886893595727,1152924894409791243,2305846389352959053,6549825132396,1152924882598628431,1152924883672373003, + 2305846385057991753,6548751390571,1152924878303661135,1152924879377405707,2305846380763024453,6547677648746,1152924874008693839,1152924875082438411, + 2305846376468057153,6546603906921,1152924869713726543,1152924870787471115,2305846372173089853,1152927949205280625,1152924865418759251,6064493825081, + 1152924863271277291,1152924862197536518,1152924866492503819,2305846364656897078,1152928046915786502,6429566048204,6064493825074,1152924855755082802, + 1152924854681340979,1152924858976311051,2305846357140704303,5046586578448,1152924850386376661,1152924849312631858,1152924848238890035,1152924851460118283, + 2305846350698253353,2305848211492836089,2305846348550771292,1152924842870180913,1152924841796441862,1152924845017667339,2305846344255802403,6444598433296, + 1152924837501471826,1152924836427730003,1152924837501474673,1152924834280246355,2305846337813351454,1152924832132762674,1152924831059023622,1152924838575216395, + 2305846333518384153,1152928045842043735,1152924827837798155,2305846330297158678,1152927935246637005,3352221980176,1152924822469086227,2305846326002191397, + 1152927548699580269,3314641016789,2305849449517160302,2305849450590899213,2305846320633482252,2305846319559743344,2305846318485998602,2305846317412259697, + 2305846316338514952,2305846315264776050,2305846314191031302,2305849454885866501,2305846312043547652,2305849455959608323,3300682370062,1152924804215475216, + 1152924803141736198,1152924824616572683,2305846305601096703,1152924832132765653,1152924798846769101,1152924797773027078,1152924799920510731,2305846300232387578, + 1152927933099150374,1152924793478059782,1152924794551801611,2305846295937420278,5046586575922,1152924789183092579,1152924788109350861,1152924787035608838, + 1152924790256834315,2305846289494969328,3284576245264,2305849549375149584,3277060052835,1152924780593155053,1152924779519416165,1152924778445674445, + 1152924777371932422,1152924783814383371,2305846279831292903,6064493828043,1152924773076965323,6047313958859,1152924770929478627,6062346344395, + 1152924768781994977,6051608926155,1152924766634511327,6043018991563,1152924764487027677,6041945249739,1152924762339544027,6052682667979, + 1152924760192060377,6053756409803,1152924758044576727,1152924774150706955,2305846260503940053,6064493828042,1152924753749612490,1152924754823354123, + 2305846256208972753,6064493828041,1152924749454645193,1152924750528386827,2305846251914005453,6064493828040,1152924745159677896,1152924746233419531, + 2305846247619038153,6539087713808,1152924740864710601,1152924739790968776,6538013971984,1152924737643482054,1152924736569743304,2305846240102845380, + 6536940230160,1152924733348514757,2305846236881619904,2305846235807881162,3225520442406,1152924741938452235,2305846232586652603,3339337078288, + 2305849547227666378,2305846229365430216,1152924723684838328,1152924726906066699,2305846226144201653,1152924731201034193,1152924720463615755,2305846222922976178, + 1152924731201034192,1152924717242390283,2305846219701750703,1152924731201034191,1152924714021164811,2305846216480525228,1152924731201034190,1152924710799939339, + 2305846213259299753,1152924734422259667,1152924707578713867,2305846210038074278,1152924734422259666,1152924704357488395,2305846206816848803,1152924738717226964, + 1152924701136262923,2305846203595623328,6559488808821,1152924696841295821,1152924695767553798,1152924697915037451,2305846198226914203,2305849568702502400, + 3186865739637,1152924690398843629,1152924689325102854,1152924692546328331,2305846191784463253,1152928064095654635,1152924686103877387,2305846188563237778, + 1152926722992117703,1152928039399593944,2305846185342012303,2305848156732003179,2305846183194528653,2305846182120788828,2305846181047048141,6064493824905, + 1152924682882651915,2305846177825819528,6064493826795,1152924671071491847,1152924672145233675,2305846173530852228,5904506295824,5872294038401, + 1152924665702782876,1152924664629041071,1152924667850266379,2305846167088401278,1152924666776524700,1152924660334073774,1152924661407815435,2305846162793433978, + 1152924660334073773,1152924657112848139,2305846159572208503,1152927994302436790,2305849512867927978,2305846156350983027,2305846155277241202,2305849512867927977, + 2305849515015411628,2305846152056015728,2305846150982273905,2305849508572960678,2305846148834790252,2305846147761048427,2305849508572960677,2305849510720444328, + 2305846144539822953,2305846143466081130,2305846142392339309,2305849504277993378,2305846140244855652,2305846139171113827,2305849504277993377,2305849506425477028, + 2305846135949888353,2305846134876146530,2305846133802404709,2305846132728662893,2305846131654923493,1152924625974332251,1152924624900590427,1152924624900590426, + 1152924622753106777,2305846126286211927,2305846152056015727,2305846124138728277,2305849515015411627,2305846121991244659,2305846120917502804,2305846119843761006, + 2305846144539822952,2305846117696277327,2305849510720444327,2305846115548793708,2305846114475051854,2305846113401310055,2305846112327568208,2305846135949888352, + 2305846110180084552,2305849506425477027,2305846108032600932,2305846106958859079,2305846105885117279,2305846104811375433,2305846103737633616,2305846102663894335, + 1152924596983302976,1152924595909561152,1152924595909561151,1152924593762077502,2305846113401310033,2305846096221440836,2305846095147699025,2305846094073959713, + 1152924588393368376,1152924587319626552,1152924587319626551,1152924585172142902,2305846088705248060,2305846087631506262,2305846087631506227,2305846085484022577, + 2305846088705248052,2305846120917502829,2305846114475051878,2305846081189055278,2305846106958859102,2305846079041571628,2305846077967829806,2305846076894090499, + 1152924571213499176,1152924570139757352,1152924570139757351,1152924567992273702,2305846071525378903,2305846070451637039,2305846069377895216,2305846068304153394, + 2305846132728662886,2305846066156672109,1152924560476080926,1152924559402339102,1152924559402339101,1152924557254855452,2305846060787960602,2305846103737633610, + 2305846058640479431,1152924552959888151,1152924551886146327,1152924551886146326,1152924549738662677,2305846095147699019,2305846052198028457,1152924546517437201, + 1152924545443695377,1152924545443695376,1152924543296211727,2305846046829316883,2305846045755575065,2305846045755575052,2305846043608091402,2305846046829316877, + 2305846077967829805,2305846040386868363,1152924534706277126,1152924533632535302,1152924533632535301,1152924531485051652,2305846035018156826,2305846033944414984, + 2305846032870673161,2305846031796931339,2305846030723189536,2305846132728662878,2305846028575708149,1152924522895117051,1152924521821375227,1152924521821375226, + 1152924519673891577,2305846023206996727,2305846103737633603,2305846021059515471,1152924515378924276,1152924514305182452,1152924514305182451,1152924512157698802, + 2305846095147699012,2305846014617064497,1152924508936473326,1152924507862731502,1152924507862731501,1152924505715247852,2305846009248353008,2305846008174611190, + 2305846008174611177,2305846006027127527,2305846009248353002,2305846077967829803,2305846002805904403,1152924497125313251,1152924496051571427,1152924496051571426, + 1152924493904087777,2305845997437192951,2305845996363451109,2305845995289709286,2305845994215967464,2305845993142225661,2305845992068483872,2981781051204, + 1152924485314153332,1152924653891622667,2305845987773516503,2305846031796931361,2305845985626032860,2305845984552291105,2974264858435,1152924477797960564, + 1152924482092930827,2305845980257323728,2305846070451637027,2305845978109840077,2305845977036098354,2305845975962356514,2305846033944414977,2305845973814872777, + 2305845972741131019,2305845971667389184,2305845970593647306,2305845996363451102,2305845968446163652,2305845967372421864,2305845966298680029,2305845965224938181, + 2305845964151196362,2953863763778,1152924457396865908,1152924474576738059,2305845959856229053,2305845971667389131,2305845957708745410,2305845956635003595, + 2946347571009,1152924449880673140,1152924454175643403,2305845952340036278,2305845992068483838,2940978861888,1152924444511964020,1152924446659450635, + 2305845946971327153,2305845984552291071,2935610152767,1152924439143254900,1152924441290741515,2305845941602618028,2305845964151196358,2930241443646, + 1152924433774545780,1152924435922032395,2305845936233908903,2305845956635003591,2924872734525,1152924428405836660,1152924430553323275,2305845930865199778, + 2305845992068483803,2919504025404,1152924423037127540,1152924425184614155,2305845925496490653,2305845984552291036,2914135316283,1152924417668418420, + 1152924419815905035,2305845920127781528,2305845964151196353,2908766607162,1152924412299709300,1152924414447195915,2305845914759072403,2305845956635003586, + 2903397898041,1152924406931000180,1152924409078486795,2305845909390363278,1152927994302436761,2305849512867927269,1152924401562290826,1152924400488549002, + 1152924400488549001,1152924398341065352,2305845901874170502,2305849516089152831,1152924395119839876,1152924394046098052,1152924394046098051,1152924391898614402, + 2305849515015410977,1152924389751130751,1152924388677388927,1152924388677388926,1152924386529905277,2305845890063010432,2305845888989268613,2305845888989268602, + 2305845886841784952,2305845890063010427,2305849513941669123,1152924379013712501,1152924377939970677,1152924377939970676,1152924375792487027,2305845879325592198, + 2305845878251850358,2305845877178108535,2305845876104366713,2305849508572959853,1152924369350036076,1152924368276294252,1152924368276294251,1152924366128810602, + 2305845869661915752,2305849511794185415,1152924362907585126,1152924361833843302,1152924361833843301,1152924359686359652,2305849510720443561,1152924357538876001, + 1152924356465134177,1152924356465134176,1152924354317650527,2305845857850755682,2305845856777013863,2305845856777013852,2305845854629530202,2305845857850755677, + 2305849509646701707,1152924346801457751,1152924345727715927,1152924345727715926,1152924343580232277,2305845847113337448,2305845846039595608,2305845844965853785, + 2305845843892111963,2305845842818370157,2305849504277992437,1152924336064039501,1152924334990297677,1152924334990297676,1152924332842814027,2305845836375919177, + 2305849507499217999,1152924329621588551,1152924328547846727,1152924328547846726,1152924326400363077,2305849506425476145,1152924324252879426,1152924323179137602, + 1152924323179137601,1152924321031653952,2305845824564759107,2305845823491017288,2305845823491017277,2305845821343533627,2305845824564759102,2305849505351734291, + 1152924313515461176,1152924312441719352,1152924312441719351,1152924310294235702,2305845813827340873,2305845812753599033,2305845811679857210,2305845810606115388, + 2305845809532373582,2305845808458631789,2798171199300,1152924301704301195,1152924403709777675,2305845804163664428,2305845843892111982,2305845802016180785, + 2305845800942439022,2790655006531,1152924294188108427,1152924298483078923,2305845796647471653,2305845878251850352,2305845794499988002,2305845793426246265, + 2305845792352504431,2305845846039595602,2305845790205020702,2305845789131278939,2305845788057537105,2305845786983795231,2305845812753599027,2305845784836311577, + 2305845783762569788,2305845782688827954,2305845781615086106,2305845780541344287,2770253911874,1152924273787013771,1152924290966886155,2305845776246376978, + 2305845788057537056,2305845774098893335,2305845773025151520,2762737719105,1152924266270821003,1152924270565791499,2305845768730184203,2305845808458631759, + 2757369009984,1152924260902111883,1152924263049598731,2305845763361475078,2305845800942438992,2752000300863,1152924255533402763,1152924257680889611, + 2305845757992765953,2305845780541344283,2746631591742,1152924250164693643,1152924252312180491,2305845752624056828,2305845773025151516,2741262882621, + 1152924244795984523,1152924246943471371,2305845747255347703,2305845808458631728,2735894173500,1152924239427275403,1152924241574762251,2305845741886638578, + 2305845800942438961,2730525464379,1152924234058566283,1152924236206053131,2305845736517929453,2305845780541344278,2725156755258,1152924228689857163, + 1152924230837344011,2305845731149220328,2305845773025151511,2719788046137,1152924223321148043,1152924225468634891,2305845725780511203,1152927994302436731, + 2886218028975,1152924217952438752,1152924220099925771,2305845720411802078,1152927545478354863,2305849515015411631,2305845717190577011,2305846144539822956, + 2305845715043092953,2305846135949888356,2305845712895609303,2305845711821867483,2305845710748128545,1152924205067536851,1152924203993795027,1152924203993795026, + 1152924201846311377,2696165726126,1152924199698827744,1152924214731216651,2305845702158191053,1152927545478354862,1152927544404613035,2305845698936965589, + 2305845697863227310,1152927543330871210,2305845695715740117,1152927542257129385,2305845693568256469,2305845692494514629,2305845691420772807,1152927541183387560, + 2305845689273289173,1152927540109645735,2305845687125805525,2305845686052063679,1152927539035903910,2305845683904580053,1152927537962162085,2305845681757096405, + 2305845680683354554,2305845679609612732,2305845678535870913,1152927536888420260,2305845676388387285,1152927535814678435,2305845674240903637,2305845673167161779, + 1152927534740936610,2305845671019678165,1152927533667194785,2305845668872194517,2305845667798452654,2305845666724710832,2305845665650969013,2305845664577227210, + 2305845663503488259,1152924157822896551,1152924156749154727,1152924156749154726,1152924154601671077,2648921085869,1152924152454187488,1152924196477605643, + 2305845654913550753,1152927545478354861,1152924193256379897,2305845651692325289,2305845650618587053,1152924190035154424,2305845648471099817,1152924187887670775, + 2305845646323616169,2305845645249874329,2305845644176132507,1152924183592703478,2305845642028648873,1152924181445219829,2305845639881165225,2305845638807423379, + 1152924178223994356,2305845636659939753,1152924176076510707,2305845634512456105,2305845633438714254,2305845632364972432,2305845631291230613,1152924170707801586, + 2305845629143746985,1152924168560317937,2305845626996263337,2305845625922521479,1152924165339092464,2305845623775037865,1152924163191608815,2305845621627554217, + 2305845620553812354,2305845619480070532,2305845618406328713,2305845617332586910,2607045154628,1152924110578256352,1152924149232965387,2305845613037619578, + 1152924146011739641,2305845610890135933,2600602703683,1152924104135805408,1152924107357034251,2305845606595168628,1152924142790514168,2305845604447684989, + 2594160252738,1152924097693354464,1152924100914583307,2305845600152717678,1152924140643030519,2305845598005234045,2587717801793,1152924091250903520, + 1152924094472132363,2305845593710266728,1152924136348063222,2305845591562783101,2581275350848,1152924084808452576,1152924088029681419,2305845587267815778, + 1152924134200579573,2305845585120332157,2574832899903,1152924078366001632,1152924081587230475,2305845580825364828,1152924130979354100,2305845578677881213, + 2568390448958,1152924071923550688,1152924075144779531,2305845574382913878,1152924128831870451,2305845572235430269,2561947998013,1152924065481099744, + 1152924068702328587,2305845567940462928,1152924123463161330,2305845565792979325,2555505547068,1152924059038648800,1152924062259877643,2305845561498011978, + 1152924121315677681,2305845559350528381,2549063096123,1152924052596197856,1152924055817426699,2305845555055561028,1152924118094452208,2305845552908077437, + 2542620645178,1152924046153746912,1152924049374975755,2305845548613110078,1152924115946968559,2305845546465626493,2536178194233,1152924039711295968, + 1152924042932524811,2305845542170659128,1152927994302436701,2305849037200299948,1152924034342586676,1152924033268844852,1152924033268844851,1152924031121361202, + 2525440776111,1152924028973877557,1152924036490073867,2305845531433240878,2305845692494517477,1152924024678910251,1152924023605168427,1152924023605168426, + 1152924021457684777,2305845524990789927,2305845710748128575,1152924018236459301,1152924017162717477,1152924017162717476,1152924015015233827,2305845697863226657, + 1152924012867750176,1152924011794008352,1152924011794008351,1152924009646524702,2305845513179629857,2305845512105888038,2305845512105888027,2305845509958404377, + 2305845513179629852,2305845694642001155,1152924002130331926,1152924001056590102,1152924001056590101,1152923998909106452,2305845502442211623,2305845501368469783, + 2305845500294727960,2305845499220986138,2305845680683357293,1152923992466655501,1152923991392913677,1152923991392913676,1152923989245430027,2305845492778535177, + 2305845688199550151,1152923986024204551,1152923984950462727,1152923984950462726,1152923982802979077,2305845686052066473,1152923980655495426,1152923979581753602, + 1152923979581753601,1152923977434269952,2305845480967375107,2305845479893633288,2305845479893633277,2305845477746149627,2305845480967375102,2305845682830840971, + 1152923969918077176,1152923968844335352,1152923968844335351,1152923966696851702,2305845470229956873,2305845469156215033,2305845468082473210,2305845467008731388, + 2305845465934989582,2305845667798455285,1152923959180658926,1152923958106917102,1152923958106917101,1152923955959433452,2305845459492538602,2305845675314648143, + 1152923952738207976,1152923951664466152,1152923951664466151,1152923949516982502,2305845673167164465,1152923947369498851,1152923946295757027,1152923946295757026, + 1152923944148273377,2305845447681378532,2305845446607636713,2305845446607636702,2305845444460153052,2305845447681378527,2305845669945938963,1152923936632080601, + 1152923935558338777,1152923935558338776,1152923933410855127,2305845436943960298,2305845435870218458,2305845434796476635,2305845433722734813,2305845432648993007, + 2305845431575251214,2421287819076,1152923924820920629,1152924025752655627,2305845427280283853,2305845467008731407,2305845425132800210,2305845424059058447, + 2413771626307,1152923917304727861,1152923921599698699,2305845419764091078,2305845501368469777,2305845417616607427,2305845416542865690,2305845415469123856, + 2305845469156215027,2305845413321640127,2305845412247898364,2305845411174156530,2305845410100414656,2305845435870218452,2305845407952931002,2305845406879189213, + 2305845405805447379,2305845404731705531,2305845403657963712,2393370531650,1152923896903633205,1152923914083505931,2305845399362996403,2305845411174156481, + 2305845397215512760,2305845396141770945,2385854338881,1152923889387440437,1152923893682411275,2305845391846803628,2305845431575251184,2380485629760, + 1152923884018731317,1152923886166218507,2305845386478094503,2305845424059058417,2375116920639,1152923878650022197,1152923880797509387,2305845381109385378, + 2305845403657963708,2369748211518,1152923873281313077,1152923875428800267,2305845375740676253,2305845396141770941,2364379502397,1152923867912603957, + 1152923870060091147,2305845370371967128,2305845431575251153,2359010793276,1152923862543894837,1152923864691382027,2305845365003258003,2305845424059058386, + 2353642084155,1152923857175185717,1152923859322672907,2305845359634548878,2305845403657963703,2348273375034,1152923851806476597,1152923853953963787, + 2305845354265839753,2305845396141770936,2342904665913,1152923846437767477,1152923848585254667,2305845348897130628,1152927997523662748,1152923843216545547, + 2305845345675905153,1152927996449920924,1152923839995320075,2305845342454679678,1152927995376179100,1152923836774094603,2305845339233454203,2305848945932244406, + 2305845337085973883,2305845336012232029,6493990557496,1152923829257898102,1152923828184160156,1152923833552869131,2305845330643519603,6399501276688, + 1152923823889192880,1152923822815450932,1152923821741705334,1152923824962934539,2305845324201068653,6378026440208,1152923817446741916,1152923816372996214, + 1152923818520483595,2305845318832359528,1152928014703531952,6064493824101,1152923811004290824,1152923813151774475,2305845313463650403,1152926924855580592, + 1152923807783065355,2305845310242424928,1152926918413129648,1152923804561839883,2305845307021199453,1152926911970678704,1152923801340614411,2305845303799973978, + 6064493827998,1152923797045647262,1152923795971905456,1152923798119388939,2305845298431264853,1152927833241163696,1152923791676938056,6510096684560, + 6509022942736,1152923788455708752,6398427534864,6397353793040,1152923785234483277,1152923784160741454,1152923783086999633,1152923792750679819, + 2305845285546362953,1152923789529454510,1152923786308228934,6064493824069,1152923776644548678,1152923775570806865,1152923779865777931,2305845278030170178, + 1152923778792036254,1152923771275843504,1152923772349585163,2305845273735202878,1152923778792036253,1152923766980876208,1152923768054617867,2305845269440235578, + 1152923822815451055,1152923763759650571,2305845266219010103,1152923787381966935,1152923759464679535,1152923760538425099,2305845261924042803,6064493824075, + 1152923755169716143,1152923754095970385,1152923756243457803,2305845256555333678,1152923788455712687,6507949200912,1152923748727261227,1152923747653523360, + 1152923746579781552,1152923750874748683,2305845249039140903,1152923747653523357,1152923742284814256,1152923743358555915,2305845244744173603,1152923785234487111, + 6396280051216,1152923736916101152,1152923735842359377,6380173923856,1152923733694875677,6498285524796,1152923731547392027,1152923739063588619, + 2305845234006755353,6497211782971,1152923727252424731,1152923728326170379,2305845229711788053,6496138041146,1152923722957457435,1152923724031203083, + 2305845225416820753,6495064299321,1152923718662490139,1152923719736235787,2305845221121853453,2305849517162895278,1152928012556048302,2208686934026, + 1152923712220043183,1152923711146301360,2305849391535101752,2305845213605664669,2203318228896,1152923706851330054,1152923715441268491,2305845209310693378, + 6064493827997,1152923702556366749,1152923701482620934,1152923703630108427,2305845203941984253,1152923710072559524,1152923698261399307,2305845200720758778, + 1152923710072559523,1152923695040173835,2305845197499533303,1152923710072559522,1152923691818948363,2305845194278307828,1152923710072559521,1152923688597722891, + 2305845191057082353,6491843073552,2305849405493745478,1152927900886898502,2177548421101,1152923681081530183,1152923680007784565,1152923678934042606, + 1152923677860300878,1152923676786562992,1152923685376497419,2305845179245922278,1152923787381970864,1152923672491591662,1152923671417849834,6379100182429, + 1152923669270366177,1152923673565337355,2305845171729729503,6395206309696,1152923664975402909,2305845168508507972,2158221072300,1152923661754173409, + 1152923666049144587,2305845164213536728,6394132567871,1152923657459210141,2305845160992315203,2150704879531,1152923654237980641,1152923658532951819, + 2305845156697343953,6393058826046,1152923649943017373,2305845153476122434,2143188686762,1152923646721787873,1152923651016759051,2305845149181151178, + 6391985084221,1152923642426824605,2305845145959929665,2135672493993,1152923639205595105,1152923643500566283,2305845141664958403,1152927901960640327, + 1152923634910627871,1152923633836889910,2305845137369995167,2127082559287,1152923630615660625,1152923635984373515,2305845133075023803,1152923748727261262, + 1152923626320697248,1152923625246955440,1152923627394438923,2305845127706314678,1152923626320697245,1152923620951988144,1152923622025729803,2305845123411347378, + 1152923787381970861,1152927995376179102,1152923615583274927,1152923614509537200,1152923617730762507,2305845116968896428,5415953765314,1152923610214568882, + 1152923611288311563,2305845112673929128,6397353793454,1152923605919601624,1152923604845856681,1152923606993344267,2305845107305220003,6064493828011, + 1152923600550893483,1152923599477147561,1152923601624635147,2305845101936510878,6064493828010,1152923595182184362,1152923594108438441,1152923596255926027, + 2305845096567801753,6064493828009,1152923589813475241,1152923588739729321,1152923590887216907,2305845091199092628,6064493828008,1152923584444766120, + 1152923583371020201,1152923585518507787,2305845085830383503,6064493828007,1152923579076056999,1152923578002311081,1152923580149798667,2305845080461674378, + 6064493828006,1152923573707347878,1152923572633601961,1152923574781089547,2305845075092965253,6064493828005,1152923568338638757,1152923567264892841, + 1152923569412380427,2305845069724256128,6064493828004,1152923562969929636,1152923561896183721,1152923564043671307,2305845064355547003,2305849511794186152, + 2305845062208067497,2305845061134321527,2305845060060583850,2305845058986837877,2305845057913100203,2047625664429,1152923551158768614,1152923550085023657, + 1152923558674962187,2305845052544386928,2305849507499218852,2305845050396907429,2305845049323161452,2305845048249423782,2305845047175677802,2305845046101940135, + 2035814504364,1152923539347608550,1152923538273863593,1152923546863802123,2305845040733226853,1152928001818629094,1152923533978896297,1152923535052642059, + 2305845036438259553,1152927559436998573,2305849400125036352,2305845033217038145,2305845032143292252,2305845031069554498,2305845029995808602,2305845028922070851, + 2305845027848324958,2017560893253,1152923521093997528,1152923520020252585,1152923530757674763,2305845022479615828,1152927559436998572,2305849395830069052, + 2305845019258394429,2305845018184648527,2305845017110910782,2305845016037164877,2305845014963427135,2305845013889681233,2003602249540,1152923507135353816, + 1152923506061608873,1152923516799031051,2305845008520972103,6385542633378,1152923501766644696,1152923500692899753,1152923502840387339,2305845003152262978, + 1152928001818629639,1152928002892371880,2305844999931037502,1152928003966113705,2305844997783553853,2305844996709812027,1152928005039855530,2305844994562328378, + 2305844993488586552,1152928006113597355,2305844991341102903,2305844990267361087,2305849507499218856,1989643601715,2305844987046135602,2305849508572960681, + 2305844997783553852,1974611216176,2305844982751168305,2305844981677426477,2305849509646702506,2305844994562328377,1969242507051,2305844977382459180, + 2305844976308717352,2305849510720444331,2305844991341102902,1963873797926,2305844972013750055,1981053667107,1152923465259423662,2305844968792524596, + 1958505093026,1152923462038194089,1152923497471678219,2305844964497557278,5409511314356,1152923457743229868,1152923458816972555,2305844960202589978, + 1152923457743229862,1152923454522005259,2305844956981364503,1152923457743226773,1152923451300779787,2305844953760139028,1152923457743226768,1152923448079554315, + 2305844950538913553,1152928008261081004,1152923443784582939,1152923444858328843,2305844946243946253,1152928007187339180,1152923439489615643,1152923440563361547, + 2305844941948978953,1152923610214569799,1152923435194648652,6395206309392,1152923433047164959,6390911342096,6391985083920,1152923429825939202, + 1924145354256,1152923427678455555,2305844931211564869,1152923425530976062,1152923424457230085,1152923436268394251,2305844926916593403,1152923430899685185, + 1915555419664,1152923419088520963,2305844922621630277,1152923416941041469,1152923415867295493,1152923421236008715,2305844918326658803,1152923429825943360, + 1906965485072,1152923410498586371,2305844914031695685,1152923408351106876,1152923407277360901,1152923412646074123,2305844909736724203,1152927895518189377, + 1898375550480,1152923401908651779,2305844905441761093,1152923399761172283,1152923398687426309,1152923404056139531,2305844901146789603,1152926920560613126, + 1152923394392459340,6505801717571,1152923392244979512,6064493823709,1152923390097491677,1152923389023749855,1152923395466204939,2305844891483113178, + 1886564390416,1152923384728782558,1152923383655040735,1152923385802528523,2305844886114404053,6504727975746,1152923379360077624,6064493823697, + 1152923377212589777,1152923376138847959,1152923375065106143,1152923380433819403,2305844877524469453,1873679488528,1152923370770138834,1152923369696397015, + 1152923368622655199,1152923371843884811,2305844871082018503,1152923370770138839,1859720845111,1152923363253946079,1152923365401433867,2305844865713309378, + 1152923391171233502,1152923378286331602,6501506750271,1152923356811495114,2305844860344600254,1152923354664011479,2305844858197116607,1152927888001996286, + 2305844856049637178,1845762197177,1152923349295302367,1152923360032724747,2305844851754665653,1152923356811499320,1840393491984,2305845241522948138, + 1152923342852851377,1152923341779113783,1152923340705367775,1152923346074081035,2305844843164731053,1152927885854513062,1831803557694,1152923335336658685, + 1152923334262916831,1152923337484146443,2305844836722280103,1152927885854513061,1825361106749,1152923328894207733,1152923327820465887,1152923331041695499, + 2305844830279829153,1152927885854513060,1818918655804,1152923322451756781,1152923321378014943,1152923324599244555,2305844823837378203,1152927885854513059, + 1812476204859,1152923316009305829,1152923314935563999,1152923318156793611,2305844817394927253,1152923457743230790,1152923310640597023,6064493827908, + 1152923308493112977,1152923311714342667,2305844810952476303,5403068863406,1152923304198149030,1152923305271891723,2305844806657509003,1152923304198145951, + 1152923300976924427,2305844803436283528,1152923304198149957,1152923296681957292,1152923297755698955,2305844799141316228,1152926914118162182,1152923292386986015, + 1152927899813156780,1152923290239501952,1152923293460731659,2305844792698865278,1152928010408564652,1152923285944534668,1152923287018280715,2305844788403897978, + 6394132567568,1152923281649571755,1152923280575825668,1152923279502083712,1152923282723313419,2305844781961447028,1152923291313243908,1152923275207116498, + 1152923276280862475,2305844777666479728,6502580492096,1152923270912149105,1152923271985895179,2305844773371512428,6505801717264,1152923266617185796, + 2305844770150291369,2305844769076549547,1758789113665,1152923262322214513,1152923267690927883,2305844764781577828,2305844771224028777,2305844762634098494, + 2305844761560356779,1751272920998,1152923254806021745,1152923259100993291,2305844757265385053,2069100500899,1152923250511054441,1152923249437312652, + 1152923251584800523,2305844751896675928,1152923281649571640,1152927893370705731,2305844748675450453,6493990553171,1152923241921119849,1152923240847378048, + 1152923246216091403,2305844743306741328,1152923304198150059,1152928006113597351,6064493823564,1152923234404931495,1152923233331185229,1152923237626156811, + 2305844735790548553,1152927997523662759,2305844733643069346,1152927997523662754,1152927996449920929,1152923225814996485,2305844729348097604,1719060661829, + 1152923222593766988,2305844726126872129,1715839440805,1152923219372541517,1152923230109964043,2305844721831904828,1152927996449920935,2305844719684425633, + 1152927996449920930,1152927997523662753,2305844716463195703,1706175759928,1152923209708865100,2305844713241970229,1702954538916,1152923206487639629, + 1152923216151320331,2305844708947002928,1152923291313248068,2305844706799519365,1152923201118930537,1152923203266418443,2305844703578293803,1152923201118934949, + 1152923197897709323,2305844700357068328,1152923201118934948,1152923194676483851,2305844697135842853,1152923201118934950,1152923191455258379,2305844693914617378, + 5380520285096,1152923187160287135,1152923188234032907,2305844689619650078,1152926907675711238,1152923182865319684,1152923181791577719,1152923180717835986, + 1152923183939065611,2305844683177199128,6503654233921,1152923176422868505,1152923177496614667,2305844678882231828,1152923180717835885,1152923173201647371, + 2305844675661006353,1152923180717835965,1152923169980421899,2305844672439780878,1152923296681953028,6064493827907,1152923164611708427,1152923166759196427, + 2305844667071071753,1152927531519711130,2305844664923592603,6064493823493,1152923158169261832,1152923161390487307,2305844660628620803,1152927990007469549, + 2305844658481141657,6064493823487,1152923151726810888,1152923154948036363,2305844654186169853,1152927987859985901,2305844652038690711,6064493823481, + 1152923145284359944,1152923148505585419,2305844647743718903,1152927985712502253,2305844645596239765,6064493823475,1152923138841909000,1152923142063134475, + 2305844641301267953,1152927981417534957,2305844639153788817,6064493823469,1152923132399458056,1152923135620683531,2305844634858817003,1152927979270051309, + 2305844632711337871,6064493823463,1152923125957007112,1152923129178232587,2305844628416366053,1152927983565018605,2305844626268886931,1152923120588297992, + 1152923122735781643,2305844623047656928,1152927977122567661,2305844620900177805,1152923115219588872,1152923117367072523,2305844617678947803,6342592955909, + 1152923110924621575,1152923111998363403,2305844613383980503,6341519214079,1152923106629654279,1152923107703396107,2305844609089013203,6340445472249, + 1152923102334686983,1152923103408428811,2305844604794045903,6339371730419,1152923098039719687,1152923099113461515,2305844600499078603,6338297988577, + 1152923093744752391,1152923094818494219,2305844596204111303,6337224246765,1152923089449785095,1152923090523526923,2305844591909144003,6336150504935, + 1152923085154817799,1152923086228559627,2305844587614176703,6335076763100,1152923080859850503,1152923081933592331,2305844583319209403,1152927871895868909, + 2305844581171730219,1152928072685590501,1152923074417399781,1152923073343657957,1152923072269916133,1152923071196174309,1152923070122432485,1152923069048690661, + 1152923067974948837,1152923066901207013,1152923065827465189,1152923064753723365,1152923063679981541,1152923062606239717,1152923061532497893,1152923060458756069, + 1152923059385013766,2305844562918119396,2305844561844377521,2305844561844377555,2305844561844377554,1152923054016300452,2305844561844377553,1152923051868816802, + 2305844561844377552,1152923049721333152,1152923048647591333,2305844561844377506,2305844561844377505,1152923045426365852,1152923044352624029,1152923043278882231, + 1152923043278882273,1536524551576,1152923044352624030,1152928017924752789,1533303326102,1152923044352624037,1152923035762692866,1152923034688947619, + 1152923033615205793,1152923032541463967,2305844536074569107,1152923034688947620,1152923029320238497,1152923028246496671,2305844531779601805,1152923029320238499, + 1152923025025271199,2305844528558376329,1152923025025271201,2305844526410892678,1152923047573849883,1152923019656562075,2305844523189667204,1152923019656562076, + 2305844521042183553,1152923015361599238,1152923077638625035,2305844517820958078,1152927874043352557,2305844515673478957,1152923059385013756,2305844513525995492, + 2305844512452253620,1152928072685590350,2305844510304765303,1152923074417399628,2305844508157281653,1152923002476695869,1152923074417399760,2305844504936056181, + 1152926244103263083,1152922998181725552,2305844501714830706,2305844502788575549,1490353657360,2305844498493605229,1152922992813016442,2305844512452253667, + 1152928072685590454,2305844494198637928,1152923074417399732,2305844492051154278,1152922986370568505,4734127707664,2305844488829928803,1152922983149340147, + 1477468751209,1152922981001860870,1152923012140373771,2305844483461219678,1152927880485803501,2305844481313740595,1152923059385013760,2305844479166257124, + 2305844478092515293,1152928072685590389,2305844475945026903,2305844474871285105,6544456422928,6543382676819,1152922967043216215,1152922965969470804, + 1152923073343657850,2305844468428834132,1152923072269915981,2305844466281350478,1152923071196174156,2305844464133866828,1152923070122432377,2305844461986383178, + 1152923069048690552,2305844459838899528,1152923067974948727,2305844457691415878,1152923066901206902,2305844455543932228,1152922949863346508,2305844453396448592, + 1152928072685590380,2305844451248964951,1152922945568379629,2305844449101481280,2305848211492836183,1437740307984,2305844445880255804,1152922940199667034, + 2305844478092515189,1152928072685590493,2305844441585288503,1152922935904703221,1152922935904703170,2305844438364063028,1152922935904703225,2305844436216579378, + 1152922935904703162,2305844434069095728,1152923074417399749,2305844431921612085,1152922926241026752,2305844429774128430,2305844442659030335,1152922923019801325, + 2305844426552902954,1152923073343657954,2305844424405419317,1152923072269916085,2305844422257935653,1152923071196174260,2305844420110452003,1152923070122432481, + 2305844417962968353,1152923069048690656,2305844415815484703,1152923067974948831,2305844413668001053,1152923066901207006,2305844411520517403,1152922905839932272, + 2305844409373033767,1152922905839932257,2305844407225550103,1152923072269916113,2305844405078066469,1152923071196174288,2305844402930582803,2305844401856840992, + 2305844400783099166,2305844399709357340,2305844398635615514,1152922892955030379,2305844396488131861,2305848165321937653,2305844394340651769,2305844393266909882, + 2305844392193168064,2305844391119426285,2305844390045684592,2305844388971942753,2305844387898200939,1377610765840,2305844385750713611,1152922880070125061, + 1374389536056,1152922877922645766,1152922977780635403,2305844380382004478,1152927878338319853,2305844378234525489,1152923059385013774,2305844376087042020, + 2305844375013300085,1152928072685590485,2305844372865811703,1152923074417399764,2305844370718328053,1152923073343657939,2305844368570844403,1152923072269916114, + 2305844366423360753,2305846339960835152,2305844364275878969,1353988445712,1152922857521546675,2305844361054651631,1152923070122432465,2305844358907167978, + 1152922853226582871,5316095776272,2305844355685942503,1152922850005353722,2305844365349619123,1152928072685590481,2305844351390975223,2305844350317233521, + 1152923073343657935,2305844348169749728,1152923072269916110,2305844346022266078,1152922840341677283,1152922839267939061,1152928038325852117,1152928051210751952, + 2305844340653556953,1152922834972973029,2305844338506073335,1152928038325852116,1152925851113756624,2305844335284847828,1152922829604259254,2305844333137364181, + 1152925851113756623,2305844330989883120,1152922825309291957,2305844328842396880,1152925851113756622,2305844326694915814,1152922821014324660,2305844324547429580, + 1152922818866844354,2305844322399945946,2305844365349619122,1152922815645620165,2305844319178723280,1152922813498135232,2305844317031236806,1152922815645618498, + 2305844314883753153,1152922860742775482,2305844312736269503,1152922860742775659,2305844310588785853,1152922860742775664,2305844308441302203,1152922860742775649, + 2305844306293818553,2305844394340651712,2305844304146338114,2305844303072596666,2305844301998855019,2305844300925113200,2305844299851371361,1289563936272, + 2305844297703883959,1152922792023295487,1286342706404,1152922789875816198,1152922874701420299,2305844292335174828,1152927876190836205,2305844290187695919, + 1152923059385013764,2305844288040212452,2305844286966470621,1152928072685590476,2305844284818982053,1152926551193425757,1152927950279022080,2305844281597761396, + 1152927949205280260,2305844279450272928,1152927948131538438,2305844277302789278,1152927947057796615,2305844275155305628,1152927530445969263,2305844273007821978, + 1152927529372227438,2305844270860338328,2305844269786598415,1152922764106009644,2305844267639112866,1152922761958524342,2305844265491629219,1152924856828827597, + 1152922758737298577,1254130456080,2305844261196661903,1152922755516073128,2305844286966470517,6064493828044,1152922752294852581,2305844255827952779, + 2305844254754211060,1152922749073624001,6047313958860,1152922746926143461,2305844250459243659,1152923074417399763,2305844248311760003,1152922742631171207, + 6062346344396,1152922740483692517,2305844244016792715,1152923074417399762,2305844241869309053,1152922736188720256,1152922735114980286,2305844238648083590, + 6051608926156,1152922731893757925,2305844235426858123,1152923074417399761,2305844233279374453,1152922727598785658,6043018991564,1152922725451306981, + 2305844228984407179,2305844227910665585,1152922722230076530,6041945249740,1152922720082597861,2305844223615698059,1152923074417399759,2305844221468214378, + 1152922715787625581,6052682667980,1152922713640146917,2305844217173247115,1152923074417399758,2305844215025763428,1152922709345174631,1152922708271437770, + 2305844211804537976,2305846236881619905,2305844209657059274,1199369623056,2305844207509570655,1152922701828982265,1196148393100,1152922699681502982, + 1152922786654590731,2305844202140861528,1152927869748385261,2305844199993382697,1152923059385013755,2305844197845899236,1152928072685590431,2305844195698410578, + 1152923074417399712,2305844193550926928,1152923069048690600,2305844191403443278,1152923067974948775,2305844189255959628,1152923066901206950,2305844187108475978, + 1152923065827465125,2305844184960992328,2204391970720,1173599819280,1152922677132919878,1152923073343657900,2305844179592283214,1152923072269916075, + 2305844177444799553,1152923071196174250,2305844175297315903,1152923070122432425,2305844173149832253,1152922667469243461,2305844171002348611,1152928013629790127, + 1152922664248022957,1152922663174281136,1152922662100534329,2305844563991861220,2305849032905327668,1152928072685590442,2305844162412414003,1152923074417399721, + 2305844160264930353,1152923073343657896,2305844158117446703,1152923072269916069,2305844155969963053,1152923071196174244,2305844153822479403,1152923070122432418, + 2305844151674995753,1152923069048690593,2305844149527512103,1152923266617181836,1152922642773181477,2305844146306286645,2305849031831585844,2305844144158802994, + 2305844143085061168,2305844142011319342,1152927526151002016,2305844139863840675,2305849510720443920,1152927525077255195,2305844136642610204,1152922630962021812, + 2305844134495126558,1152922628814538317,2305844132347642914,1152923059385013765,2305844130200164324,2305849028610360339,1152928072685590482,2305844126978933778, + 2305844125905192052,1152923073343657936,2305844123757708303,1152923072269916111,2305844121610224653,1152926712254698349,1152922614855899079,1152922613782152203, + 2305844117315257365,2305844147380028470,2305844115167774285,2305844114094031881,1103806600720,2305844111946548231,1152922606265959508,1152922664248018986, + 1152922604118480816,1152922603044734009,1152928072685590357,2305844105504097298,1152923074417399636,2305844103356613628,1152923073343657811,2305844101209129978, + 1152923072269915986,2305844099061646328,1152922593381057545,2305844096914162686,2305844107651580937,1085552989712,2305844093692937204,1152922588012348909, + 1082331759617,1152922585864869638,1152922696460277515,2305844088324228078,1152927867600901613,2305844086176749351,2305849027536618548,1152928072685590483, + 2305844082955518953,1152923073343657925,2305844080808035303,1152923072269916100,2305844078660551653,1152923071196174275,2305844076513068003,1152923070122432450, + 2305844074365584353,1152923069048690625,2305844072218100703,1152923067974948800,2305844070070617053,1152923066901206975,2305844067923133403,1152923065827465150, + 2305844065775649753,1152923064753723325,2305844063628166103,1152923063679981500,2305844061480682453,1152923062606239675,2305844059333198803,1152923061532497850, + 2305844057185715153,2305849026462876724,2305849557965084176,1152922549357647845,2305844052890747854,1152923073343657821,2305844050743264203,1152923072269915996, + 2305844048595780553,1152923071196174171,2305844046448296903,1152923070122432346,2305844044300813253,1152923069048690521,2305844042153329603,1152923067974948696, + 2305844040005845953,1152923066901206871,2305844037858362303,1152923065827465046,2305844035710878653,1152923064753723221,2305844033563395003,1152923063679981396, + 2305844031415911353,1152923062606239571,2305844029268427703,1152923061532497746,2305844027120944053,1152922521440355279,1152922520366616971,2305844164559902220, + 2305844022825976808,1152923074417399744,2305844020678493103,2305844019604751334,2305844018531009508,2305844017457267682,2305844016383525856,2305849025389134900, + 1152927551920805825,2305844013162305491,6064493822886,1152922506407974885,2305844009941074856,1152923073343657919,2305844007793591203,1152923072269916094, + 2305844005646107553,1152923071196174269,2305844003498623903,1152923070122432444,2305844001351140253,1152922495670551465,1152922494596813565,2305843998129914801, + 2305849024315393076,2305843995982431208,2305843994908689326,2305843993834947558,2305843992761205732,2305843991687463906,2305843990613722080,1152922484933133211, + 2305849023241651252,1152922507481716709,2305843986318754703,2305843985245012910,1152923073343657915,2305843983097529228,1152923072269916090,2305843980950045578, + 1152923071196174265,2305843978802561928,1152923070122432440,2305843976655078278,1152922470974489488,1152927556215773121,2305843973433858003,6064493822849, + 1152922466679527397,2305843970212627368,2305843969138885578,2305843968065143752,2305843966991401926,2305843965917660100,1152922460237071235,1152922459163333142, + 2305843962696434584,2305844084029261142,1152923073343657941,2305843959475209078,1152923072269916116,2305843957327725428,1152923071196174291,2305843955180241778, + 1152923070122432466,2305843953032758128,1152923069048690641,2305843950885274478,1152923067974948816,2305843948737790828,1152923066901206991,2305843946590307178, + 1152923065827465166,2305843944442823528,1152927517561062828,2305843942295339878,1152922436614755061,2305843940147856247,1152927516487321004,2305843938000372582, + 1152922432319787714,2305843935852888930,1152927515413579180,2305843933705405286,1152922428024820416,2305843931557921630,1152927514339837356,2305843929410437990, + 2305844164559902212,1152928072685590394,2305843926189212503,1152927513266095542,2305843924041728853,1152923073343657955,2305843921894245203,1152927512192353716, + 2305843919746761553,1152922414066172760,1152922412992435056,2305843916525536090,1152927511118611884,2305843914378052470,1152928072685590498,2305843912230569011, + 2305843911156827437,2305843910083085138,1152923072269916117,2305843907935601478,1152923071196174292,2305843905788117828,1152923070122432467,2305843903640634178, + 1152923069048690642,2305843901493150528,1152922395812561738,1152922394738823866,2305843898271925068,1152927510044870060,2305843896124441462,1152922390443852606, + 1152922389370110799,1152922388296373099,2305843891829474107,1152927508971128236,2305843889681990502,2305844164559902215,2305843887534507254,2305843886460765428, + 2305843885387023602,2305843884313281776,1152922378632692531,1152922377558954849,2305843881092055861,1152922438762238713,2305843878944572203,2305849012504233012, + 2305843876797089110,2305843875723346805,2305843874649604979,2305843873575863153,2305843872502121327,2305843871428379501,2305843870354637675,2305843869280895849, + 2305843868207154023,1152922362526569197,2305843866059670313,2305849568702502416,1152922359305344997,2305843862838444968,2305843861764703093,2305843860690961267, + 2305843859617219441,2305843858543477615,1152922352862892887,2305843856395993885,2305843912230568993,2305843854248510765,2305843853174768466,1152923072269915997, + 2305843851027284753,1152922345346699934,2305843848879801108,2305843912230568791,2305843846732317997,2305843845658575698,2305843844584834020,1152922338904249034, + 2305843842437350157,2305843851027284806,1152923071196174172,2305843839216124678,1152923070122432347,2305843837068641028,1152923069048690522,2305843834921157378, + 1152922329240572435,2305843832773673735,2305849011430491188,2305843830626190153,2305843829552448813,2305843828478706514,2305843827404964836,2305843826331223010, + 2305843825257481184,2305843824183739358,1152922318503154374,2305843822036255486,1152923074417399736,2305843819888771859,2305843818815030098,1152923072269916115, + 2305843816667546353,2305849528974054928,1152922309913216438,2305843813446320915,2305843812372579154,2305843811298837744,1152922305618248431,1152922304544509756, + 2305843808077611764,2305843819888771912,2305843805930128210,2305843804856386288,1152923071196174290,2305843802708902628,2305843801635161321,1152923069048690640, + 2305843799487677153,1152922293807091366,2305843797340193511,1152923074417399737,2305843795192709960,2305843794118968146,2305843793045226256,2305843791971484421, + 2305843790897742595,2305843789824000769,2305849060822620089,1152922283069670838,2305843786602775368,2305843785529033554,1152923072269915993,2305843783381549778, + 1152923071196174168,2305843781234066128,1152923070122432343,2305843779086582478,1152923069048690518,2305843776939098828,1152922271258510038,1152926687558637532, + 1152922269111031751,1152922268037284553,2305843771570389725,2305843795192709884,2305843769422906194,2305843768349164304,2305843767275422469,2305843766201680643, + 2305843765127938817,2305843786602775292,2305843762980455250,2305843761906713297,2305843760832971471,2305843759759229645,2305843758685487819,1152922253004899007, + 1152926687558636397,1152922250857420743,1152922249783673528,2305843753316778693,1152923072269914399,2305843751169295066,1152923071196172087,2305843749021811378, + 1152923070122430258,2305843746874327728,1152923069048688429,2305843744726844078,1152923072269913896,2305843742579360466,1152923071196172067,2305843740431876778, + 1152923070122430238,2305843738284393128,1152923069048688409,2305843736136909478,1152922230456320684,2305843819888771836,2305843732915684178,2305843731841942288, + 2305843730768200453,2305843729694458627,2305843728620716801,1152922222940127907,2305849060822620088,1152922220792645046,2305843724325749500,2305843723252007762, + 2305843722178265809,2305843721104523983,2305843720030782157,2305843718957040331,1152922213276451484,1152922212202712929,2305843715735814836,2305844164559902208, + 1152928072685590469,2305843712514589328,1152923074417399748,2305843710367105678,2305843709293364170,1152922203612779149,2305843707145880209,2305844164559902203, + 2305843704998396559,2305843703924654733,2305843702850913226,1152922197170328203,2305843700703429257,2305844164559902214,1152928072685590499,2305843697482203778, + 1152923074417399778,2305843695334720128,2305843694260978662,2305843693187236836,2305843692113495010,1152928063021912942,1152922185359169479,1152922184285422203, + 2305843687818527363,1152923064753723346,2305843685671044055,1152923063679981521,2305843683523560053,1152923062606239696,2305843681376076403,1152923061532497871, + 2305843679228592753,1152922173548004275,1152922172474262537,2305843676007367287,2305847831388230397,2305843673859887638,2305843672786146037,2305843671712404162, + 2305843670638662336,2305843669564920688,2305843668491178682,2305843667417437035,2305843666343695201,2305843665269953273,2305843664196211437,2305843663122469719, + 2305843662048727710,2305843660974985930,2305843659901243923,2305843658827502278,2305843657753759548,2305843656680017574,2305843655606272711,2305843654532530870, + 2305843653458792289,2305843652385051277,2305843651311309451,2305843650237563513,2305843649163822089,638876390928,2305843647016338028,1152922141335749610, + 1152928072685589368,2305843643795112937,2305843642721371202,2305843641647629376,2305843640573887550,2305843639500145724,2305843638426403917,2305843637352662091, + 2305843636278920265,2305843635205178439,1152923064753723300,2305843633057694278,1152923063679981475,2305843630910210628,1152923062606239650,2305843628762726978, + 1152923061532497825,2305843626615243328,1152923747653523358,1152922119860912702,2305843643795112744,2305843622320276546,2305843621246534720,2305843620172792894, + 2305843619099051068,2305843618025309261,2305843616951567435,2305843615877825609,2305843614804083783,1152923684302751785,1152922108049752627,2305843611582857788, + 2305843643795112880,2305843609435374671,1152927886928254464,598074202016,597000459792,1152922100533565356,1152922101607307176,2305843602992923178, + 1152922097312335285,2305843600845439534,1152922100533565355,1152922101607307175,2305843597624214053,1152922091943626164,2305843595476730406,1152922100533565354, + 1152922101607307174,2305843592255504928,1152922086574917043,2305843590108021281,1152922100533565353,1152922101607307173,2305843586886795803,1152922081206207922, + 2305843584739312156,1152923749801007021,1152922077984987038,1152922076911239703,2305843580444344880,2305843643795112855,2305843578296861775,2305843577223119399, + 2305843576149377570,2305843575075635741,2305843574001893912,1152922604118480798,1152922067247563277,2305843570780668435,2305843643795112847,2305843568633185359, + 2305843567559442983,2305843566485701154,2305843565411959325,2305843564338217496,1152922663174281118,1152922057583886852,2305843561116992010,2305843643795112872, + 2305843558969508943,2305843557895767106,2305843556822025280,2305843555748283454,2305843554674541628,1152922048993953720,2305843552527057409,2305843643795112910, + 2305843550379574338,2305843549305832512,2305843548232090686,2305843547158348860,2305843546084607053,2305843545010865227,2305843543937123401,2305843542863381575, + 2305843541789639237,2305843540715897411,2305843539642155585,2305843538568413759,1152923616657020830,1152922031814083052,2305843535347188217,1152922029666604976, + 1152923788455712256,1152927546552096686,2305843531052220903,2305843529978479668,1152928072685590445,2305843527830995428,1152923074417399724,2305843525683511778, + 1152923073343657890,2305843523536028128,5454608471568,1152922016781698985,1152922015707955678,2305843519241060840,6506875459088,1152922012486735364, + 1152927506823649196,2305843514946093528,1152922009265506346,1152922012486735337,1152927528298485676,2305843510651126228,1152922004970543021,2305843508503642581, + 2305843507429901364,1152928072685590443,2305843505282417103,1152928007187338752,2305843503134939050,2305843502061197225,1152921996380603830,2305843499913707981, + 1152923073343657895,2305843497766224328,6503654233616,1152921991011899302,6502580491792,1152921988864410052,1152921988864411452,2305843491323773378, + 1152921991011899300,1152921984569448360,2305843488102547904,1152928001818630057,1152921981348222888,2305843484881322429,1152921979200734644,2305843482733838790, + 1152921977053250009,1152923072269916070,2305843479512613318,1152923071196174245,2305843477365129653,1152923070122432420,2305843475217646003,1152923069048690595, + 2305843473070162353,1152921967389579180,2305843470922678711,1152921965242091291,2305843468775195098,1152928072685590440,2305843466627711618,1152923074417399722, + 2305843464480227753,1152923073343657897,2305843462332744103,2305849509646702096,2305849503204251152,449897824676,1152921953430930868,2305843456964034981, + 1152921954504672691,2305843454816551328,1152923304198150060,1152921948062220702,2305843451595325867,1152927505749907371,1152923266617185799,2305843448374100378, + 2305843447300359220,2305843446226617394,2305843445152875568,2305843444079133742,1152923072269916071,2305843441931649428,1152921936251061791,2305843439784165787, + 2305843612656599613,2305843437636682261,2305843436562940428,2305843435489198595,2305843434415458232,2305843433341714923,1152921927661131696,421980542480, + 511101108616,1953136378247,443455373702,1682553438597,2305843425825522064,1152921920144934375,414464344656,1152921917997455110, + 1152922582643644171,2305843420456812928,1152927865453417965,2305843418309334821,1610612736380,1152923059385013773,2305843415088109540,2305843414014367656, + 2305843412940620850,1152923074417399718,2305843410793136503,1152923073343657893,2305843408645652853,1152923072269916068,2305843406498169203,1152923074417399715, + 2305843404350685559,2305843403276943839,1152923072269916065,2305843401129460078,1152921895448871281,2305843411866879055,1152923073343657887,2305843396834492778, + 1152923072269916062,2305843394687009128,1152921889006420331,1152921887932678523,1152921889006420332,1152921885785200541,1152921889006420337,1152921883637716894, + 2305843387170816354,1152921881490228841,379030864226,389768282461,1152921878269007787,2305843381802107230,371514671460,1152921875047777932, + 1152921873974040326,1152921914776229643,2305843376433398103,2305844561844377502,2305844561844377501,1152921868605325652,1152927995376178692,2305843371064690086, + 1152921865384100178,1152921864310358395,1152921865384100179,1152921865384100180,2305843365695979853,2305843364622238034,2305843363548496206,1152921857867908891, + 1152921856794171142,1152921870752814859,2305843359253528903,1152927504676160936,2305843357106051044,1152928072685590444,2305843354958561603,1152923074417399723, + 2305843352811077953,1152923073343657898,2305843350663594303,1152923072269916073,2305843348516110653,1152923071196174248,2305843346368627003,1152923070122432423, + 2305843344221143353,1152923069048690598,2305843342073659703,1152923067974948773,2305843339926176053,1152923066901206948,2305843337778692403,1152923065827465123, + 2305843335631208753,1152923064753723298,2305843333483725103,1152923063679981473,2305843331336241453,1152921825655652731,2305843356032308752,2305843328115016002, + 2305843327041274176,2305843325967532350,2305843324893790524,2305843323820048698,2305843322746306872,2305843321672565046,2305843320598823220,2305843319525081394, + 2305843318451339568,2305843317377597742,2305843316303855916,1152921810623267114,1152927998597401460,303868938341,1152921807402041629,301721452828, + 1152923789529454512,1152921804180817999,2325724796432,1152921802033338268,1152921800959596448,295279001878,1152921798812107051,293131518232, + 1152921796664628177,1799591302672,1953136378126,5447092273421,1152921792369656187,2305843295902761231,1152921790222178054,1152921853572945675, + 2305843292681535753,6608880932805,1152921785927210760,1152921787000952587,2305843288386568453,6607807190980,1152921781632243464,1152921782705985291, + 2305843284091601153,6606733449155,1152921777337276168,1152921778411017995,2305843279796633853,6605659707330,1152921773042308872,1152921774116050699, + 2305843275501666553,6604585965505,1152921768747341576,1152921769821083403,2305843271206699253,6603512223680,1152921764452374280,1152921765526116107, + 2305843266911731953,6602438481855,1152921760157406984,1152921761231148811,2305843262616764653,6601364740030,1152921755862439688,1152921756936181515, + 2305843258321797353,6600290998205,1152921751567472392,1152921752641214219,2305843254026830053,6599217256380,1152921747272505096,1152921748346246923, + 2305843249731862753,6598143514555,1152921742977537800,1152921744051279627,2305843245436895453,6597069772730,1152921738682570504,1152921739756312331, + 2305843241141928153,6595996030905,1152921734387603208,1152921735461345035,2305843236846960853,6594922289080,1152921730092635912,1152921731166377739, + 2305843232551993553,6593848547255,1152921725797668616,1152921726871410443,2305843228257026253,6592774805430,1152921721502701320,1152921722576443147, + 2305843223962058953,6591701063621,1152921717207734023,1152921718281475851,2305843219667091653,6590627321796,1152921712912766727,1152921713986508555, + 2305843215372124353,6589553579971,1152921708617799431,1152921709691541259,2305843211077157053,6588479838146,1152921704322832135,1152921705396573963, + 2305843206782189753,6587406096321,1152921700027864839,1152921701101606667,2305843202487222453,6586332354496,1152921695732897543,1152921696806639371, + 2305843198192255153,6585258612671,1152921691437930247,1152921692511672075,2305843193897287853,6584184870846,1152921687142962951,1152921688216704779, + 2305843189602320553,6583111129021,1152921682847995655,1152921683921737483,2305843185307353253,6582037387196,1152921678553028359,1152921679626770187, + 2305843181012385953,6580963645371,1152921674258061063,1152921675331802891,2305843176717418653,6579889903546,1152921669963093767,1152921671036835595, + 2305843172422451353,6578816161721,1152921665668126471,1152921666741868299,2305843168127484053,6577742419896,1152921661373159175,1152921662446901003, + 2305843163832516753,6576668678071,1152921657078191879,1152921658151933707,2305843159537549453,6575594936246,1152921652783224583,1152921653856966411, + 2305843155242582153,6324339349258,1152927830019938050,1152927831093679875,142807668490,1152921647414515459,1152921646340773635,139586443018, + 1152921644193289987,1152921643119548163,136365217546,1152921640972064515,1152921639898322691,133143992074,1152921637750839043,1152921636677097219, + 129922766602,1152921634529613571,1152921633455871747,126701541130,1152921631308388099,1152921630234646275,123480315658,1152921628087162627, + 1152921627013420803,1152927974975084013,2305843127325300619,1152927972827600365,2305843125177816969,1152927970680116717,2305843123030333319,1152927968532633069, + 2305843120882849669,1152927966385149421,2305843118735366019,1152927964237665773,2305843116587882369,1152927962090182125,2305843114440398719,1152927959942698477, + 2305843112292915069,1152921642045800579,1152921605538578557,1152921604464836730,1152921603391094903,1152921602317353076,1152921601243611249,1152921600169875204, + 1152921599096127597,1152921642045800582,1152921596948643965,1152921595874902138,1152921594801160311,1152921593727418484,1152921592653676657,1152921591579934852, + 1152921590506193003,2305843094039298135,1152921645267026054,1152921587284967549,1152921586211225722,1152921585137483895,1152921584063742068,1152921582990000241, + 1152921581916258433,1152921580842516585,2305843084375621710,1152921587284967552,1152921577621291130,1152921576547549303,1152921575473807476,1152921574400065649, + 1152921573326323838,1152921572252581991,2305843075785687109,1152921577621291133,1152921569031356535,1152921567957614708,1152921566883872881,1152921565810131067, + 1152921564736389221,2305843068269494333,1152921569031356538,1152921561515163764,1152921560441421937,1152921559367680120,1152921558293938275,2305843061827043382, + 1152921561515163767,1152921555072712817,1152921553998970997,1152921552925229153,2305843056458334256,1152921555072712820,1152921549704003698,1152921548630261855, + 2305843052163366955,6064493827850,1152921545409036327,39728447623,1152927846126065427,1152921542187816721,1152921541114074896,1152921540040333070, + 1152921538966591245,1152928117782747109,2305843041425949944,1152928116709000630,2305843039278465053,1152928115635258805,2305843037130981403,1152928114561516980, + 2305843034983497753,1152921529302908959,1152921528229168146,1152928079128041445,2305843030688531474,1152928078054294966,2305843028541046803,1152928076980553141, + 2305843026393563153,1152928075906811316,2305843024246079503,1152928074833068045,12884901909,2305849344290461455,1152927832167421701,1152927832167415819, + 1152921514270523402,2305843017803628580,2305843015656144903,1152921509975556101,1152921508901814276,1152921507828072451,1152921506754330626,1152921505680588801 ] diff --git a/crates/lib/core/asm/sys/vm/deep_queries.masm b/crates/lib/core/asm/sys/vm/deep_queries.masm index f2ea0e28dc..028e019428 100644 --- a/crates/lib/core/asm/sys/vm/deep_queries.masm +++ b/crates/lib/core/asm/sys/vm/deep_queries.masm @@ -74,22 +74,22 @@ end #! 3. alpha is the randomness used in order to build the DEEP polynomial. #! #! Inputs: [Y, query_ptr] -#! Outputs: [Y, q_x_at_alpha_1, q_x_at_alpha_0, q_x_at_alpha_1, q_x_at_alpha_0, index, query_ptr] +#! Outputs: [Y, q_x_at_alpha_0, q_x_at_alpha_1, q_x_at_alpha_0, q_x_at_alpha_1, index, query_ptr] #! #! where: #! - Y is a "garbage" word. proc load_query_row # Process the main segment of the execution trace portion of the query exec.process_main_segment_execution_trace - #=> [Y, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] + #=> [Y, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] # Process the auxiliary segment of the execution trace portion of the query exec.process_aux_segment_execution_trace - #=> [Y, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] + #=> [Y, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] # Process the constraints composition polys trace portion of the query exec.process_constraints_composition_poly_trace - #=> [Y, q_x_at_alpha_1, q_x_at_alpha_0, q_x_at_alpha_1, q_x_at_alpha_0, index, query_ptr] + #=> [Y, q_x_at_alpha_0, q_x_at_alpha_1, q_x_at_alpha_0, q_x_at_alpha_1, index, query_ptr] end # MAIN TRACE SEGMENT PROCESSING @@ -98,28 +98,28 @@ end #! Handles the logic for processing the main segment of the execution trace. #! #! Inputs: [Y, query_ptr] -#! Output: [Y, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] +#! Output: [Y, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] proc process_main_segment_execution_trace # Load the query index - dup.4 mem_loadw_be + dup.4 mem_loadw_le #=> [index, depth, y, y, query_ptr] where y are "garbage" values here and throughout # Get commitment to main segment of the execution trace movdn.3 movdn.2 push.0.0 - exec.constants::main_trace_com_ptr mem_loadw_be + exec.constants::main_trace_com_ptr mem_loadw_le #=>[MAIN_TRACE_TREE_ROOT, depth, index, query_ptr] # Use the commitment to get the leaf and save it dup.5 dup.5 mtree_get - exec.constants::tmp3 mem_storew_be + exec.constants::tmp3 mem_storew_le adv.push_mapval #=>[LEAF_VALUE, MAIN_TRACE_TREE_ROOT, depth, index, query_ptr] - exec.constants::tmp2 mem_loadw_be + exec.constants::tmp2 mem_loadw_le swapw - #=>[LEAF_VALUE, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] + #=>[LEAF_VALUE, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] # Load the values of the main segment of the execution trace at the current query. We also # compute their hash and the value of their random linear combination using powers of a @@ -130,10 +130,11 @@ proc process_main_segment_execution_trace #=> [Y, Y, 0, 0, 0, 0, ptr, y, y, y] exec.load_main_segment_execution_trace - #=> [Y, L, C, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] + #=> [Y, L, C, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] # Load the leaf value we got using `mtree_get` and compare it against the hash we just computed - exec.constants::tmp3 mem_loadw_be + swapw + exec.constants::tmp3 mem_loadw_le assert_eqw.err=LEAF_VALUE_MISMATCH end @@ -142,9 +143,9 @@ end #! Inputs: [Y, Y, 0, 0, 0, 0, ptr] #! Outputs: [Y, D, C, ptr] #! -#! Cycles: 30 +#! Cycles: 27 proc load_main_segment_execution_trace - repeat.10 + repeat.9 adv_pipe horner_eval_base exec.poseidon2::permute @@ -157,34 +158,35 @@ end #! Handles the logic for processing the auxiliary segment of the execution trace, if such a trace #! exists. #! -#! Inputs: [Y, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] -#! Output: [Y, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] +#! Inputs: [Y, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] +#! Output: [Y, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] proc process_aux_segment_execution_trace # Load aux trace commitment and get leaf - exec.constants::aux_trace_com_ptr mem_loadw_be + exec.constants::aux_trace_com_ptr mem_loadw_le # Get the leaf against the auxiliary trace commitment for the current query dup.9 dup.9 mtree_get - exec.constants::tmp3 mem_storew_be + exec.constants::tmp3 mem_storew_le adv.push_mapval - #=> [L, R, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] + #=> [L, R, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] # Load the values of the auxiliary segment of the execution trace at the current query # Set up the stack - exec.constants::zero_word_ptr mem_loadw_be + exec.constants::zero_word_ptr mem_loadw_le swapw padw - #=> [Y, Y, C, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] + #=> [Y, Y, C, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] # Load the first 4 columns as a batch of 4 quadratic extension field elements. exec.load_aux_segment_execution_trace - #=> [Y, D, C, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] + #=> [Y, D, C, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] # Load the leaf value we got using `mtree_get` and compare it against the hash we just computed - exec.constants::tmp3 mem_loadw_be + swapw + exec.constants::tmp3 mem_loadw_le assert_eqw.err=LEAF_VALUE_MISMATCH - #=> [Y, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] + #=> [Y, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] end #! Loads the portion of the query associated to the auxiliary segment of the execution trace. @@ -196,7 +198,7 @@ end proc load_aux_segment_execution_trace repeat.2 adv_pipe - horner_eval_ext + horner_eval_base exec.poseidon2::permute end end @@ -206,30 +208,31 @@ end #! Handles the logic for processing the constraints composition polynomials trace. #! -#! Inputs: [Y, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] -#! Output: [Y, q_x_at_alpha_1, q_x_at_alpha_0, q_x_at_alpha_1, q_x_at_alpha_0, index, query_ptr] +#! Inputs: [Y, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] +#! Output: [Y, q_x_at_alpha_0, q_x_at_alpha_1, q_x_at_alpha_0, q_x_at_alpha_1, index, query_ptr] proc process_constraints_composition_poly_trace # Load the commitment to the constraint trace - exec.constants::composition_poly_com_ptr mem_loadw_be - #=> [R, ptr_x, ptr_alpha_inv, acc1, acc0, depth, index, query_ptr] + exec.constants::composition_poly_com_ptr mem_loadw_le + #=> [R, ptr_x, ptr_alpha_inv, acc0, acc1, depth, index, query_ptr] # Get the leaf against the commitment dup.9 movup.9 mtree_get - exec.constants::tmp3 mem_storew_be + exec.constants::tmp3 mem_storew_le adv.push_mapval - #=>[L, R, ptr_x, ptr_alpha_inv, acc1, acc0, index, query_ptr] + #=>[L, R, ptr_x, ptr_alpha_inv, acc0, acc1, index, query_ptr] # Load the 8 columns as quadratic extension field elements in batches of 4. padw swapw.2 exec.load_constraints_composition_polys_trace - #=> [Y, L, Y, ptr_x, ptr_alpha_inv, acc1, acc0, index, query_ptr] + #=> [Y, L, Y, ptr_x, ptr_alpha_inv, acc0, acc1, index, query_ptr] # Load the leaf value we got using `mtree_get` and compare it against the hash we just computed - exec.constants::tmp3 mem_loadw_be + swapw + exec.constants::tmp3 mem_loadw_le assert_eqw.err=LEAF_VALUE_MISMATCH - #=> [Y, ptr_x, ptr_alpha_inv, acc1, acc0, index, query_ptr] + #=> [Y, ptr_x, ptr_alpha_inv, acc0, acc1, index, query_ptr] # Re-order the stack swapw @@ -247,7 +250,7 @@ end proc load_constraints_composition_polys_trace repeat.2 adv_pipe - horner_eval_ext + horner_eval_base exec.poseidon2::permute end end diff --git a/crates/lib/core/asm/sys/vm/mod.masm b/crates/lib/core/asm/sys/vm/mod.masm index eef1a63efe..cc5c1ace24 100644 --- a/crates/lib/core/asm/sys/vm/mod.masm +++ b/crates/lib/core/asm/sys/vm/mod.masm @@ -1,19 +1,74 @@ +use miden::core::sys::vm::aux_trace use miden::core::sys::vm::deep_queries use miden::core::sys::vm::constraints_eval use miden::core::sys::vm::ood_frames use miden::core::sys::vm::public_inputs use miden::core::stark::verifier +use miden::core::stark::constants -# Indicates the existence of auxiliary trace segment. -const IS_AUX_TRACE = 1 +# Acceptable security parameters for Miden VM proof verification. +# These define the security policy enforced by `assert_acceptable_options`. +# If the protocol security level changes, update these constants accordingly. +const ACCEPTABLE_NUM_QUERIES = 27 +const ACCEPTABLE_QUERY_POW_BITS = 16 +const ACCEPTABLE_DEEP_POW_BITS = 12 +const ACCEPTABLE_FOLDING_POW_BITS = 4 -# Main segment width is 80 (0x50) and there are 1 (0x01) auxiliary segments -# of width 8 (0x08) using 16 (0x10) random extension field elements -const TRACE_INFO = 0x50010810 +# RELATION_DIGEST = hash(PROTOCOL_ID, CIRCUIT_COMMITMENT). +# This is a compile-time constant computed once per AIR that binds the Fiat-Shamir +# transcript to the relation (AIR structure + fix protocol parameter choices). +# +# PROTOCOL_ID (defined in circuit_evaluation.rs) implicitly covers every hardcoded +# protocol choice: hash function, field, blowup factor, FRI folding factor, coset +# offset, max remainder degree, etc. It must be bumped when any of these change. +# CIRCUIT_COMMITMENT covers the AIR constraints (via the encoded ACE circuit hash). +const RELATION_DIGEST_0 = 7682526984894530630 +const RELATION_DIGEST_1 = 13019009422810970716 +const RELATION_DIGEST_2 = 16037978224454945133 +const RELATION_DIGEST_3 = 1332031755710493241 + +#! Loads security parameters from the advice stack and stores them in memory. +#! +#! The advice stack must contain, in order: +#! [num_queries, query_pow_bits, deep_pow_bits, folding_pow_bits] +#! +#! After this procedure, all four values are available in memory via the corresponding +#! accessors in constants.masm (get_number_queries, get_query_pow_bits, etc.). +#! +#! Input: [...] +#! Output: [...] +proc load_security_params + adv_push.1 exec.constants::set_number_queries + adv_push.1 exec.constants::set_query_pow_bits + adv_push.1 exec.constants::set_deep_pow_bits + adv_push.1 exec.constants::set_folding_pow_bits +end + +#! Asserts that the security parameters in memory meet the Miden VM security policy. +#! +#! Input: [...] +#! Output: [...] +proc assert_acceptable_options + exec.constants::get_number_queries + push.ACCEPTABLE_NUM_QUERIES assert_eq.err="num_queries does not match acceptable security policy" + + exec.constants::get_query_pow_bits + push.ACCEPTABLE_QUERY_POW_BITS assert_eq.err="query_pow_bits does not match acceptable security policy" + + exec.constants::get_deep_pow_bits + push.ACCEPTABLE_DEEP_POW_BITS assert_eq.err="deep_pow_bits does not match acceptable security policy" + + exec.constants::get_folding_pow_bits + push.ACCEPTABLE_FOLDING_POW_BITS assert_eq.err="folding_pow_bits does not match acceptable security policy" +end #! Verifies a STARK proof attesting to the correct execution of a program in the Miden VM. #! +#! Security parameters (num_queries, query_pow_bits, deep_pow_bits, folding_pow_bits) are +#! loaded from the advice stack, validated against the acceptable security policy, and +#! stored in memory for use by the generic verifier. +#! #! - The public inputs are composed of the input and output stacks, of fixed size equal to 16, as #! well as the program and the kernel procedures digests. #! - There are two trace segments, main and auxiliary. It is assumed that the main trace segment @@ -24,37 +79,21 @@ const TRACE_INFO = 0x50010810 #! Note that, due to the padding of the main trace columns, the number of OOD evaluations per row #! is 80 for the main trace. #! -#! Inputs: [log(trace_length), num_queries, grinding] +#! Inputs: [log(trace_length)] #! Outputs: [] -#! -#! Cycles: -#! 1- Remainder polynomial size 64: -#! 2515 + num_queries * (512 + num_fri_layers * 83) + 108 * num_fri_layers + 10 * log(trace_length) -#! 2- Remainder polynomial size 128: -#! 2540 + num_queries * (541 + num_fri_layers * 83) + 108 * num_fri_layers + 10 * log(trace_length) -#! -#! where num_fri_layers is computed as: -#! -#! 1- If log(trace_length) is even, then num_fri_layers = (log(trace_length) - 6) / 2, where 6 = log2(64), -#! 2- If log(trace_length) is odd, then num_fri_layers = (log(trace_length) - 7) / 2, where 7 = log2(128). pub proc verify_proof - # --- Get constants ------------------------------------------------------- + # --- Load and validate security parameters from advice stack --- - # Flag indicating the existence of auxiliary trace - push.IS_AUX_TRACE movdn.3 - # => [log(trace_length), num_queries, grinding, is_aux_trace] + exec.load_security_params + exec.assert_acceptable_options + # => [log(trace_length)] - # Number of fixed length public inputs - exec.public_inputs::get_num_fixed_len_public_inputs movdn.3 - # => [log(trace_length), num_queries, grinding, num_fixed_len_pi, is_aux_trace] - - # Trace info as one field element - push.TRACE_INFO movdn.3 - # => [log(trace_length), num_queries, grinding, trace_info, num_fixed_len_pi, is_aux_trace] + # --- Get constants ------------------------------------------------------- - # Number of constraints - exec.constraints_eval::get_num_constraints movdn.3 - # => [log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, is_aux_trace] + # Push RELATION_DIGEST, then move log(trace_length) back to top. + push.RELATION_DIGEST_3.RELATION_DIGEST_2.RELATION_DIGEST_1.RELATION_DIGEST_0 + movup.4 + # => [log(trace_length), rd0, rd1, rd2, rd3] # --- Load the digests of all dynamically invoked procedures -------------- @@ -62,7 +101,8 @@ pub proc verify_proof procref.constraints_eval::execute_constraint_evaluation_check procref.ood_frames::process_row_ood_evaluations procref.public_inputs::process_public_inputs - # =>[D3, D2, D1, D0, log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, is_aux_trace] + procref.aux_trace::observe_aux_trace + # => [D0, D1, D2, D3, D4, log(tl), rd0, rd1, rd2, rd3] # --- Call the core verification procedure from `core-lib` ------------------ diff --git a/crates/lib/core/asm/sys/vm/ood_frames.masm b/crates/lib/core/asm/sys/vm/ood_frames.masm index b74a73f28a..2092c24dfc 100644 --- a/crates/lib/core/asm/sys/vm/ood_frames.masm +++ b/crates/lib/core/asm/sys/vm/ood_frames.masm @@ -8,12 +8,12 @@ use miden::core::crypto::hashes::poseidon2 #! evaluation. #! #! -#! Inputs: [R2, R1, C, ptr, acc1, acc0] -#! Outputs: [R2, R1, C, ptr, acc1`, acc0`] +#! Inputs: [R0, R1, C, ptr, acc0, acc1] +#! Outputs: [R0, R1, C, ptr, acc0`, acc1`] #! -#! Cycles: 72 +#! Cycles: 78 pub proc process_row_ood_evaluations - repeat.24 + repeat.26 adv_pipe horner_eval_ext exec.poseidon2::permute diff --git a/crates/lib/core/asm/sys/vm/public_inputs.masm b/crates/lib/core/asm/sys/vm/public_inputs.masm index d2cac17f52..c090200ccf 100644 --- a/crates/lib/core/asm/sys/vm/public_inputs.masm +++ b/crates/lib/core/asm/sys/vm/public_inputs.masm @@ -1,19 +1,42 @@ use miden::core::stark::constants use miden::core::stark::random_coin use miden::core::stark::public_inputs - use miden::core::crypto::hashes::poseidon2 +# PUBLIC INPUTS PROCESSING FOR MIDEN VM RECURSIVE VERIFIER +# ================================================================================================= +# +# This module handles the Miden VM-specific public input processing for the recursive verifier. +# It populates the FLPI and VLPI portions of the ACE READ section (see `stark/constants.masm` +# for the full layout diagram). +# +# Memory layout populated by this module (growing backward from AUX_RAND_ELEM_PTR): +# +# pi_ptr --> [ FLPI: 40 base felts as 40 EF slots ] load_public_inputs +# [ VLPI: reduced kernel value (1 word) ] reduce_variable_length_public_inputs +# anchor --> [ aux_rand: beta0,beta1,alpha0,alpha1 ] (loaded ND here, verified in random_coin) +# +# The FLPI are the input/output stacks (32), program digest (4), and precompile state (4). +# The VLPI reduction is the product-inverse of (alpha + op_label + beta * digest_i) over +# all kernel procedure digests, enabling the bus interaction check. +# +# Advice stack consumption order: +# 1. fixed-length PI (40 base felts) -- load_public_inputs +# 2. num_kernel_proc_digests (1 felt) -- reduce_variable_length_public_inputs +# 3. kernel digests (8 * N base felts) -- reduce_variable_length_public_inputs +# 4. aux randomness (4 base felts) -- reduce_variable_length_public_inputs +# # CONSTANTS # ================================================================================================= -# Number of fixed length public inputs with padding (in field elements) -# This is composed of the input/output operand stacks (16 * 2) and the program digest (4) and four -# zeros for padding to the next multiple of 4. Note that, then, the fixed length public inputs -# which are stored as extension field elements will be double-word aligned. +# Number of fixed length public inputs (in field elements). +# This is composed of the input/output operand stacks (16 * 2), the program digest (4), and the +# precompile transcript state (4). Note that the fixed length public inputs are stored as extension +# field elements and are double-word aligned. const NUM_FIXED_LEN_PUBLIC_INPUTS = 40 -# Number of variable length public input groups +# Number of variable length public input groups. +# The reduced kernel value occupies 1 word (4 base felts) in the ACE READ section. const NUM_VAR_LEN_PI_GROUPS = 1 # Op label for kernel procedures table messages @@ -35,67 +58,47 @@ end #! #! 1. Loading from the advice stack the fixed-length public inputs and storing them in memory #! starting from the address pointed to by `public_inputs_address_ptr`. -#! 2. Loading from the advice stack the variable-length public inputs, storing them temporarily -#! in memory, and then reducing them to an element in the challenge field using the auxiliary -#! randomness. This reduced value is then used to impose a boundary condition on the relevant -#! auxiliary column. -#! -#! Note that the fixed length public inputs are stored as extension field elements while -#! the variable length ones are stored as base field elements. -#! -#! Note also that, while loading the above, we compute the hash of the public inputs. The hashing -#! starts with capacity registers of the hash function set to `C` that is the result of hashing -#! the proof context. +#! 2. Loading kernel procedure digests from the advice stack, reducing them, and storing the +#! reduced result at `variable_length_public_inputs_address_ptr` (in the ACE READ section). +#! 3. Loading the auxiliary randomness from the advice stack so it can be checked later. #! -#! The output D, that is the digest of the above hashing, is then used in order to reseed -#! the random coin. +#! Note that the fixed length public inputs are stored as extension field elements. +#! The kernel digests are temporarily stored in memory starting at +#! `variable_length_public_inputs_address_ptr` during reduction. The final reduced value +#! overwrites the start of this region and remains in the ACE READ section. #! -#! It is worth noting that: +#! POSTCONDITION: random coin input_len=0 on return. #! -#! 1. Only the fixed-length public inputs are stored for the lifetime of the verification procedure. -#! The variable-length public inputs are stored temporarily, as this simplifies the task of -#! reducing them using the auxiliary randomness. On the other hand, the resulting values from -#! the aforementioned reductions are stored right after the fixed-length public inputs. These -#! are stored in a word-aligned manner and padded with zeros if needed. -#! 2. The public inputs address is computed in such a way so as we end up with the following -#! memory layout: +#! The generic verifier (stark/verifier.masm) calls reseed_direct immediately after this +#! procedure, which requires input_len=0. This postcondition holds because: +#! - FLPI (40 base felts) are absorbed in groups of 8 via direct sponge permutation +#! (5 iterations * 8 = 40), bypassing the buffer entirely. +#! - VLPI (kernel digests, each padded to 8 felts) are absorbed via adv_pipe + permute, +#! also bypassing the buffer. +#! - Both paths reset the buffer counters (input_len=0, output_len=8) after completion. #! -#! [..., a_0...a_{m-1}, b_0...b_{n-1}, alpha0, alpha1, beta0, beta1, OOD-evaluations-start, ...] +#! If FLPI size changes from a multiple of 8, or VLPI digest padding changes from 8, +#! this postcondition must be re-verified. #! -#! where: -#! -#! 1. [a_0...a_{m-1}] are the fixed-length public inputs stored as extension field elements. This -#! section is double-word-aligned. -#! 2. [b_0...b_{n-1}] are the results of reducing the variable length public inputs using -#! auxiliary randomness. This section is word-aligned. -#! 3. [alpha0, alpha1, beta0, beta1] is the auxiliary randomness. -#! 4. `OOD-evaluations-start` is the first field element of the section containing the OOD -#! evaluations. -#! 3. Note that for each bus message in a group in the variable length public inputs, each -#! message is expected to be padded to the next multiple of 8 and provided in reverse order. -#! This has the benefit of making the reduction using the auxiliary randomness more efficient -#! using `horner_eval_base`. -#! -#! -#! Input: [C, ...] +#! Input: +#! - Operand stack: [...] +#! - Advice stack: [fixed_len_PI..., num_kernel_proc_digests, +#! kernel_digest_elements..., beta0, beta1, alpha0, alpha1, ...] #! Output: [...] pub proc process_public_inputs # 1) Compute the address where the public inputs will be stored and store it. # This also computes the address where the reduced variable-length public inputs will be stored. exec.get_num_fixed_len_public_inputs push.NUM_VAR_LEN_PI_GROUPS + # => [NUM_VAR_LEN_PI_GROUPS, NUM_FIXED_LEN_PUBLIC_INPUTS, ...] + exec.public_inputs::compute_and_store_public_inputs_address - # => [C, ...] + # => [...] - # 2) Load the public inputs from the advice tape. - # This will also hash them so that we can absorb them into the transcript. + # 2) Load the fixed-length public inputs from the advice tape and observe them. exec.load_public_inputs - # => [D, ...] - - # 3) Absorb into the transcript - exec.random_coin::reseed # => [...] - # 4) Reduce the variable-length public inputs using randomness. + # 3) Load kernel digests, auxiliary randomness, and reduce kernel digests. exec.reduce_variable_length_public_inputs # => [...] end @@ -106,168 +109,240 @@ end #! Loads from the advice stack the public inputs and stores them in memory starting from address #! pointed to by `public_inputs_address_ptr`. #! -#! Note that the public inputs are stored as extension field elements. +#! The public inputs are stored as extension field elements and absorbed into the random coin +#! transcript via direct sponge permutation (bypassing the buffer-based observe API). #! -#! In parallel, it computes the hash of the public inputs being loaded. The hashing starts with -#! capacity registers of the hash function set to `C` resulting from hashing the proof context. -#! The output D is the digest of the hashing of the public inputs. +#! Buffer hygiene: The random coin input/output buffers are flushed before loading the sponge +#! state onto the stack. After the loop, the state is stored back and the buffer counters are +#! reset (input_len=0, output_len=8) so subsequent random coin operations work correctly. #! -#! Inputs: [C, ...] -#! Outputs: [D, ...] +#! Inputs: [...] +#! Outputs: [...] proc load_public_inputs - # 1) Load and hash the fixed length public inputs + # 1) Flush random coin buffers and load sponge state onto the stack. + push.0 exec.constants::random_coin_output_len_ptr mem_store + push.0 exec.constants::random_coin_input_len_ptr mem_store + exec.random_coin::load_random_coin_state + # => [R0, R1, C, ...] + # 2) Place pi_ptr below the 3-word sponge state. exec.constants::public_inputs_address_ptr mem_load - movdn.4 - padw padw + movdn.12 + # => [R0, R1, C, pi_ptr, ...] + + # 3) Load and store the fixed length public inputs. + # Each iteration: load_base_store_extension_double_word loads 8 base elements from advice, + # stores them as 4 EF elements in memory, and returns the original words in the rate + # positions. The subsequent permute absorbs them into the sponge. + # 5 iterations * 8 = 40 = NUM_FIXED_LEN_PUBLIC_INPUTS. repeat.5 exec.public_inputs::load_base_store_extension_double_word exec.poseidon2::permute end + # => [R0', R1', C', pi_ptr + 80, ...] - # 2) Load and hash the variable length public inputs - - ## a) Compute the number of base field elements in total in the variable length public inputs - exec.constants::num_public_inputs_ptr mem_load - exec.get_num_fixed_len_public_inputs - sub - # => [num_var_len_pi, R2, R1, C, ptr, ...] - - ## b) Compute the number of hash iteration needed to hash the variable length public inputs. - ## We also check the double-word alignment. - u32divmod.8 - # => [rem, num_iter, R2, R1, C, ptr, ...] - push.0 assert_eq.err="range check failed: alignment" - # => [num_iter, R2, R1, C, ptr, ...] - - ## c) Prepare the stack for hashing - movdn.13 - # => [R2, R1, C, ptr, num_iter, ...] - dup.13 sub.1 swap.14 - push.0 neq - # => [(num_iter == 0), R2, R1, C, ptr, num_iter - 1, ...] - - ## d) Hash the variable length public inputs - while.true - adv_pipe - exec.poseidon2::permute - # => [R2, R1, C, ptr, num_iter, ...] - dup.13 sub.1 swap.14 - push.0 neq - end - # => [R2, R1, C, ptr, num_iter, ...] - - # 3) Return the final digest - exec.poseidon2::squeeze_digest - # => [D, ptr, num_iter, ...] where D = R1 the digest - movup.4 drop - movup.4 drop - # => [D, ...] + # 4) Store sponge state back to random coin and reset buffer counters. + exec.random_coin::store_random_coin_state + push.0 exec.constants::random_coin_input_len_ptr mem_store + push.8 exec.constants::random_coin_output_len_ptr mem_store + # => [pi_ptr + 80, ...] + + drop end #! Reduces the variable-length public inputs using the auxiliary randomness. #! -#! The procedure non-deterministically loads the auxiliary randomness from the advice tape and -#! stores it at `aux_rand_nd_ptr` so that it can be later checked for correctness. After this, -#! the procedure uses the auxiliary randomness in order to reduce the variable-length public -#! inputs to a single element in the challenge field. The resulting values are then stored -#! contiguously after the fixed-length public inputs. -#! -#! Currently, the only variable-length public inputs are the kernel procedure digests. +#! This procedure: +#! 1. Reads `num_kernel_proc_digests` from the advice stack and stores it temporarily in `tmp3`. +#! 2. Loads kernel procedure digests from the advice stack into memory at +#! `variable_length_public_inputs_address_ptr`, absorbing them into the Fiat-Shamir transcript +#! via the Poseidon2 sponge (one permutation per digest). +#! 3. Loads the auxiliary randomness (alpha, beta) from the advice stack and stores it at +#! `aux_rand_nd_ptr` for later verification. +#! 4. Reduces the kernel digests to a single extension field element using auxiliary randomness. +#! 5. The reduced value is stored at `variable_length_public_inputs_address_ptr` (in the ACE READ +#! section) by `reduce_kernel_digests`. #! #! Input: #! - Operand stack: [...] -#! - Advice stack: [beta0, beta1, alpha0, alpha1, var_len_pi_1_len, ..., var_len_pi_k_len, ...] +#! - Advice stack: [num_kernel_proc_digests, kernel_digest_elements..., +#! beta0, beta1, alpha0, alpha1, ...] #! Output: [...] proc reduce_variable_length_public_inputs - # 1) Load the auxiliary randomness i.e., alpha and beta - # We store them as [beta0, beta1, alpha0, alpha1] since `horner_eval_ext` requires memory + # 1) Read num_kernel_proc_digests from advice and store for later use. + # We use tmp3 because tmp1 and tmp2 are clobbered by reduce_kernel_digests. + adv_push.1 + exec.constants::tmp3 mem_store + # => [...] + + # 2) Load kernel digests from advice into memory, absorbing into the FS transcript. + # Each digest is padded to 8 elements (2 words), loaded via adv_pipe. + + ## a) Flush random coin buffers and load sponge state onto the stack. + push.0 exec.constants::random_coin_output_len_ptr mem_store + push.0 exec.constants::random_coin_input_len_ptr mem_store + exec.random_coin::load_random_coin_state + # => [R0, R1, C, ...] + + ## b) Place the memory destination pointer at position 12 for adv_pipe. + exec.constants::variable_length_public_inputs_address_ptr mem_load + movdn.12 + # => [R0, R1, C, var_len_ptr, ...] + + ## c) Get num_iterations (= num_kernel_proc_digests). + exec.constants::tmp3 mem_load + # => [num_iter, R0, R1, C, var_len_ptr, ...] + + ## d) Loop: load 2 words (8 felts) per digest from advice to memory via adv_pipe, + ## then absorb into the sponge via poseidon2::permute. + dup push.0 neq + while.true + sub.1 movdn.13 + # => [R0, R1, C, ptr, remaining, ...] + + adv_pipe + # => [W0, W1, C, ptr+8, remaining, ...] + exec.poseidon2::permute + # => [R0', R1', C', ptr+8, remaining, ...] + + movup.13 + # => [remaining, R0', R1', C', ptr+8, ...] + dup push.0 neq + end + # => [0, R0', R1', C', ptr_final, ...] + + ## e) Store sponge state back to random coin and reset buffer counters. + drop + # => [R0', R1', C', ptr_final, ...] + exec.random_coin::store_random_coin_state + push.0 exec.constants::random_coin_input_len_ptr mem_store + push.8 exec.constants::random_coin_output_len_ptr mem_store + # => [ptr_final, ...] + drop + # => [...] + + # 3) Load the auxiliary randomness (alpha and beta) from advice. + # Stored as [beta0, beta1, alpha0, alpha1] since `horner_eval_ext` requires memory # word-alignment. padw adv_loadw - exec.constants::aux_rand_nd_ptr mem_storew_be - # => [alpha1, alpha0, beta1, beta0, ...] + exec.constants::aux_rand_nd_ptr mem_storew_le dropw # => [...] - # 2) Get the pointer to the variable-length public inputs. - # This is also the pointer to the first address at which we will store the results of - # the reductions. + # 4) Compute gamma = beta^16 for per-bus domain separation. + # gamma is needed by reduce_kernel_digests to build bus_prefix = alpha + gamma. + # We compute it here (from the non-deterministic beta) because generate_aux_randomness + # runs later in the protocol. The value is stored at BUS_GAMMA_PTR for reuse. + exec.constants::aux_rand_nd_ptr mem_load + exec.constants::aux_rand_nd_ptr push.1 add mem_load + # => [beta1, beta0, ...] + swap + # => [beta0, beta1, ...] + dup.1 dup.1 ext2mul # beta^2 + dup.1 dup.1 ext2mul # beta^4 + dup.1 dup.1 ext2mul # beta^8 + dup.1 dup.1 ext2mul # beta^16 = gamma + # => [gamma0, gamma1, ...] + push.0.0 movup.3 movup.3 + # => [gamma0, gamma1, 0, 0, ...] + exec.constants::bus_gamma_ptr mem_storew_le + dropw + # => [...] + + # 5) Get the pointer to the variable-length public inputs and reduce kernel digests. + # The reduced value is stored by reduce_kernel_digests at var_len_ptr (in the ACE READ + # section), where it remains accessible via variable_length_public_inputs_address_ptr. exec.constants::variable_length_public_inputs_address_ptr mem_load - dup - # => [next_var_len_pub_inputs_ptr, var_len_pub_inputs_res_ptr, ...] where - # `next_var_len_pub_inputs_ptr` points to the next chunk of variable public inputs to be reduced, - # and `var_len_pub_inputs_res_ptr` points to the next available memory location where the result - # of the reduction can be stored. - # Note that, as mentioned in the top of this module, the variable-length public inputs are only - # stored temporarily and they will be over-written by, among other data, the result of reducing - # the variable public inputs. - - adv_push.1 exec.reduce_kernel_digests - # => [next_var_len_pub_inputs_ptr, var_len_pub_inputs_res_ptr, ...] - - # 3) Clean up the stack. - drop drop + # => [var_len_ptr, ...] + + exec.constants::tmp3 mem_load + # => [num_kernel_proc_digests, var_len_ptr, ...] + + exec.reduce_kernel_digests # => [...] end #! Reduces the kernel procedures digests using auxiliary randomness. #! -#! Inputs: [num_ker_procedures, digests_ptr] -#! Outputs: [next_ptr] +#! Inputs: [num_ker_procedures, digests_ptr, ...] +#! Outputs: [...] #! -#! where `digests_ptr` is a pointer to the kernel procedures digests and `next_ptr` is a pointer to -#! the start of the next group of variable public inputs to be reduced, if such a group exists. +#! where `digests_ptr` is a pointer to the kernel procedures digests. The reduced value +#! (kernel_reduced) is stored as [prod0, prod1, 0, 0] at the original `digests_ptr`. proc reduce_kernel_digests # Assert that the number of kernel procedures is at most 1023 - dup u32lt.1024 assert.err="range check failed: kernel count" + dup u32lt.1024 assert.err="number of kernel procedures must be less than 1024" - # Store number of kernel procedures digests - push.0.0 dup.2 - exec.constants::tmp1 mem_storew_be - # => [num_ker_procedures, 0, 0, num_ker_procedures, digests_ptr, ...] + # Save the original digests_ptr in TMP2 so we can store the result there later. + # (mem_stream will advance digests_ptr during the Horner loop.) + dup.1 exec.constants::tmp2 mem_store - # Load alpha - exec.constants::aux_rand_nd_ptr mem_loadw_be - # => [alpha1, alpha0, beta1, beta0, digests_ptr, ...] + # Store number of kernel procedures digests at TMP1 as [num_ker, 0, 0, num_ker]. + # We keep only digests_ptr on the stack (dropping the counter word since we read + # it back from TMP1 later). + push.0.0 dup.2 + exec.constants::tmp1 mem_storew_le + dropw + # => [digests_ptr, ...] + + # Load alpha and beta. Pad with 4 zeros (padw) so mem_loadw_le overwrites the + # padding word instead of digests_ptr (which sits at position 4 after padding). + padw + exec.constants::aux_rand_nd_ptr mem_loadw_le + # => [beta0, beta1, alpha0, alpha1, digests_ptr, ...] + + # Compute bus_prefix = alpha + gamma for per-bus domain separation. + # gamma = beta^16 was precomputed in generate_aux_randomness and stored at BUS_GAMMA_PTR. + # Since CHIPLETS_BUS = 0, bus_prefix = alpha + (0+1)*gamma = alpha + gamma. + movup.3 movup.3 + # => [alpha0, alpha1, beta0, beta1, digests_ptr, ...] + exec.constants::bus_gamma_ptr mem_load + # => [gamma0, alpha0, alpha1, beta0, beta1, digests_ptr, ...] + exec.constants::bus_gamma_ptr push.1 add mem_load + # => [gamma1, gamma0, alpha0, alpha1, beta0, beta1, digests_ptr, ...] + swap + # => [gamma0, gamma1, alpha0, alpha1, beta0, beta1, digests_ptr, ...] + ext2add + # => [prefix0, prefix1, beta0, beta1, digests_ptr, ...] - # We will keep [beta0, beta1, alpha0 + op_label, alpha1] on the stack so that we can compute + # We will keep [prefix0 + op_label, prefix1, beta0, beta1] on the stack so that we can compute # the final result, where op_label is a unique label to domain separate the interaction with - # the chiplets` bus. + # the chiplets' bus. # The final result is then computed as: # - # alpha + op_label * beta^0 + beta * (r_0 * beta^0 + r_1 * beta^1 + r_2 * beta^2 + r_3 * beta^3) - swap + # bus_prefix + op_label + beta * (r_0 * beta^0 + r_1 * beta^1 + r_2 * beta^2 + r_3 * beta^3) push.KERNEL_OP_LABEL add - swap - # => [alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, ...] + # => [prefix0 + op_label, prefix1, beta0, beta1, digests_ptr, ...] # Push the `horner_eval_ext` accumulator push.0.0 - # => [acc1, acc0, alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, ...] + # => [acc0, acc1, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, ...] # Push the pointer to the evaluation point beta exec.constants::aux_rand_nd_ptr - # => [beta_ptr, acc1, acc0, alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, ...] + # => [beta_ptr, acc0, acc1, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, ...] # Get the pointer to kernel procedures digests movup.7 - # => [digests_ptr, beta_ptr, acc1, acc0, alpha1, alpha0 + op_label, beta1, beta0, ...] + # => [digests_ptr, beta_ptr, acc0, acc1, alpha0 + op_label, alpha1, beta0, beta1, ...] # Set up the stack for `mem_stream` + `horner_eval_ext` swapw padw padw - # => [Y, Y, alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, acc1, acc0, ...] + # => [Y, Y, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, acc0, acc1, ...] # where `Y` is a garbage word. # Build a boolean flag for the expression `num_ker_procedures > 0`. - # This will be used to drive the loop reducing the digests - exec.constants::tmp1 mem_loadw_be dup + # This will be used to drive the loop reducing the digests. + # Use mem_load (not mem_loadw_le) to read only the counter without polluting the stack. + exec.constants::tmp1 mem_load + # => [num_ker, Y, Y, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, acc0, acc1, ...] push.0 neq while.true - # Compute `acc = ∑ {0≤i<4} digest_ptr[i] ⋅ βⁱ` + # Compute `acc = sum {0<=i<4} digest_ptr[i] * beta^i` # # Since the width of the digests, plus the op_label, is less than 8, we only need # to loop once @@ -275,89 +350,96 @@ proc reduce_kernel_digests mem_stream horner_eval_base end - # => [Y, Y, alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, acc1, acc0, ...] + # => [Y, Y, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, acc0, acc1, ...] swapdw - # => [alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, acc1, acc0, Y, Y, ...] + # => [alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, acc0, acc1, Y, Y, ...] movup.7 movup.7 - # => [acc1, acc0, alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, Y, Y, ...] + # => [acc0, acc1, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, Y, Y, ...] - # Compute `tmp = β ⋅ acc = ∑ {0≤i<4} digest_ptr[i] ⋅ βⁱ⁺¹` + # Compute `tmp = beta * acc = sum {0<=i<4} digest_ptr[i] * beta^(i+1)` dup.5 dup.5 - # => [beta1, beta0, acc1, acc0, alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, Y, Y, ...] + # => [beta0, beta1, acc0, acc1, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, Y, Y, ...] ext2mul - # => [tmp1, tmp0, alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, Y, Y, ...] + # => [tmp0, tmp1, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, Y, Y, ...] - # Compute `term = α + op_label + ∑{i = 0..4} digest_ptr[i] ⋅ βⁱ⁺¹` + # Compute `term = alpha + op_label + sum{i = 0..4} digest_ptr[i] * beta^(i+1)` dup.3 dup.3 ext2add - # => [term1, term0, alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, Y, Y, ...] + # => [term0, term1, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, Y, Y, ...] movdn.15 movdn.15 - # => [alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, Y, Y, term1, term0, ...] + # => [alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, Y, Y, term0, term1, ...] push.0 movdn.6 push.0 movdn.6 - # => [alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, 0, 0, Y, Y, term1, term0, ...] + # => [alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, 0, 0, Y, Y, term0, term1, ...] swapdw - # => [Y, Y, alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, 0, 0, term1, term0, ...] - - # Subtract 1 from num_ker_digests - exec.constants::tmp1 mem_loadw_be sub.1 - exec.constants::tmp1 mem_storew_be - - # Compute flag to decide on exiting the loop - dup - push.0 - neq + # => [Y, Y, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, 0, 0, term0, term1, ...] + + # Subtract 1 from num_ker_digests. + # We decrement TMP1[0] and check > 0. + exec.constants::tmp1 mem_load sub.1 + # => [counter-1, D, D, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, 0, 0, ...] + dup exec.constants::tmp1 mem_store + # => [counter-1, D, D, ...] + push.0 neq + # => [flag, D, D, ...] + # Note: flag is consumed by while.true, leaving the stack as it was before this block. end - # => [Y, Y, alpha1, alpha0 + op_label, beta1, beta0, digests_ptr, beta_ptr, 0, 0, term1, term0, ...] + # => [Y, Y, alpha0 + op_label, alpha1, beta0, beta1, digests_ptr, beta_ptr, 0, 0, term0, term1, ...] dropw dropw dropw - # => [digests_ptr, beta_ptr, 0, 0, term1, term0, ...] - dup exec.constants::tmp2 mem_store - exec.constants::tmp1 mem_loadw_be drop drop drop + # => [digests_ptr_advanced, beta_ptr, 0, 0, termN_0, termN_1, ..., term1_0, term1_1, ...] + drop drop drop drop + # => [termN_0, termN_1, ..., term1_0, term1_1, ...] - # We now need to multiply all of the reduced values + # Read the original num_ker_procedures from TMP1+3 (preserved from initial mem_storew_le). + # TMP1 word was [num_ker, 0, 0, num_ker]; TMP1+3 still holds the original value. + exec.constants::tmp1 push.3 add mem_load + # => [N, termN_0, termN_1, ..., term1_0, term1_1, ...] + + # We now need to multiply all of the reduced values. # We push the multiplicative identity element, the number of elements to multiply, and a boolean - # flag to enter or not the loop - push.1.0 + # flag to enter or not the loop. + push.0 + push.1 movup.2 dup push.0 neq - # => [loop, n, acc1, acc0, term1_1, term1_0, ..., termn_1, termn_0, ...] + # => [loop, n, acc0, acc1, term1_0, term1_1, ..., termn_0, termn_1, ...] while.true sub.1 movdn.4 - # => [acc1, acc0, term1_1, term1_0, n - 1, ..., termn_1, termn_0, ...] + # => [acc0, acc1, term1_0, term1_1, n - 1, ..., termn_0, termn_1, ...] ext2mul - # => [acc1', acc0', n - 1, ..., termn_1, termn_0, ...] + # => [acc0', acc1', n - 1, ..., termn_0, termn_1, ...] movup.2 dup push.0 neq - # => [loop, n - 1, acc1', acc0', term1_1, term1_0, ..., termn_1, termn_0, ...] + # => [loop, n - 1, acc0', acc1', term1_0, term1_1, ..., termn_0, termn_1, ...] end - # => [0, prod1, prod0, ...] where prod is the resulting product + # => [0, prod0, prod1, ...] where prod is the resulting product - # since we are initializing the bus with "requests", we should invert the reduced result + # The product of all kernel_proc_messages is kernel_reduced. drop - ext2inv - # => [inv_prod1, inv_prod0, ...] + # => [prod0, prod1, ...] - # Store the result at `digests_ptr` as `[inv_prod0, inv_prod1, 0, 0]` + # Store the result at `digests_ptr` as `[prod0, prod1, 0, 0]` # Note that `digests_ptr` points to the group that we just reduced above and hence it is safe # to overwrite it with the result. - exec.constants::tmp2 mem_load movdn.2 - # => [inv_prod1, inv_prod0, digests_ptr, ...] push.0.0 - # => [0, 0, inv_prod1, inv_prod0, digests_ptr, var_len_pub_inputs_res_ptr, ...] - dup.5 add.4 swap.6 - mem_storew_be + movup.3 + movup.3 + # => [prod0, prod1, 0, 0, ...] + exec.constants::tmp2 mem_load + # => [original_digests_ptr, prod0, prod1, 0, 0, ...] + mem_storew_le dropw - # => [digests_ptr, var_len_pub_inputs_res_ptr, ...] + # => [...] end diff --git a/crates/lib/core/docs/collections/sorted_array.md b/crates/lib/core/docs/collections/sorted_array.md index eb6251acdd..72ff343c72 100644 --- a/crates/lib/core/docs/collections/sorted_array.md +++ b/crates/lib/core/docs/collections/sorted_array.md @@ -2,6 +2,6 @@ ## miden::core::collections::sorted_array | Procedure | Description | | ----------- | ------------- | -| find_word | Finds a value in a sorted array of words.

This function will crash if the following conditions aren't met:
- words must be sorted in non-decreasing order,
- start_ptr, end_ptr are word-aligned
- `start_ptr <= end_ptr`

Input: [VALUE, start_ptr, end_ptr]
Output: [is_value_found, value_ptr, start_ptr, end_ptr]

Cycles:
Value exists: 46 cycles
Value doesn't exist and the array is empty: 25 cycles
Value doesn't exist and is smaller than all elements: 151 cycles
Value doesn't exist and is larger than all elements: 149 cycles
Value doesn't exist: 286 cycles
| -| find_key_value | Finds a key in a sorted array of (key, value) word tuples.

Inputs: [KEY, start_ptr, end_ptr]
Outputs: [is_key_found, key_ptr, start_ptr, end_ptr]

# Panics

Panics if:
- keys are not sorted in non-decreasing order,
- start_ptr is not word-aligned
- end_ptr is not double-word-aligned with the start_ptr:
- `(end_ptr - start_ptr)` must be divisible by 8
- `start_ptr > end_ptr`

Inputs: [KEY, start_ptr, end_ptr]
Output: [is_key_found, key_ptr, start_ptr, end_ptr]
| -| find_half_key_value | Finds a half-key in a sorted array of (key, value) word tuples.

Half-key means that, out of the keys in the array, only half of the key - the most significant
element (prefix) and the second most significant element (suffix) - need to match.

Inputs: [key_suffix, key_prefix, start_ptr, end_ptr]
Output: [is_key_found, key_ptr, start_ptr, end_ptr]

# Panics

Panics if:
- keys are not sorted in non-decreasing order,
- start_ptr is not word-aligned
- end_ptr is not double-word-aligned with the start_ptr:
- `(end_ptr - start_ptr)` must be divisible by 8
- `start_ptr > end_ptr`
| +| find_word | Finds a value in a sorted array of words.

**The input array must be sorted in non-decreasing lexicographic order.** The host event handler validates this and will return an error if the array is not sorted.

Input: [VALUE, start_ptr, end_ptr]
Output: [is_value_found, value_ptr, start_ptr, end_ptr]

# Panics

Panics if:
- start_ptr, end_ptr are not word-aligned
- `start_ptr > end_ptr`

Cycles:
Value exists: 46 cycles
Value doesn't exist and the array is empty: 25 cycles
Value doesn't exist and is smaller than all elements: 151 cycles
Value doesn't exist and is larger than all elements: 149 cycles
Value doesn't exist: 286 cycles
| +| find_key_value | Finds a key in a sorted array of (key, value) word tuples.

**The keys in the array must be sorted in non-decreasing lexicographic order.** The host event handler validates this and will return an error if the keys are not sorted.

Inputs: [KEY, start_ptr, end_ptr]
Outputs: [is_key_found, key_ptr, start_ptr, end_ptr]

# Panics

Panics if:
- start_ptr is not word-aligned
- end_ptr is not double-word-aligned with the start_ptr:
- `(end_ptr - start_ptr)` must be divisible by 8
- `start_ptr > end_ptr`
| +| find_half_key_value | Finds a half-key in a sorted array of (key, value) word tuples.

Half-key means that, out of the keys in the array, only half of the key - the most significant
element (prefix) and the second most significant element (suffix) - need to match.

**The half-keys in the array must be sorted in non-decreasing lexicographic order.** The host event handler validates this and will return an error if the half-keys are not sorted.

Inputs: [key_suffix, key_prefix, start_ptr, end_ptr]
Output: [is_key_found, key_ptr, start_ptr, end_ptr]

# Panics

Panics if:
- start_ptr is not word-aligned
- end_ptr is not double-word-aligned with the start_ptr:
- `(end_ptr - start_ptr)` must be divisible by 8
- `start_ptr > end_ptr`
| diff --git a/crates/lib/core/docs/crypto/aead.md b/crates/lib/core/docs/crypto/aead.md index d1146dad5e..473f2b78e2 100644 --- a/crates/lib/core/docs/crypto/aead.md +++ b/crates/lib/core/docs/crypto/aead.md @@ -4,5 +4,5 @@ AEAD (Authenticated Encryption with Associated Data) implementation using Poseid ## miden::core::crypto::aead | Procedure | Description | | ----------- | ------------- | -| encrypt | Encrypts plaintext data from memory using the `crypto_stream` instruction.

This procedure encrypts plaintext and automatically adds a padding block at the end.
The padding block [1, 0, 0, 0, 0, 0, 0, 0] is written to memory and encrypted, ensuring
proper AEAD operation without requiring the caller to handle padding manually.
This, however, requires the plaintext length to be a multiple of 8. This assumption is made
both in this procedure as well as in the decryption procedure.

Input: [key(4), nonce(4), src_ptr, dst_ptr, num_blocks, ...]
Output: [tag(4), ...]

Where:
- key is the encryption key (4 elements)
- nonce is the initialization vector (4 elements)
- src_ptr points to plaintext in memory (must be word-aligned)
- dst_ptr points to where ciphertext will be written (must be word-aligned)
- num_blocks is the number of 8-element plaintext data blocks (NO padding included)
- tag is the authentication tag returned on stack (4 elements)

Memory Layout:
- Input at src_ptr: [plaintext_block_0(8), ..., plaintext_block_n(8)]
Length: num_blocks * 8 elements (must be multiple of 8)

- Output at dst_ptr: [ciphertext_block_0(8), ..., ciphertext_block_n(8), encrypted_padding(8)]
Length: (num_blocks + 1) * 8 elements
The padding block is automatically added and encrypted

- Standard format: the tag is stored right after ciphertext to create:
[ciphertext_blocks(num_blocks * 8), encrypted_padding(8), tag(4)]
Tag location: dst_ptr + (num_blocks + 1) * 8

Memory Requirements:
- Plaintext must be at word-aligned addresses (addr % 4 == 0)
- Each block is 8 field elements (2 words)
- Blocks must be stored contiguously in memory
- src_ptr and dst_ptr MUST be different (in-place encryption not supported)
This is because crypto_stream reads and writes in the same clock cycle

Padding:
- Padding is AUTOMATIC - caller should NOT pad the plaintext
- The procedure writes [1, 0, 0, 0, 0, 0, 0, 0] to dst_ptr + (num_blocks * 8)
- This padding block is then encrypted along with the data
- For empty plaintext (num_blocks = 0), only the padding block is encrypted

Cycles (estimate): 77 + 2 * n
Where:
- n = number of field elements encrypted (includes the final padding block)
- For num_blocks data blocks: n = 8 * (num_blocks + 1)
| -| decrypt | Decrypts and authenticates ciphertext using non-deterministic advice.

This procedure implements AEAD decryption with automatic tag verification and
automatic padding handling. It mirrors the encrypt procedure's padding behavior.

Decryption Flow:
1. Computes tag location: src_ptr + (num_blocks + 1) * 8
2. Emits event for host to decrypt ciphertext (data blocks + padding block)
3. Loads plaintext data blocks from advice into dst_ptr (num_blocks * 8 elements)
4. Calls encrypt which reads data blocks and adds padding automatically
5. Re-encrypts data + padding to compute authentication tag
6. Compares computed tag with tag from memory at src_ptr + (num_blocks + 1) * 8
7. Halts execution with assertion failure if tags don't match

Input: [key(4), nonce(4), src_ptr, dst_ptr, num_blocks, ...]
Output: [] (empty stack on success, halts on failure)

Where:
- key is the decryption key (4 elements)
- nonce is the initialization vector (4 elements)
- src_ptr points to ciphertext + encrypted_padding + tag in memory (word-aligned)
- dst_ptr points to where plaintext will be written (word-aligned)
- num_blocks is the number of 8-element plaintext data blocks (NO padding)

Memory Layout:
- Input at src_ptr: [ciphertext_blocks(num_blocks * 8), encrypted_padding(8), tag(4)]
The encrypted padding is at: src_ptr + (num_blocks * 8)
The tag is at: src_ptr + (num_blocks + 1) * 8

- Output at dst_ptr: [plaintext_block_0(8), ..., plaintext_block_n(8), padding(8)]
Length: (num_blocks + 1) * 8 elements
The padding block [1, 0, 0, 0, 0, 0, 0, 0] is automatically written
Caller can ignore or remove the padding block if needed

Event: Emits AEAD_DECRYPT event with (nonce, key, src_ptr, dst_ptr, num_blocks)
The host event handler must:
- Read full ciphertext from memory at src_ptr ((num_blocks + 1) * 8 elements)
- Read authentication tag from memory at src_ptr + (num_blocks + 1) * 8
- Decrypt and verify tag using reference implementation
- Extract only data blocks (first num_blocks * 8 elements) from decrypted plaintext
- Insert data blocks (WITHOUT padding) into advice map (keyed by nonce)

Memory Requirements:
- Same as encrypt: word-aligned addresses, contiguous blocks
- src_ptr and dst_ptr MUST be different (in-place operation not supported)

Security:
- Tag verification happens in the MASM procedure via re-encryption
- Execution halts with assertion failure if tag verification fails
- If execution completes successfully, the plaintext at dst_ptr is authenticated

Non-Determinism Soundness:
This procedure uses non-deterministic advice to obtain the plaintext, which is sound
because:
1. The prover provides claimed plaintext via advice (untrusted input)
2. This procedure re-encrypts the claimed plaintext with the same (key, nonce)
3. Due to deterministic encryption, the same plaintext produces the same ciphertext
4. The computed tag cryptographically commits to both plaintext and ciphertext
5. Comparing tags verifies that the claimed plaintext is the unique plaintext that
encrypts to the given ciphertext under the given (key, nonce)

This approach is secure because:
- The MASM procedure verifies the tag when calling the encryption procedure
- The tag acts as a cryptographic commitment
- The deterministic keystream creates a bijection between plaintext and ciphertext
- Any deviation from correct plaintext causes assertion failure

Note: This procedure does NOT remove padding. The caller must handle padding removal.

Cycles (estimate): 177 + 3.5 * n
Where:
- n = number of field elements in the plaintext (excludes the padding block)
- For num_blocks data blocks: n = 8 * num_blocks
| +| encrypt | Encrypts plaintext data from memory using the `crypto_stream` instruction.

This procedure encrypts plaintext and automatically adds a padding block at the end.
The padding block [1, 0, 0, 0, 0, 0, 0, 0] is written to memory and encrypted, ensuring
proper AEAD operation without requiring the caller to handle padding manually.
This, however, requires the plaintext length to be a multiple of 8. This assumption is made
both in this procedure as well as in the decryption procedure.

Input: [key(4), nonce(4), src_ptr, dst_ptr, num_blocks, ...]
Output: [tag(4), ...]

Where:
- key is the encryption key (4 elements)
- nonce is the initialization vector (4 elements)
- src_ptr points to plaintext in memory (must be word-aligned)
- dst_ptr points to where ciphertext will be written (must be word-aligned)
- num_blocks is the number of 8-element plaintext data blocks (NO padding included)
- tag is the authentication tag returned on stack (4 elements)

Memory Layout:
- Input at src_ptr: [plaintext_block_0(8), ..., plaintext_block_n(8)]
Length: num_blocks * 8 elements (must be multiple of 8)

- Output at dst_ptr: [ciphertext_block_0(8), ..., ciphertext_block_n(8), encrypted_padding(8)]
Length: (num_blocks + 1) * 8 elements
The padding block is automatically added and encrypted

- Standard format: the tag is stored right after ciphertext to create:
[ciphertext_blocks(num_blocks * 8), encrypted_padding(8), tag(4)]
Tag location: dst_ptr + (num_blocks + 1) * 8

Memory Requirements:
- Plaintext must be at word-aligned addresses (addr % 4 == 0)
- Each block is 8 field elements (2 words)
- Blocks must be stored contiguously in memory

# Panics

Panics if the source and destination memory ranges overlap
(in-place encryption not supported).

Padding:
- Padding is AUTOMATIC - caller should NOT pad the plaintext
- The procedure writes [1, 0, 0, 0, 0, 0, 0, 0] to dst_ptr + (num_blocks * 8)
- This padding block is then encrypted along with the data
- For empty plaintext (num_blocks = 0), only the padding block is encrypted

Cycles (estimate): 77 + 2 * n
Where:
- n = number of field elements encrypted (includes the final padding block)
- For num_blocks data blocks: n = 8 * (num_blocks + 1)
| +| decrypt | Decrypts and authenticates ciphertext using non-deterministic advice.

This procedure implements AEAD decryption with automatic tag verification and
automatic padding handling. It mirrors the encrypt procedure's padding behavior.

Decryption Flow:
1. Computes tag location: src_ptr + (num_blocks + 1) * 8
2. Emits event for host to decrypt ciphertext (data blocks + padding block)
3. Loads plaintext data blocks from advice into dst_ptr (num_blocks * 8 elements)
4. Calls encrypt which reads data blocks and adds padding automatically
5. Re-encrypts data + padding to compute authentication tag
6. Compares computed tag with tag from memory at src_ptr + (num_blocks + 1) * 8
7. Halts execution with assertion failure if tags don't match

Input: [key(4), nonce(4), src_ptr, dst_ptr, num_blocks, ...]
Output: [] (empty stack on success, halts on failure)

Where:
- key is the decryption key (4 elements)
- nonce is the initialization vector (4 elements)
- src_ptr points to ciphertext + encrypted_padding + tag in memory (word-aligned)
- dst_ptr points to where plaintext will be written (word-aligned)
- num_blocks is the number of 8-element plaintext data blocks (NO padding)

Memory Layout:
- Input at src_ptr: [ciphertext_blocks(num_blocks * 8), encrypted_padding(8), tag(4)]
The encrypted padding is at: src_ptr + (num_blocks * 8)
The tag is at: src_ptr + (num_blocks + 1) * 8

- Output at dst_ptr: [plaintext_block_0(8), ..., plaintext_block_n(8), padding(8)]
Length: (num_blocks + 1) * 8 elements
The padding block [1, 0, 0, 0, 0, 0, 0, 0] is automatically written
Caller can ignore or remove the padding block if needed

Event: Emits AEAD_DECRYPT event with (nonce, key, src_ptr, dst_ptr, num_blocks)
The host event handler must:
- Read full ciphertext from memory at src_ptr ((num_blocks + 1) * 8 elements)
- Read authentication tag from memory at src_ptr + (num_blocks + 1) * 8
- Decrypt and verify tag using reference implementation
- Extract only data blocks (first num_blocks * 8 elements) from decrypted plaintext
- Insert data blocks (WITHOUT padding) into advice map (keyed by nonce)

Memory Requirements:
- Same as encrypt: word-aligned addresses, contiguous blocks

# Panics

Panics if the source and destination memory ranges overlap
(in-place decryption not supported).

Security:
- Tag verification happens in the MASM procedure via re-encryption
- Execution halts with assertion failure if tag verification fails
- If execution completes successfully, the plaintext at dst_ptr is authenticated

Non-Determinism Soundness:
This procedure uses non-deterministic advice to obtain the plaintext, which is sound
because:
1. The prover provides claimed plaintext via advice (untrusted input)
2. This procedure re-encrypts the claimed plaintext with the same (key, nonce)
3. Due to deterministic encryption, the same plaintext produces the same ciphertext
4. The computed tag cryptographically commits to both plaintext and ciphertext
5. Comparing tags verifies that the claimed plaintext is the unique plaintext that
encrypts to the given ciphertext under the given (key, nonce)

This approach is secure because:
- The MASM procedure verifies the tag when calling the encryption procedure
- The tag acts as a cryptographic commitment
- The deterministic keystream creates a bijection between plaintext and ciphertext
- Any deviation from correct plaintext causes assertion failure

Note: This procedure does NOT remove padding. The caller must handle padding removal.

Cycles (estimate): 177 + 3.5 * n
Where:
- n = number of field elements in the plaintext (excludes the padding block)
- For num_blocks data blocks: n = 8 * num_blocks
| diff --git a/crates/lib/core/docs/crypto/dsa/falcon512_poseidon2.md b/crates/lib/core/docs/crypto/dsa/falcon512_poseidon2.md index 5d4afba763..e515f746a8 100644 --- a/crates/lib/core/docs/crypto/dsa/falcon512_poseidon2.md +++ b/crates/lib/core/docs/crypto/dsa/falcon512_poseidon2.md @@ -2,7 +2,7 @@ ## miden::core::crypto::dsa::falcon512_poseidon2 | Procedure | Description | | ----------- | ------------- | -| mod_12289 | Given dividend ( i.e. a u64 given by its lower and higher u32 decomposition ) on the stack,
this routine computes c = a % M where M = 12289

Expected stack state

[a_hi, a_lo, ...]

Output stack state looks like

[c, ...] \| c = a % M

Note that it is the responsibility of the calling procedure to ensure that `a_hi` and `a_lo` are
within the appropriate range i.e., they are u32-s.

Cycles: 27
| +| mod_12289 | Given dividend ( i.e. a u64 given by its lower and higher u32 decomposition ) on the stack,
this routine computes c = a % M where M = 12289

Expected stack state

[a_hi, a_lo, ...]

Output stack state looks like

[c, ...] \| c = a % M

Note that it is the responsibility of the calling procedure to ensure that `a_hi` and `a_lo` are
within the appropriate range i.e., they are u32-s.

Cycles: 29
| | hash_to_point | Takes as input a message digest, a nonce of size 40 bytes represented as 8 field elements
and a pointer. The procedure absorbs MSG and NONCE into a fresh Poseidon2 state and squeezes the
coefficients of a polynomial c representing the hash-to-point of (MSG \|\| NONCE). The coefficients
are then saved in the memory region [c_ptr, c_ptr + 512).
This implementation of the `hash_to_point` procedure avoids the rejection-sampling step
required in the per-the-spec algorithm by using the observation on page 31 in
https://falcon-sign.info/falcon.pdf

Input: [c_ptr, MSG, NONCE1, NONCE0, ...]
Output: [...]

Cycles: ~1430
| | load_h_s2_and_product | Takes as input PK, the hash of the coefficients of the polynomial `h` representing the expanded
public key, and a pointer to the memory location where the coefficients of the polynomial `h`
will be stored.
The procedure loads `h` from the advice stack and compares its hash with the provided hash `PK`.
It then loads the polynomial `s2` representing the signature from the advice stack and lays it
in memory right after `h`.
After that, it loads the claimed polynomial `h * s2` in Z_Q[x] where Q is the Miden VM prime
from the advice stack and lays it right after `s2`.
The hash of `h`, `s2` and the claimed product is also computed and the first two field elements
of the digest (i.e., the Fiat-Shamir challenge) are used in order to check that
pi == h * s2 in Z_Q[x] by evaluating both sides at the random point. Note that since we need
to hash the polynomials before computing their evaluations, the procedure receives
the evaluation point non-deterministically so that it can perform the evaluations while hashing
is still going on. After hashing of the polynomials is finished, the procedure checks that
the evaluation point was indeed derived correctly from the hash of all 3 polynomials.

Inputs:
Operand stack: [ptr, PK, ...]
Advice stack: [tau0, tau1, h_0, ..., h_511, s2_0, ..., s2_511, pi_0, ..., pi_1022, ...]
Outputs:
Operand stack: []
Advice stack: []

Cycles: 6780
| | norm_sq | Normalizes an `e` in [0, M) to be in [-(M-1) << 1, (M-1) << 1) and returns its square norm.

We use the following formula to do so:
normalize(e) = e^2 - phi * (2*M*e - M^2) where phi := (e > (M - 1)/2)

The formula implements:

if e > (M-1)/2:
return (M - e)^2
else:
return e^2

The use of the formula avoids using the if-else block.

Input: [e, ...]
Output [norm(e)^2, ...]

Cycles: 20
| diff --git a/crates/lib/core/docs/math/u64.md b/crates/lib/core/docs/math/u64.md index a7294341d8..eeba8c203b 100644 --- a/crates/lib/core/docs/math/u64.md +++ b/crates/lib/core/docs/math/u64.md @@ -27,7 +27,7 @@ | shl | Performs left shift of one unsigned 64-bit integer.
The input value to be shifted is assumed to be represented using 32 bit limbs, but this is not checked.
The shift value n should be in the range [0, 64), otherwise it will result in an error.
Stack transition looks as follows:
[n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where c = (a << n) mod 2^64.
This takes 21 cycles.
| | shr | Performs right shift of one unsigned 64-bit integer.
The input value to be shifted is assumed to be represented using 32 bit limbs, but this is not checked.
The shift value n should be in the range [0, 64), otherwise it will result in an error.
Stack transition looks as follows:
[n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where c = a >> n.
This takes 49 cycles.
| | rotl | Performs left rotation of one unsigned 64-bit integer.
The input value to be rotated is assumed to be represented using 32 bit limbs, but this is not checked.
The rotation amount n should be in the range [0, 64), otherwise it will result in an error.
Stack transition looks as follows:
[n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where c = a <<< n (rotate left).
This takes 35 cycles.
| -| rotr | Performs right rotation of one unsigned 64-bit integer.
The input value to be rotated is assumed to be represented using 32 bit limbs, but this is not checked.
The rotation amount n should be in the range [0, 64), otherwise it will result in an error.
Stack transition looks as follows:
[n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where c = a >>> n (rotate right).
This takes 44 cycles.
| +| rotr | Performs right rotation of one unsigned 64-bit integer.
The input value to be rotated is assumed to be represented using 32 bit limbs, but this is not checked.
The rotation amount n should be in the range [0, 64), otherwise it will result in an error.
Stack transition looks as follows:
[n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where c = a >>> n (rotate right).
This takes 48 cycles.
| | clz | Counts the number of leading zeros of one unsigned 64-bit integer.
The input value is assumed to be represented using 32 bit limbs, but this is not checked.
Stack transition looks as follows:
[n_lo, n_hi, ...] -> [clz, ...], where clz is the number of leading zeros of value n.
This takes 48 cycles.
| | ctz | Counts the number of trailing zeros of one unsigned 64-bit integer.
The input value is assumed to be represented using 32 bit limbs, but this is not checked.
Stack transition looks as follows:
[n_lo, n_hi, ...] -> [ctz, ...], where ctz is the number of trailing zeros of value n.
This takes 41 cycles.
| | clo | Counts the number of leading ones of one unsigned 64-bit integer.
The input value is assumed to be represented using 32 bit limbs, but this is not checked.
Stack transition looks as follows:
[n_lo, n_hi, ...] -> [clo, ...], where clo is the number of leading ones of value n.
This takes 47 cycles.
| diff --git a/crates/lib/core/docs/mem.md b/crates/lib/core/docs/mem.md index c5c8b08045..293c16a918 100644 --- a/crates/lib/core/docs/mem.md +++ b/crates/lib/core/docs/mem.md @@ -2,8 +2,8 @@ ## miden::core::mem | Procedure | Description | | ----------- | ------------- | -| memcopy_words | Copies `n` words from `read_ptr` to `write_ptr`.

`read_ptr` and `write_ptr` pointers *must be* word-aligned.

Inputs: [n, read_ptr, write_ptr]
Outputs: []

Where:
- n is the number of words which should be copied.
- read_ptr is the memory pointer where the words to copy are stored.
- write_ptr is the memory pointer where the words will be copied.

Total cycles: 15 + 16 * num_words
| -| memcopy_elements | Copies `n` elements from `read_ptr` to `write_ptr`.

Inputs: [n, read_ptr, write_ptr]
Outputs: []

Where:
- n is the number of elements which should be copied.
- read_ptr is the memory pointer where the elements to copy are stored.
- write_ptr is the memory pointer where the elements will be copied.

Total cycles: 7 + 14 * num_elements
| +| memcopy_words | Copies `n` words from `read_ptr` to `write_ptr`.

`read_ptr` and `write_ptr` pointers *must be* word-aligned.

Inputs: [n, read_ptr, write_ptr]
Outputs: []

Where:
- n is the number of words which should be copied.
- read_ptr is the memory pointer where the words to copy are stored.
- write_ptr is the memory pointer where the words will be copied.

# Panics

Panics if the source range `[read_ptr, read_ptr + 4*n)` and destination range
`[write_ptr, write_ptr + 4*n)` overlap.

Total cycles: 15 + 16 * num_words
| +| memcopy_elements | Copies `n` elements from `read_ptr` to `write_ptr`.

Inputs: [n, read_ptr, write_ptr]
Outputs: []

Where:
- n is the number of elements which should be copied.
- read_ptr is the memory pointer where the elements to copy are stored.
- write_ptr is the memory pointer where the elements will be copied.

# Panics

Panics if the source range `[read_ptr, read_ptr + n)` and destination range
`[write_ptr, write_ptr + n)` overlap.

Total cycles: 7 + 14 * num_elements
| | pipe_double_words_to_memory | Copies an even number of words from the advice_stack to memory, computing their permutation.

Inputs: [R0, R1, C, write_ptr, end_ptr]
Outputs: [R0', R1', C', write_ptr]

Where:
- R0 is the first rate word (positions 0-3, on top of stack).
- R1 is the second rate word / digest (positions 4-7).
- C is the capacity word (positions 8-11).
- write_ptr is the memory pointer where the words will be copied.
- end_ptr is the memory pointer where the copying should end.

Notice that the `end_ptr - write_ptr` value must be positive and a multiple of 8.

Total cycles: 9 + 6 * num_word_pairs
| | pipe_words_to_memory | Copies an arbitrary number of words from the advice stack to memory, computing their permutation.

Inputs: [num_words, write_ptr]
Outputs: [R0, R1, C, write_ptr']

Where:
- num_words is the number of words which will be copied to the memory.
- write_ptr is the memory pointer where the words will be copied.
- write_ptr' is the memory pointer to the end of the copied words.
- R0, R1, C are the final Poseidon2 hasher state (R0 on top).

Total cycles:
- Even `num_words`: 43 + 9 * num_words / 2
- Odd `num_words`: 60 + 9 * round_down(num_words / 2)
| | pipe_preimage_to_memory | Moves an arbitrary number of words from the advice stack to memory and asserts it matches the
commitment.

Inputs: [num_words, write_ptr, COMMITMENT]
Outputs: [write_ptr']

Where:
- num_words is the number of words which will be copied to the memory.
- write_ptr is the memory pointer where the words will be copied.
- write_ptr' is the memory pointer to the end of the copied words.
- COMMITMENT is the commitment that the one calculated during this procedure will be compared
with.

Total cycles:
- Even `num_words`: 62 + 9 * num_words / 2
- Odd `num_words`: 79 + 9 * round_down(num_words / 2)
| diff --git a/crates/lib/core/docs/pcs/fri/frie2f4.md b/crates/lib/core/docs/pcs/fri/frie2f4.md index c1756cba11..3d83924ce0 100644 --- a/crates/lib/core/docs/pcs/fri/frie2f4.md +++ b/crates/lib/core/docs/pcs/fri/frie2f4.md @@ -2,8 +2,8 @@ ## miden::core::pcs::fri::frie2f4 | Procedure | Description | | ----------- | ------------- | -| preprocess | Stores the layer commitments C followed by [d_size, t_depth, a1, a0] and [poe, p, e1, e0] where:
1) d_size is the domain size divided by 4 of the domain corresponding to C.
2) t_depth is the tree depth of the Merkle tree with commitment C.
3) (a0, a1) is the folding challenge to create the next layer.
4) p is the query index and (e0, e1) is the evaluation at the first layer and poe is g^p with
g being the initial domain generator.
TODO: This pre-processing function should in fact compute d_size and t_depth for each C
starting from the original domain size.
| -| verify_query_layer | Checks that, for a query with index p at layer i, the folding procedure to create layer (i + 1)
was performed correctly. This also advances layer_ptr by 8 to point to the next query layer.

Input: [layer_ptr, layer_ptr, poe, p, e1, e0, layer_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...]
Output: [is_not_last_layer, layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne1, ne0, layer_ptr+8, rem_ptr, x, x, x, x, x, x, x, x, ...]

Cycles: 83
| -| verify_query_64 | Verifies one FRI query.

This procedure is specialized to the case when the remainder polynomial, used in the final check,
is expected to have degree at most 64.
This procedure is exactly the same as `verify_query_128` except for the remainder polynomial check,
thus any change to one procedure will imply an equivalent change to the other one.

Input: [poe, p, e1, e0, layer_ptr, rem_ptr, ...]
Output: [x, x, x, x, x, x, x, x, x, x, x, x, ...] (12 "garbage" elements)

- poe is g^p.
- p is a query index at the first layer.
- (e0, e1) is an extension field element corresponding to the value of the first layer at index p.
- layer_ptr is the memory address of the layer data (Merkle tree root, alpha etc.) for the next
layer.
- rem_ptr is the memory address of the remainder polynomial.

Cycles: 107 + num_layers * 83
| -| verify_query_128 | Verifies one FRI query.

This procedure is specialized to the case when the remainder polynomial, used in the final check,
is expected to have degree at most 128.
This procedure is exactly the same as `verify_query_64` except for the remainder polynomial check,
thus any change to one procedure will imply an equivalent change to the other one.

Input: [poe, p, e1, e0, layer_ptr, rem_ptr, ...]
Output: [x, x, x, x, x, x, x, x, x, x, x, x, ...] (12 "garbage" elements)

- poe is g^p.
- p is a query index at the first layer.
- (e0, e1) is an extension field element corresponding to the value of the first layer at index p.
- layer_ptr is the memory address of the layer data (Merkle tree root, alpha etc.) for the next
layer.
- rem_ptr is the memory address of the remainder polynomial.

Cycles: 140 + num_layers * 83
| -| verify | Verifies a FRI proof where the proof was generated over the quadratic extension of the base
field and layer folding was performed using folding factor 4.

Input: [...]
Output: [...]

Cycles:

Polynomial degree less than 64: 24 + num_queries * (107 + num_layers * 83)
Polynomial degree less than 128: 24 + num_queries * (140 + num_layers * 83)
| +| preprocess | Stores the layer commitments C followed by [d_size, t_depth, a0, a1] and [poe, p, e0, e1] where:
1) d_size is the domain size divided by 4 of the domain corresponding to C.
2) t_depth is the tree depth of the Merkle tree with commitment C.
3) (a0, a1) is the folding challenge to create the next layer.
4) p is the query index and (e0, e1) is the evaluation at the first layer and poe is
g^rev(p) with g being the initial domain generator and rev(.) the bit-reversal over the LDE
domain.
TODO: This pre-processing function should in fact compute d_size and t_depth for each C
starting from the original domain size.
| +| verify_query_layer | Checks that, for a query with index p at layer i, the folding procedure to create layer (i + 1)
was performed correctly. This also advances layer_ptr by 8 to point to the next query layer.

Input: [layer_ptr, layer_ptr, poe, p, e0, e1, layer_ptr, rem_ptr, x, x, x, x, x, x, x, x, ...]
Output: [is_not_last_layer, layer_ptr+8, layer_ptr+8, poe^4, f_pos, ne0, ne1, layer_ptr+8, rem_ptr, x, x, x, x, x, x, x, x, ...]

Cycles: 80
| +| verify_query_64 | Verifies one FRI query.

This procedure is specialized to the case when the remainder polynomial, used in the final check,
is expected to have degree at most 64.
This procedure is exactly the same as `verify_query_128` except for the remainder polynomial check,
thus any change to one procedure will imply an equivalent change to the other one.

Input: [poe, p, e0, e1, layer_ptr, rem_ptr, ...]
Output: [x, x, x, x, x, x, x, x, x, x, x, x, ...] (12 "garbage" elements)

- poe is g^rev(p).
- p is a query index at the first layer.
- (e0, e1) is an extension field element corresponding to the value of the first layer at index p.
- layer_ptr is the memory address of the layer data (Merkle tree root, alpha etc.) for the next
layer.
- rem_ptr is the memory address of the remainder polynomial.

Cycles: 107 + num_layers * 80
| +| verify_query_128 | Verifies one FRI query.

This procedure is specialized to the case when the remainder polynomial, used in the final check,
is expected to have degree at most 128.
This procedure is exactly the same as `verify_query_64` except for the remainder polynomial check,
thus any change to one procedure will imply an equivalent change to the other one.

Input: [poe, p, e0, e1, layer_ptr, rem_ptr, ...]
Output: [x, x, x, x, x, x, x, x, x, x, x, x, ...] (12 "garbage" elements)

- poe is g^rev(p).
- p is a query index at the first layer.
- (e0, e1) is an extension field element corresponding to the value of the first layer at index p.
- layer_ptr is the memory address of the layer data (Merkle tree root, alpha etc.) for the next
layer.
- rem_ptr is the memory address of the remainder polynomial.

Cycles: 140 + num_layers * 80
| +| verify | Verifies a FRI proof where the proof was generated over the quadratic extension of the base
field and layer folding was performed using folding factor 4.

Input: [...]
Output: [...]

Cycles:

Polynomial degree less than 64: 24 + num_queries * (107 + num_layers * 80)
Polynomial degree less than 128: 24 + num_queries * (140 + num_layers * 80)
| diff --git a/crates/lib/core/docs/pcs/fri/helper.md b/crates/lib/core/docs/pcs/fri/helper.md index 7c9e25043c..7edf554535 100644 --- a/crates/lib/core/docs/pcs/fri/helper.md +++ b/crates/lib/core/docs/pcs/fri/helper.md @@ -5,6 +5,6 @@ | evaluate_fri_remainder_poly_max_degree_plus_1_half | Evaluates FRI remainder polynomial of degree strictly less than `(max_degree + 1) / 2`.
| | evaluate_fri_remainder_poly_max_degree_plus_1 | Evaluates FRI remainder polynomial of degree strictly less than `max_degree + 1`.
| | generate_fri_parameters | Compute the number of FRI layers given log2 of the size of LDE domain. It also computes the
LDE domain generator and, from it, the trace generator and store these for later use.

Input: [...]
Output: [num_fri_layers, ...]
Cycles: 45
| -| load_fri_layer_commitments | Get FRI layer commitments and reseed with them in order to draw folding challenges i.e. alphas.

Input: [...]
Output: [...]
Cycles: 21 + 83 * num_fri_layers
| +| load_fri_layer_commitments | Get FRI layer commitments and reseed with them in order to draw folding challenges i.e. alphas.

Input: [...]
Output: [...]
Cycles: 21 + 225 * num_fri_layers
| | load_and_verify_remainder | Load and save the remainder polynomial from the advice provider and check that its hash
corresponds to its commitment and reseed with the latter.

Input: [...]
Output: [...]

Cycles:

1- Remainder polynomial of degree less
than 64: 157
2- Remainder polynomial of degree less
than 128: 191
| | compute_query_pointer | Compute the pointer to the first word storing the FRI queries.

Since the FRI queries are laid out just before the FRI commitments, we compute the address
to the first FRI query by subtracting from the pointer to the first FRI layer commitment
the total number of queries.

Input: [...]
Output: [...]

Cycles: 7
| diff --git a/crates/lib/core/docs/stark/constants.md b/crates/lib/core/docs/stark/constants.md index 802e674bbd..ca886ed480 100644 --- a/crates/lib/core/docs/stark/constants.md +++ b/crates/lib/core/docs/stark/constants.md @@ -4,6 +4,7 @@ | ----------- | ------------- | | set_lde_domain_info_word | Store details about the LDE domain.

The info stored is `[lde_size, log(lde_size), lde_g, 0]`.
| | get_lde_domain_info_word | Load details about the LDE domain.

The info stored is `[lde_size, log(lde_size), lde_g, 0]`.
| +| get_lde_domain_depth | Returns log(lde_size), i.e., the depth of the LDE domain Merkle tree.
| | z_ptr | Address for the point `z` and its exponentiation `z^N` where `N=trace_len`.

The word stored is `[z_0, z_1, z^n_0, z^n_1]`.
| | c_ptr | Returns the pointer to the capacity word of the Poseidon2-based random coin.
| | r1_ptr | Returns the pointer to the first rate word of the Poseidon2-based random coin.
| diff --git a/crates/lib/core/docs/stark/mod.md b/crates/lib/core/docs/stark/mod.md index d9b8f62a08..139f27c3e9 100644 --- a/crates/lib/core/docs/stark/mod.md +++ b/crates/lib/core/docs/stark/mod.md @@ -2,4 +2,4 @@ ## miden::core::stark::mod | Procedure | Description | | ----------- | ------------- | -| verify | Verifies a STARK proof.

The purpose of the following verifier is to serve as a generic core around which a specific
verifier can be built. It expects the following parameters on the stack from the caller:

1. `[D0, D1, D2, D3]` which are respectively the digests for dynamic execution of procedures
i. `compute_deep_composition_polynomial_queries`
ii. `execute_constraint_evaluation_check`
iii. `process_row_ood_evaluations`
iv. `process_public_inputs`
2. `num_constraints` which is the number of constraints in the AIR
3. `trace_info` which is a field element encoding the layout of the AIR
4. `num_fixed_len_pi` is the number of fixed length public inputs of the AIR

In addition to the above parameters, the verifier expects the following auxiliary proof parameters:

1. `log(trace_length)`, the logarithm base 2 of the trace length
2. `num_queries`, the number of FRI queries
3. `grinding`, the number of bits of grinding i.e., proof-of-work

The following simplifying assumptions are currently made and hardcoded:

- The blowup factor is set to 8.
- The maximal allowed degree of the remainder polynomial is 127.
- To boost soundness, the protocol is run on a quadratic extension field and this means that
the OOD evaluation frame is composed of elements in a quadratic extension field i.e. tuples.
Similarly, elements of the auxiliary trace are quadratic extension field elements. The random
values for computing random linear combinations are also in this extension field.

Inputs: [D3, D2, D1, D0, log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi]
Outputs: []
| +| verify | Verifies a STARK proof.

The purpose of the following verifier is to serve as a generic core around which a specific
verifier can be built. It expects the following parameters on the stack from the caller:

1. `[D0, D1, D2, D3, D4]` which are respectively the digests for dynamic execution of procedures
i. `compute_deep_composition_polynomial_queries`
ii. `execute_constraint_evaluation_check`
iii. `process_row_ood_evaluations`
iv. `process_public_inputs`
v. `observe_aux_trace`
2. Per-proof parameter: `log(trace_length)`
3. `[rd0, rd1, rd2, rd3]`: RELATION_DIGEST = hash(PROTOCOL_ID, CIRCUIT_COMMITMENT),
a compile-time constant that binds the Fiat-Shamir transcript to the AIR instance.

Precondition: security parameters (num_queries, query_pow_bits, deep_pow_bits,
folding_pow_bits) must already be stored in memory before calling this procedure.

The following simplifying assumptions are currently made and hardcoded:

- The blowup factor is set to 8.
- The maximal allowed degree of the remainder polynomial is 127.
- To boost soundness, the protocol is run on a quadratic extension field and this means that
the OOD evaluation frame is composed of elements in a quadratic extension field i.e. tuples.
Similarly, elements of the auxiliary trace are quadratic extension field elements. The random
values for computing random linear combinations are also in this extension field.

Inputs: [D0, D1, D2, D3, D4, log(trace_length), rd0, rd1, rd2, rd3]
Outputs: []
| diff --git a/crates/lib/core/docs/stark/ood_frames.md b/crates/lib/core/docs/stark/ood_frames.md index e3aea89dc0..3c3e58fd88 100644 --- a/crates/lib/core/docs/stark/ood_frames.md +++ b/crates/lib/core/docs/stark/ood_frames.md @@ -2,4 +2,4 @@ ## miden::core::stark::ood_frames | Procedure | Description | | ----------- | ------------- | -| load_and_horner_eval_ood_frames | Loads the execution trace and the quotient trace evaluation frames.

This also computes Q^z(alpha) and Q^gz(alpha) where:

Q^z(alpha) = (q_z_0, q_z_1) = \sum_{i=0}^{n+m+l} S_i * alpha^i

and

Q^gz(alpha) = (q_gz_0, q_gz_1) = \sum_{i=0}^{n+m+l} T_i * alpha^i

where:

1. n, m and l are the widths of the main segment, auxiliary segment and constraint composition
traces, respectively.
2. S_i are the evaluations of columns in the main segment, auxiliary segment and constraint
composition at the the out-of-domain point z.
3. T_i are the evaluations of columns in the main segment, auxiliary segment and constraint
composition at the the out-of-domain point gz.
4. alpha is the randomness used in order to build the DEEP polynomial.

Q^z(alpha) and Q^gz(alpha) is then stored, as a word, at OOD_FIXED_TERM_HORNER_EVALS_PTR

Inputs: []
Outputs: []
| +| load_and_horner_eval_ood_frames | Loads the execution trace and the quotient trace evaluation frames.

This also computes Q^z(alpha) and Q^gz(alpha) where:

Q^z(alpha) = (q_z_0, q_z_1) = \sum_{i=0}^{n+m+l} S_i * alpha^{n+m+l-i}

and

Q^gz(alpha) = (q_gz_0, q_gz_1) = \sum_{i=0}^{n+m+l} T_i * alpha^{n+m+l-i}

where:

1. n, m and l are the widths of the main segment, auxiliary segment and constraint composition
traces, respectively.
2. S_i are the evaluations of columns in the main segment, auxiliary segment and constraint
composition at the the out-of-domain point z.
3. T_i are the evaluations of columns in the main segment, auxiliary segment and constraint
composition at the the out-of-domain point gz.
4. alpha is the randomness used in order to build the DEEP polynomial.

Q^z(alpha) and Q^gz(alpha) is then stored, as a word, at OOD_FIXED_TERM_HORNER_EVALS_PTR

Inputs: []
Outputs: []
| diff --git a/crates/lib/core/docs/stark/random_coin.md b/crates/lib/core/docs/stark/random_coin.md index 743d467950..4690344218 100644 --- a/crates/lib/core/docs/stark/random_coin.md +++ b/crates/lib/core/docs/stark/random_coin.md @@ -1,22 +1,28 @@ -Disclaimer: most of the procedures in this file assume that the input pointers are word-aligned.
+Random coin for the STARK verifier, built on a Poseidon2 sponge.

The sponge state is stored in memory as three words: rate R1 (r1_ptr), rate R2 (r2_ptr),
and capacity C (c_ptr). R1 and R2 are contiguous (r2_ptr = r1_ptr + 4), so rate elements
0..7 can be addressed as r1_ptr + index.

Sampling uses an output_len counter that tracks how many rate elements remain. Each
permutation sets output_len=8; each sample_felt decrements it by 1 and reads
rate[output_len - 1]. Absorption (reseed_direct, reseed_with_felt, etc.) writes directly
to rate memory and permutes, bypassing any input buffer.
## miden::core::stark::random_coin | Procedure | Description | | ----------- | ------------- | -| get_rate_1 | Return the first half of the rate portion of the random coin state

The random coin uses Poseidon2 to generate data. The Poseidon2 state is composed of 3
words, 2 words for the rate, and 1 word for the capacity. This procedure
returns the first word of the Poseidon2 state.

Input: [...]
Output: [R1, ...]
Cycles: 6
| +| get_rate_1 | Return the first half of the rate portion of the random coin state.

Input: [...]
Output: [R1, ...]
Cycles: 6
| | set_rate_1 | Store the first half of the rate portion of the random coin state.

Input: [R1, ...]
Output: [...]
Cycles: 6
| -| get_rate_2 | Return the second half of the rate portion of the random coin state

The random coin uses Poseidon2 to generate data. The Poseidon2 state is composed of 3
words, 2 words for the rate, and 1 word for the capacity. This procedure
returns the first word of the Poseidon2 state.

Input: [...]
Output: [R2, ...]
Cycles: 6
| +| get_rate_2 | Return the second half of the rate portion of the random coin state.

Input: [...]
Output: [R2, ...]
Cycles: 6
| | set_rate_2 | Store the second half of the rate portion of the random coin state.

Input: [R2, ...]
Output: [...]
Cycles: 6
| -| get_capacity | Return the capacity portion of the random coin state

The random coin uses Poseidon2 to generate data. The Poseidon2 state is composed of 3
words, 2 words for the rate, and 1 word for the capacity. This procedure
returns the first word of the Poseidon2 state.

Input: [...]
Output: [C, ...]
Cycles: 6
| +| get_capacity | Return the capacity portion of the random coin state.

Input: [...]
Output: [C, ...]
Cycles: 6
| | set_capacity | Set the capacity portion of the random coin state.

Input: [C, ...]
Output: [...]
Cycles: 6
| -| load_random_coin_state | Load the random coin state on the stack.

Input: [...]
Output: [R2, R1, C, ...]
Cycles: 18
| -| store_random_coin_state | Store the random coin state to memory.

Input: [R2, R1, C, ...]
Output: [...]
Cycles: 18
| -| init_seed | Initializes the seed for randomness generation by computing the hash of the proof context using
the trace length, number of queries, the number of bits of grinding.
Currently, this part, as well as the rest of the STARK verifier assumes a blowup factor
equal to 8.
The ouput of this procedure is the capacity portion of the state after applying `poseidon2::permute`.

Input: [log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, ...]
Output: [C, ...]
Cycles: 210
| -| reseed | Reseed the random coin with `DATA`

Input: [DATA, ...]
Ouput: [...]
Cycles: 54
| -| generate_aux_randomness | Draw a list of random extension field elements related to the auxiliary segment of the execution
trace and store them.

More specifically, we draw two challenges, alpha and beta. This means that our multi-set hash function
has the form `h(m) = alpha + \sum_{i=0}^{\|m\| - 1} m_i * beta^i` for a message `m`.

As these random challenges have already been used non-deterministically in prior computations, we
also check that the generated challenges matche the non-deterministically provided one.

Input: [...]
Output: [...]
Cycles: 20
| -| generate_constraint_composition_coefficients | Draw constraint composition random coefficient and save it at `compos_coef_ptr`.

Input: [...]
Output: [...]
Cycles: 13
| +| load_random_coin_state | Load the random coin state on the stack.

Input: [...]
Output: [R0, R1, C, ...]
Cycles: 18
| +| store_random_coin_state | Store the random coin state to memory.

Input: [R0, R1, C, ...]
Output: [...]
Cycles: 18
| +| sample_felt | Sample a single base field element from the transcript.

SAFETY: Requires output_len > 0. All call sites in the recursive verifier guarantee this
invariant because every sponge permutation sets output_len=8 and at most 8 elements are
consumed before the next permutation. An assertion guards against caller bugs.

Input: [...]
Output: [x, ...]
| +| sample_ext | Sample a quadratic extension field element from the transcript.

Input: [...]
Output: [x0, x1, ...]
| +| sample_bits | Sample a number of bits from the transcript.

Input: [bits, ...]
Output: [value, ...]
| +| init_seed | Initializes the random coin state with domain-separated Fiat-Shamir (DSFS) seeding,
then derives trace domain parameters.

Implements a two-phase transcript initialization:

Phase 1 (INSTANCE_SEED -- compile-time constant per AIR):
Use the caller-supplied RELATION_DIGEST as initial sponge capacity,
absorb PCS parameters into the rate, and permute.
Rate layout: R1 = [nq, query_pow_bits, deep_pow_bits, folding_pow_bits]
R2 = [log_blowup, log_final_degree, fold_arity, 0]
The resulting capacity is the INSTANCE_SEED.

Phase 2 (PROOF_SEED -- per-proof):
Use INSTANCE_SEED as capacity, absorb log(trace_length) into rate[0]
(with rate[1..7] = 0), and permute.
The resulting capacity is the PROOF_SEED.

The challenger starts with capacity = PROOF_SEED, rate zeroed.

RELATION_DIGEST = hash(PROTOCOL_ID, CIRCUIT_COMMITMENT) is a compile-time constant
computed once per AIR and pushed by the caller (the specific verifier).

Currently assumes a blowup factor equal to 8.

Precondition: num_queries, query_pow_bits, deep_pow_bits, and folding_pow_bits must
already be stored in memory before calling this procedure.

Input: [log(trace_length), rd0, rd1, rd2, rd3, ...]
Output: [...]
| +| reseed_with_felt | Reseed with a commitment word and absorb an additional single felt, then permute.

Writes the commitment word to rate[0..3] and the felt to rate[4], leaving rate[5..7]
unchanged from the previous permutation, then permutes. Used in the FRI layer loop
where each round absorbs a layer commitment plus a PoW nonce felt.

SAFETY:
1. input_len=0 (asserted).
2. On exit: input_len=0, output_len=8 (fresh permutation output).

Input: [felt, w0, w1, w2, w3, ...]
Output: [...]
| +| reseed_direct | Reseed by writing a word directly to rate[0..3] and permuting.

Overwrites rate[0..3] with the given word, leaves rate[4..7] unchanged from the
previous permutation, then permutes. This is the standard overwrite-and-permute
absorption pattern for a single word.

SAFETY:
1. input_len=0 (asserted).
2. The word to absorb is on top of the stack.
3. On exit: input_len=0, output_len=8 (fresh permutation output).

Input: [w0, w1, w2, w3, ...]
Output: [...]
| +| sample_folding_pow_and_ext | Verify per-round FRI folding proof-of-work and sample one extension field element,
reading rate elements directly instead of going through `sample_felt`.

Reads rate[7] (grinding), rate[6] and rate[5] (ext element) from r2_ptr memory,
matching what `sample_felt` would return at output_len=8,7,6.

The folding PoW bit count is read from memory (set by load_security_params).
When folding_pow_bits=0 the check is trivially satisfied (mask=0).

Equivalent to: `get_folding_pow_bits sample_bits assertz; sample_ext`

SAFETY:
1. MUST be called immediately after `reseed_with_felt` with no intervening
random coin operations (output_len=8, input_len=0 guaranteed).
2. Sets output_len=5 on exit (3 elements consumed), input_len=0 unchanged.
3. folding_pow_bits must already be stored in memory.

Input: [...]
Output: [a0, a1, ...]
| +| generate_aux_randomness | Draw a list of random extension field elements related to the auxiliary segment of the execution
trace and store them.

More specifically, we draw two challenges, alpha and beta. This means that our multi-set hash function
has the form `h(m) = alpha + \sum_{i=0}^{\|m\| - 1} m_i * beta^i` for a message `m`.

As these random challenges have already been used non-deterministically in prior computations, we
also check that the generated challenges match the non-deterministically provided one.

Input: [...]
Output: [...]
Cycles: 20
| +| generate_constraint_composition_coefficients | Draw constraint composition random coefficient and save it at `compos_coef_ptr`.

Input: [...]
Output: [...]
Cycles: 13
| | generate_deep_composition_random_coefficients | Draw deep composition polynomial random coefficient and save it at `deep_rand_coef_ptr`.

As this random challenge has already been used non-deterministically in prior computations, we
also check that the generated challenge matches the non-deterministically provided one.

Input: [...]
Output: [...]
Cycles: 22
| -| generate_z_zN | Generate the OOD challenge point `z = (z0, z1)` and compute `z^N` where N is
the trace length. The resulting word `[(z_1, z_0)^N, z1, z0]` is stored in the
global memory address `exec.z_ptr` reserved for it.

Input: [X, ...]
Output: [...]
Note: The top word on the stack is consumed by this procedure.
Cycles: 21 + 10 * log(N)
| -| generate_list_indices | Generate a list of `num_queries` number of random indices in the range
[0, lde_size] and store it in memory starting from `query_ptr`.
The list is stored as `(r, depth, y, y)` where `depth` is `log(lde_domain_size)`.
`depth` is needed when computing the deep queries.

Input: [query_ptr, num_queries, ...]
Output: [...]

Cycles: 267 + q * 236 + r * 29 where q = num_queries / 8 and r = num_queries % 8

NOTE: This procedure is called first, and right after the PoW check, thus the first element
in the rate portion of the state is discarded.
NOTE: The cycles count can be estimated, using the fact that r < 8, via the more compact formula
470 + 236 * (num_queries / 8)
| -| check_pow | Check that the Proof-of-Work contained in the nonce is equal to the required number
of bits prescribed by grinding bits. The grinding factor is assumed to be less than 32.

Input: [...]
Output: [...]
Cycles: 73
| +| generate_z_zN | Generate the OOD challenge point `z = (z0, z1)` and compute `z^N` where N is
the trace length. The resulting word `[(z_0, z_1)^N, z0, z1]` is stored in the
global memory address `exec.z_ptr` reserved for it.

Input: [X, ...]
Output: [...]
Note: The top word on the stack is consumed by this procedure.
Cycles: 21 + 10 * log(N)
| +| generate_list_indices | Generate a list of `num_queries` number of random indices in the range
[0, lde_size] and store it in memory starting from `query_ptr`.
The list is stored as `(rev_index, depth, natural_index, 0)` where
`depth` is `log(lde_domain_size)` which is needed when computing the DEEP queries.

Reads rate elements directly from memory (decrementing from output_len-1 down to 0),
permuting when the rate is exhausted, rather than calling sample_felt per query.

Input: [...]
Output: [...]

NOTE: This procedure is called right after the PoW check. The PoW check consumes one
rate element via sample_bits, leaving output_len = 7.
| +| check_deep_pow | Check the DEEP proof-of-work.

Called before sampling DEEP composition polynomial challenges.

SAFETY: Requires input_len=0.

Input: [...]
Output: [...]
| +| check_query_pow | Check the query proof-of-work.

Called after loading the FRI remainder, before sampling query indices.

SAFETY: Requires input_len=0 (guaranteed after load_and_verify_remainder).

Input: [...]
Output: [...]
| diff --git a/crates/lib/core/docs/stark/utils.md b/crates/lib/core/docs/stark/utils.md index 5591276fef..f3cebe0b92 100644 --- a/crates/lib/core/docs/stark/utils.md +++ b/crates/lib/core/docs/stark/utils.md @@ -3,6 +3,7 @@ | Procedure | Description | | ----------- | ------------- | | compute_lde_generator | Compute the LDE domain generator from the log2 of its size.

Input: [log2(domain_size), ..]
Output: [domain_gen, ..]
Cycles: 63
| -| validate_inputs | Validates the inputs to the recursive verifier.

Input: [log(trace_length), num_queries, grinding, ...]
Output: [log(trace_length), num_queries, grinding, ...]

Cycles: 45
| -| set_up_auxiliary_inputs_ace | Sets up auxiliary inputs to the arithmetic circuit for the constraint evaluation check.

These inputs are:

1) OOD evaluation point z,
2) random challenge used in computing the DEEP composition polynomial,
3) z^N where N is the execution trace length
4) z^k where k = min_num_cycles = trace_len / max_cycle_len and max_cycle_len is the longest cycle
among all the cycles of periodic columns.
5) g^{-1} where g is the trace domain generator.

The only input to this procedure is the log2 of the max cycle length across all periodic columns.

Input: [max_cycle_len_log, ...]
Output: [...]
| -| store_dynamically_executed_procedures | Stores digests of dynamically executed procedures.

Input: [D3, D2, D1, D0, ...]
Output: [...]
| +| validate_inputs | Validates the inputs to the recursive verifier.

Checks log(trace_length) from the stack and security parameters from memory.
The security parameters must already be stored in memory before calling this
procedure (done by the specific verifier's load_security_params).

Input: [log(trace_length), ...]
Output: [log(trace_length), ...]
| +| bit_reverse_len_parallel | Reverse the lowest `bits` bits of `index` using parallel bit-swap.
`pow2_shift` must equal 2^(32 - bits); the caller pre-computes it once.

The algorithm has two parts:

1) Left-shift: multiply index by pow2_shift = 2^(32-bits) to place the `bits`
meaningful bits into the top of a 32-bit word. Since index < 2^bits, the
product is always < 2^32 so u32wrapping_mul is exact.

2) Full 32-bit reversal via 5 parallel swap steps. Each step k (for k=1,2,4,8,16)
swaps every adjacent group of k bits. A mask isolates the even-positioned
groups; the odd-positioned groups are the complement. Shifting each half by
k positions and combining swaps all groups simultaneously. After all 5 steps,
bit position i has moved to position 31-i, which (because of the initial
left-shift) is exactly position (bits-1-i) of the original -- i.e., the
reversed index. No final shift is needed.

The two halves never overlap, so XOR = OR = ADD; we use XOR (2 cycles vs 4 for
u32wrapping_add).

Input: [index, pow2_shift, ...]
Output: [rev_index, ...]
Cycles: 83
| +| set_up_auxiliary_inputs_ace | Sets up the stark-vars region of the ACE circuit input layout.

The stark-vars block is 10 EF slots (5 words) laid out as:

Word 0 (slots 0-1): alpha, z^N (EF: composition challenge, trace-length power)
Word 1 (slots 2-3): z_k, is_first (EF: periodic eval point, first-row selector)
Word 2 (slots 4-5): is_last, is_transition (EF: last-row selector, transition selector)
Word 3 (slots 6-7): gamma, weight0 (EF: batching challenge; base as EF: barycentric weight)
Word 4 (slots 8-9): f, s0 (base as EF: chunk shift ratio h^N, first shift)

Input: [max_cycle_len_log, ...]
Output: [...]
| +| store_dynamically_executed_procedures | Stores digests of dynamically executed procedures.

Input: [D0, D1, D2, D3, D4, ...]
Output: [...]
| diff --git a/crates/lib/core/docs/stark/verifier.md b/crates/lib/core/docs/stark/verifier.md index fec43febf8..7fabf2229a 100644 --- a/crates/lib/core/docs/stark/verifier.md +++ b/crates/lib/core/docs/stark/verifier.md @@ -2,4 +2,4 @@ ## miden::core::stark::verifier | Procedure | Description | | ----------- | ------------- | -| verify | Verifies a STARK proof.

The purpose of the following verifier is to serve as a generic core around which a specific
verifier can be built. It expects the following parameters on the stack from the caller:

1. `[D0, D1, D2, D3]` which are respectively the digests for dynamic execution of procedures
i. `compute_deep_composition_polynomial_queries`
ii. `execute_constraint_evaluation_check`
iii. `process_row_ood_evaluations`
iv. `process_public_inputs`
2. `num_constraints` which is the number of constraints in the AIR
3. `trace_info` which is a field element encoding the layout of the AIR
4. `num_fixed_len_pi` is the number of fixed length public inputs of the AIR
5. `is_aux_trace` flag indicating the existence of an auxiliary segment in this AIR

In addition to the above parameters, the verifier expects the following auxiliary proof parameters:

1. `log(trace_length)`, the logarithm base 2 of the trace length
2. `num_queries`, the number of FRI queries
3. `grinding`, the number of bits of grinding i.e., proof-of-work

The following simplifying assumptions are currently made and hardcoded:

- The blowup factor is set to 8.
- The maximal allowed degree of the remainder polynomial is 127.
- To boost soundness, the protocol is run on a quadratic extension field and this means that
the OOD evaluation frame is composed of elements in a quadratic extension field i.e. tuples.
Similarly, elements of the auxiliary trace are quadratic extension field elements. The random
values for computing random linear combinations are also in this extension field.

Inputs: [D3, D2, D1, D0, log(trace_length), num_queries, grinding, num_constraints, trace_info, num_fixed_len_pi, is_aux_trace]
Outputs: []
| +| verify | Verifies a STARK proof.

The purpose of the following verifier is to serve as a generic core around which a specific
verifier can be built. It expects the following parameters on the stack from the caller:

1. `[D0, D1, D2, D3, D4]` which are the digests for dynamic execution of:
D0. `observe_aux_trace`
D1. `process_public_inputs`
D2. `process_row_ood_evaluations`
D3. `execute_constraint_evaluation_check`
D4. `compute_deep_composition_polynomial_queries`
2. Per-proof parameter: `log(trace_length)`
3. `[rd0, rd1, rd2, rd3]`: RELATION_DIGEST = hash(PROTOCOL_ID, CIRCUIT_COMMITMENT),
a compile-time constant that binds the Fiat-Shamir transcript to the AIR instance.

Precondition: security parameters (num_queries, query_pow_bits, deep_pow_bits,
folding_pow_bits) must already be stored in memory before calling this procedure.

The following simplifying assumptions are currently made and hardcoded:

- The blowup factor is set to 8.
- The maximal allowed degree of the remainder polynomial is 127.
- To boost soundness, the protocol is run on a quadratic extension field and this means that
the OOD evaluation frame is composed of elements in a quadratic extension field i.e. tuples.
Similarly, elements of the auxiliary trace are quadratic extension field elements. The random
values for computing random linear combinations are also in this extension field.

Inputs: [D0, D1, D2, D3, D4, log(trace_length), rd0, rd1, rd2, rd3]
Outputs: []
| diff --git a/crates/lib/core/docs/sys/vm/aux_trace.md b/crates/lib/core/docs/sys/vm/aux_trace.md new file mode 100644 index 0000000000..3d118ac562 --- /dev/null +++ b/crates/lib/core/docs/sys/vm/aux_trace.md @@ -0,0 +1,5 @@ + +## miden::core::sys::vm::aux_trace +| Procedure | Description | +| ----------- | ------------- | +| observe_aux_trace | Observes the auxiliary trace for the Miden VM AIR.

Draws auxiliary randomness, reseeds the transcript with the auxiliary trace commitment,
and absorbs the 4 words of auxiliary trace boundary values (8 aux columns, each an
extension field element = 16 base field elements = 4 words).

The advice provider must supply exactly 5 words in order:
[commitment, W0, W1, W2, W3]

The commitment is stored at aux_trace_com_ptr and the boundary values at
aux_bus_boundary_ptr (sequentially).

Precondition: input_len=0 (guaranteed by the preceding reseed_direct in the generic verifier).
Postcondition: input_len=0, output_len=8.

Input: [...]
Output: [...]
| diff --git a/crates/lib/core/docs/sys/vm/constraints_eval.md b/crates/lib/core/docs/sys/vm/constraints_eval.md index 47dc2005e6..d8cde2cb04 100644 --- a/crates/lib/core/docs/sys/vm/constraints_eval.md +++ b/crates/lib/core/docs/sys/vm/constraints_eval.md @@ -2,4 +2,4 @@ ## miden::core::sys::vm::constraints_eval | Procedure | Description | | ----------- | ------------- | -| execute_constraint_evaluation_check | Executes the constraints evaluation check by evaluating an arithmetic circuit using the ACE
chiplet.

The circuit description is hardcoded into the verifier using its commitment, which is computed as
the sequential hash of its description using Poseidon2 hasher. The circuit description, containing both
constants and evaluation gates description, is stored at the contiguous memory region starting
at `ACE_CIRCUIT_PTR`. The variable part of the circuit input is stored at the contiguous memory
region starting at `pi_ptr`. The (variable) inputs to the circuit are laid out such that the
aforementioned memory regions are together contiguous with the (variable) inputs section.

Inputs: []
Outputs: []
| +| execute_constraint_evaluation_check | Executes the constraints evaluation check by evaluating an arithmetic circuit using the ACE
chiplet.

The circuit description is hardcoded into the verifier using its commitment, which is computed as
the sequential hash of its description using Poseidon2 hasher. The circuit description,
containing both constants and evaluation gates description, is stored starting at
`ACE_CIRCUIT_STREAM_PTR` (right after the circuit inputs). The evaluation gates portion begins at
`ACE_CIRCUIT_PTR`. The variable part of the circuit input is stored at the contiguous memory
region starting at `pi_ptr`. The (variable) inputs to the circuit are laid out such that the
aforementioned memory regions are together contiguous with the (variable) inputs section.

Inputs: []
Outputs: []
| diff --git a/crates/lib/core/docs/sys/vm/mod.md b/crates/lib/core/docs/sys/vm/mod.md index c853bd2c91..315e97137a 100644 --- a/crates/lib/core/docs/sys/vm/mod.md +++ b/crates/lib/core/docs/sys/vm/mod.md @@ -2,4 +2,4 @@ ## miden::core::sys::vm::mod | Procedure | Description | | ----------- | ------------- | -| verify_proof | Verifies a STARK proof attesting to the correct execution of a program in the Miden VM.

- The public inputs are composed of the input and output stacks, of fixed size equal to 16, as
well as the program and the kernel procedures digests.
- There are two trace segments, main and auxiliary. It is assumed that the main trace segment
is 73 columns wide while the auxiliary trace segment is 8 columns wide. Note that we pad the main
trace to the next multiple of 8.
- The OOD evaluation frame is composed of two concatenated rows, current and next, each composed
of 73 elements representing the main trace portion and 8 elements for the auxiliary trace one.
Note that, due to the padding of the main trace columns, the number of OOD evaluations per row
is 80 for the main trace.

Inputs: [log(trace_length), num_queries, grinding]
Outputs: []

Cycles:
1- Remainder polynomial size 64:
2515 + num_queries * (512 + num_fri_layers * 83) + 108 * num_fri_layers + 10 * log(trace_length)
2- Remainder polynomial size 128:
2540 + num_queries * (541 + num_fri_layers * 83) + 108 * num_fri_layers + 10 * log(trace_length)

where num_fri_layers is computed as:

1- If log(trace_length) is even, then num_fri_layers = (log(trace_length) - 6) / 2, where 6 = log2(64),
2- If log(trace_length) is odd, then num_fri_layers = (log(trace_length) - 7) / 2, where 7 = log2(128).
| +| verify_proof | Verifies a STARK proof attesting to the correct execution of a program in the Miden VM.

Security parameters (num_queries, query_pow_bits, deep_pow_bits, folding_pow_bits) are
loaded from the advice stack, validated against the acceptable security policy, and
stored in memory for use by the generic verifier.

- The public inputs are composed of the input and output stacks, of fixed size equal to 16, as
well as the program and the kernel procedures digests.
- There are two trace segments, main and auxiliary. It is assumed that the main trace segment
is 73 columns wide while the auxiliary trace segment is 8 columns wide. Note that we pad the main
trace to the next multiple of 8.
- The OOD evaluation frame is composed of two concatenated rows, current and next, each composed
of 73 elements representing the main trace portion and 8 elements for the auxiliary trace one.
Note that, due to the padding of the main trace columns, the number of OOD evaluations per row
is 80 for the main trace.

Inputs: [log(trace_length)]
Outputs: []
| diff --git a/crates/lib/core/docs/sys/vm/ood_frames.md b/crates/lib/core/docs/sys/vm/ood_frames.md index debcc3a243..502ae08971 100644 --- a/crates/lib/core/docs/sys/vm/ood_frames.md +++ b/crates/lib/core/docs/sys/vm/ood_frames.md @@ -2,4 +2,4 @@ ## miden::core::sys::vm::ood_frames | Procedure | Description | | ----------- | ------------- | -| process_row_ood_evaluations | Processes the out-of-domain (OOD) evaluations of all committed polynomials.

Takes as input an Poseidon2 hasher state and a pointer, and loads from the advice provider the OOD
evaluations and stores at memory region using pointer `ptr` while absorbing the evaluations
into the hasher state and simultaneously computing a random linear combination using Horner
evaluation.


Inputs: [R2, R1, C, ptr, acc1, acc0]
Outputs: [R2, R1, C, ptr, acc1`, acc0`]

Cycles: 72
| +| process_row_ood_evaluations | Processes the out-of-domain (OOD) evaluations of all committed polynomials.

Takes as input an Poseidon2 hasher state and a pointer, and loads from the advice provider the OOD
evaluations and stores at memory region using pointer `ptr` while absorbing the evaluations
into the hasher state and simultaneously computing a random linear combination using Horner
evaluation.


Inputs: [R0, R1, C, ptr, acc0, acc1]
Outputs: [R0, R1, C, ptr, acc0`, acc1`]

Cycles: 78
| diff --git a/crates/lib/core/docs/sys/vm/public_inputs.md b/crates/lib/core/docs/sys/vm/public_inputs.md index 92560d3323..d5feaaad8e 100644 --- a/crates/lib/core/docs/sys/vm/public_inputs.md +++ b/crates/lib/core/docs/sys/vm/public_inputs.md @@ -2,4 +2,4 @@ ## miden::core::sys::vm::public_inputs | Procedure | Description | | ----------- | ------------- | -| process_public_inputs | Processes the public inputs.

This involves:

1. Loading from the advice stack the fixed-length public inputs and storing them in memory
starting from the address pointed to by `public_inputs_address_ptr`.
2. Loading from the advice stack the variable-length public inputs, storing them temporarily
in memory, and then reducing them to an element in the challenge field using the auxiliary
randomness. This reduced value is then used to impose a boundary condition on the relevant
auxiliary column.

Note that the fixed length public inputs are stored as extension field elements while
the variable length ones are stored as base field elements.

Note also that, while loading the above, we compute the hash of the public inputs. The hashing
starts with capacity registers of the hash function set to `C` that is the result of hashing
the proof context.

The output D, that is the digest of the above hashing, is then used in order to reseed
the random coin.

It is worth noting that:

1. Only the fixed-length public inputs are stored for the lifetime of the verification procedure.
The variable-length public inputs are stored temporarily, as this simplifies the task of
reducing them using the auxiliary randomness. On the other hand, the resulting values from
the aforementioned reductions are stored right after the fixed-length public inputs. These
are stored in a word-aligned manner and padded with zeros if needed.
2. The public inputs address is computed in such a way so as we end up with the following
memory layout:

[..., a_0...a_{m-1}, b_0...b_{n-1}, alpha0, alpha1, beta0, beta1, OOD-evaluations-start, ...]

where:

1. [a_0...a_{m-1}] are the fixed-length public inputs stored as extension field elements. This
section is double-word-aligned.
2. [b_0...b_{n-1}] are the results of reducing the variable length public inputs using
auxiliary randomness. This section is word-aligned.
3. [alpha0, alpha1, beta0, beta1] is the auxiliary randomness.
4. `OOD-evaluations-start` is the first field element of the section containing the OOD
evaluations.
3. Note that for each bus message in a group in the variable length public inputs, each
message is expected to be padded to the next multiple of 8 and provided in reverse order.
This has the benefit of making the reduction using the auxiliary randomness more efficient
using `horner_eval_base`.


Input: [C, ...]
Output: [...]
| +| process_public_inputs | Processes the public inputs.

This involves:

1. Loading from the advice stack the fixed-length public inputs and storing them in memory
starting from the address pointed to by `public_inputs_address_ptr`.
2. Loading kernel procedure digests from the advice stack, reducing them, and storing the
reduced result at `variable_length_public_inputs_address_ptr` (in the ACE READ section).
3. Loading the auxiliary randomness from the advice stack so it can be checked later.

Note that the fixed length public inputs are stored as extension field elements.
The kernel digests are temporarily stored in memory starting at
`variable_length_public_inputs_address_ptr` during reduction. The final reduced value
overwrites the start of this region and remains in the ACE READ section.

POSTCONDITION: random coin input_len=0 on return.

The generic verifier (stark/verifier.masm) calls reseed_direct immediately after this
procedure, which requires input_len=0. This postcondition holds because:
- FLPI (40 base felts) are absorbed in groups of 8 via direct sponge permutation
(5 iterations * 8 = 40), bypassing the buffer entirely.
- VLPI (kernel digests, each padded to 8 felts) are absorbed via adv_pipe + permute,
also bypassing the buffer.
- Both paths reset the buffer counters (input_len=0, output_len=8) after completion.

If FLPI size changes from a multiple of 8, or VLPI digest padding changes from 8,
this postcondition must be re-verified.

Input:
- Operand stack: [...]
- Advice stack: [fixed_len_PI..., num_kernel_proc_digests,
kernel_digest_elements..., beta0, beta1, alpha0, alpha1, ...]
Output: [...]
| diff --git a/crates/lib/core/src/bin/regenerate-constraints.rs b/crates/lib/core/src/bin/regenerate-constraints.rs new file mode 100644 index 0000000000..ba20d2cfa1 --- /dev/null +++ b/crates/lib/core/src/bin/regenerate-constraints.rs @@ -0,0 +1,52 @@ +use std::process::ExitCode; + +use miden_core_lib::constraints_regen::{self, Mode}; + +fn usage() { + println!("Usage:"); + println!(" regenerate-constraints [--check|--write]"); + println!(); + println!("Options:"); + println!(" --check Verify checked-in constraint artifacts (default)"); + println!(" --write Rebuild and write constraint artifacts"); + println!(" -h, --help Show this message"); +} + +fn parse_mode() -> Result { + let mut mode = Mode::Check; + + for arg in std::env::args().skip(1) { + match arg.as_str() { + "--check" => mode = Mode::Check, + "--write" => mode = Mode::Write, + "-h" | "--help" => { + usage(); + return Err(ExitCode::SUCCESS); + }, + other => { + eprintln!("Unknown argument: {other}"); + usage(); + return Err(ExitCode::FAILURE); + }, + } + } + + Ok(mode) +} + +fn main() -> ExitCode { + let mode = match parse_mode() { + Ok(mode) => mode, + Err(code) => return code, + }; + + if let Err(error) = constraints_regen::run(mode) { + eprintln!("failed: {error}"); + if mode == Mode::Check { + eprintln!("hint: rerun with `--write` to refresh checked-in artifacts"); + } + return ExitCode::FAILURE; + } + + ExitCode::SUCCESS +} diff --git a/crates/lib/core/src/constraints_regen.rs b/crates/lib/core/src/constraints_regen.rs new file mode 100644 index 0000000000..bd3d013317 --- /dev/null +++ b/crates/lib/core/src/constraints_regen.rs @@ -0,0 +1,333 @@ +use alloc::{ + format, + string::{String, ToString}, + vec::Vec, +}; +use std::{fs, io, println}; + +use miden_ace_codegen::{AceCircuit, AceConfig, LayoutKind}; +use miden_air::ProcessorAir; +use miden_core::{Felt, crypto::hash::Poseidon2, field::QuadFelt}; + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Mode { + Check, + Write, +} + +const MASM_CONFIG: AceConfig = AceConfig { + num_quotient_chunks: 8, + num_vlpi_groups: 1, + layout: LayoutKind::Masm, +}; +pub const RELATION_DIGEST_PATHS: (&str, &str) = + ("asm/sys/vm/mod.masm", "asm/sys/vm/constraints_eval.masm"); + +const PROTOCOL_ID: u64 = 0; +const AIR_CONFIG_PATH: &str = "../../../air/src/config.rs"; +const CONSTRAINTS_EVAL_PATH: &str = "asm/sys/vm/constraints_eval.masm"; +const RELATION_DIGEST_PATH: &str = RELATION_DIGEST_PATHS.0; + +/// Builds the batched ACE circuit used by the Miden VM recursive verifier. +pub fn build_batched_circuit(config: AceConfig) -> AceCircuit { + let air = ProcessorAir; + let batch_config = miden_air::ace::reduced_aux_batch_config(); + miden_air::ace::build_batched_ace_circuit::<_, QuadFelt>(&air, config, &batch_config).unwrap() +} + +/// Computes the relation digest used by recursive verification. +pub fn compute_relation_digest(circuit_commitment: &[Felt; 4]) -> [Felt; 4] { + let input: Vec = core::iter::once(Felt::new(PROTOCOL_ID)) + .chain(circuit_commitment.iter().copied()) + .collect(); + let digest = Poseidon2::hash_elements(&input); + let elems = digest.as_elements(); + [elems[0], elems[1], elems[2], elems[3]] +} + +/// Runs write (`--write`) or staleness-check (`--check`) mode. +pub fn run(mode: Mode) -> Result<(), String> { + match mode { + Mode::Check => check(), + Mode::Write => write().map_err(|e| format!("{e}")), + } +} + +/// Runs the full regeneration flow. +fn write() -> io::Result<()> { + let artifact = compute_artifacts()?; + write_artifacts(&artifact) +} + +/// Checks generated artifacts against current AIR-derived values. +fn check() -> Result<(), String> { + constraints_eval_masm_matches_air()?; + relation_digest_matches_air()?; + Ok(()) +} + +/// Generate a full computed snapshot from the current AIR. +fn compute_artifacts() -> io::Result { + let circuit = build_batched_circuit(MASM_CONFIG); + let encoded = circuit.to_ace().unwrap(); + + let num_inputs = encoded.num_vars(); + let num_eval_gates = encoded.num_eval_rows(); + let instructions = encoded.instructions(); + let size_in_felt = encoded.size_in_felt(); + if !size_in_felt.is_multiple_of(8) { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + format!( + "circuit size_in_felt ({size_in_felt}) is not 8-aligned; adv_pipe requires 8-element chunks" + ), + )); + } + let adv_pipe_rows = size_in_felt / 8; + + let circuit_commitment: [Felt; 4] = encoded.circuit_hash().into(); + let relation_digest = compute_relation_digest(&circuit_commitment); + + let mut constraints_eval = read_file(CONSTRAINTS_EVAL_PATH); + { + replace_masm_const(&mut constraints_eval, "NUM_INPUTS_CIRCUIT", &num_inputs.to_string()); + replace_masm_const( + &mut constraints_eval, + "NUM_EVAL_GATES_CIRCUIT", + &num_eval_gates.to_string(), + ); + + let proc_start = + constraints_eval.find("proc load_ace_circuit_description").ok_or_else(|| { + io::Error::new( + io::ErrorKind::NotFound, + "proc load_ace_circuit_description not found", + ) + })?; + if let Some(repeat_offset) = constraints_eval[proc_start..].find("repeat.") { + let abs = proc_start + repeat_offset; + let end = constraints_eval[abs..] + .find('\n') + .map(|i| abs + i) + .unwrap_or(constraints_eval.len()); + constraints_eval.replace_range(abs..end, &format!("repeat.{adv_pipe_rows}")); + } + + let section_marker = "# CONSTRAINT EVALUATION CIRCUIT DESCRIPTION"; + let section_start = constraints_eval.find(section_marker).ok_or_else(|| { + io::Error::new(io::ErrorKind::NotFound, "constraints section marker not found") + })?; + constraints_eval.truncate(section_start); + let trimmed = constraints_eval.trim_end().len(); + constraints_eval.truncate(trimmed); + constraints_eval.push_str("\n\n# CONSTRAINT EVALUATION CIRCUIT DESCRIPTION\n"); + constraints_eval + .push_str("# =================================================================================================\n\n"); + constraints_eval.push_str("adv_map CIRCUIT_COMMITMENT = [\n"); + + for (i, chunk) in instructions.chunks(8).enumerate() { + let vals: Vec = + chunk.iter().map(|f| f.as_canonical_u64().to_string()).collect(); + let line = vals.join(","); + if i < adv_pipe_rows - 1 { + constraints_eval.push_str(&format!(" {line},\n")); + } else { + constraints_eval.push_str(&format!(" {line}\n")); + } + } + constraints_eval.push_str("]\n"); + } + + let mut relation_mod = read_file(RELATION_DIGEST_PATH); + for (i, elem) in relation_digest.iter().enumerate() { + replace_masm_const( + &mut relation_mod, + &format!("RELATION_DIGEST_{i}"), + &elem.as_canonical_u64().to_string(), + ); + } + + let mut air_config = read_file(AIR_CONFIG_PATH); + let marker = "pub const RELATION_DIGEST: [Felt; 4] = ["; + let start = air_config.find(marker).ok_or_else(|| { + io::Error::new(io::ErrorKind::NotFound, "RELATION_DIGEST not found in config.rs") + })?; + let block_start = start + marker.len(); + let block_end = + air_config[block_start..] + .find("];") + .map(|idx| idx + block_start) + .ok_or_else(|| { + io::Error::new(io::ErrorKind::NotFound, "RELATION_DIGEST terminator not found") + })?; + let mut new_block: String = relation_digest + .iter() + .map(|f| format!("\n Felt::new({}),", f.as_canonical_u64())) + .collect(); + new_block.push('\n'); + air_config.replace_range(block_start..block_end, &new_block); + + Ok(ComputedArtifacts { + num_inputs, + num_eval_gates, + adv_pipe_rows, + circuit_commitment, + relation_digest, + constraints_eval, + relation_mod, + air_config, + }) +} + +fn write_artifacts(artifact: &ComputedArtifacts) -> io::Result<()> { + write_file(CONSTRAINTS_EVAL_PATH, &artifact.constraints_eval)?; + write_file(RELATION_DIGEST_PATH, &artifact.relation_mod)?; + write_file(AIR_CONFIG_PATH, &artifact.air_config)?; + println!( + "wrote asm/sys/vm/constraints_eval.masm ({} inputs, {} eval gates, repeat.{})", + artifact.num_inputs, artifact.num_eval_gates, artifact.adv_pipe_rows + ); + println!("wrote asm/sys/vm/mod.masm (RELATION_DIGEST)"); + println!("wrote air/src/config.rs (RELATION_DIGEST)"); + println!("done — run `cargo test -p miden-air --lib` to update the insta snapshot"); + Ok(()) +} + +/// Verify that the ACE circuit constants in `constraints_eval.masm` match the current AIR. +pub fn constraints_eval_masm_matches_air() -> Result<(), String> { + let artifact = compute_artifacts().map_err(|e| e.to_string())?; + let masm = read_file(RELATION_DIGEST_PATHS.1); + let actual_num_inputs: usize = + parse_masm_const(&masm, "NUM_INPUTS_CIRCUIT", "constraints_eval.masm") + .map_err(|e| e.to_string())?; + let actual_num_eval: usize = + parse_masm_const(&masm, "NUM_EVAL_GATES_CIRCUIT", "constraints_eval.masm") + .map_err(|e| e.to_string())?; + + let proc_start = masm + .find("proc load_ace_circuit_description") + .ok_or_else(|| "load_ace_circuit_description proc not found".to_string())?; + let actual_adv_pipe: usize = masm[proc_start..] + .lines() + .find_map(|line| line.trim().strip_prefix("repeat.").and_then(|v| v.parse::().ok())) + .ok_or_else(|| "repeat.N not found in load_ace_circuit_description".to_string())?; + + let adv_start = masm + .find("adv_map CIRCUIT_COMMITMENT = [") + .ok_or_else(|| "adv_map CIRCUIT_COMMITMENT not found".to_string())?; + let adv_end = masm[adv_start..] + .find(']') + .map(|idx| idx + adv_start) + .ok_or_else(|| "adv_map data block terminator not found".to_string())?; + let data_str = &masm[masm[..adv_start].len() + "adv_map CIRCUIT_COMMITMENT = [".len()..adv_end]; + let actual_data: Vec = data_str + .split(',') + .map(|s| s.trim()) + .filter(|s| !s.is_empty()) + .map(|s| { + s.parse::() + .map(Felt::new) + .map_err(|_| "invalid u64 in adv_map".to_string()) + }) + .collect::>()?; + let actual_hash = Poseidon2::hash_elements(&actual_data); + + let actual_hash_u64: Vec = + actual_hash.as_elements().iter().map(|f| f.as_canonical_u64()).collect(); + let expected_hash_u64: Vec = + artifact.circuit_commitment.iter().map(|f| f.as_canonical_u64()).collect(); + + if actual_num_inputs != artifact.num_inputs { + return Err(format!( + "NUM_INPUTS_CIRCUIT is stale ({actual_num_inputs} != {})", + artifact.num_inputs, + )); + } + if actual_num_eval != artifact.num_eval_gates { + return Err(format!( + "NUM_EVAL_GATES_CIRCUIT is stale ({actual_num_eval} != {})", + artifact.num_eval_gates, + )); + } + if actual_adv_pipe != artifact.adv_pipe_rows { + return Err(format!( + "repeat.N in load_ace_circuit_description is stale ({actual_adv_pipe} != {})", + artifact.adv_pipe_rows, + )); + } + if actual_hash_u64 != expected_hash_u64 { + return Err("Circuit data in adv_map is stale (hash mismatch)".into()); + } + Ok(()) +} + +/// Verify that RELATION_DIGEST in `air/src/config.rs` and `sys/vm/mod.masm` matches current AIR. +pub fn relation_digest_matches_air() -> Result<(), String> { + let artifact = compute_artifacts().map_err(|e| e.to_string())?; + let expected = artifact.relation_digest; + + if miden_air::config::RELATION_DIGEST != expected { + return Err("RELATION_DIGEST in air/src/config.rs is stale".into()); + } + + let masm = read_file(RELATION_DIGEST_PATH); + let mut masm_digest: [Felt; 4] = [Felt::ZERO; 4]; + for (i, slot) in masm_digest.iter_mut().enumerate() { + let name = format!("RELATION_DIGEST_{i}"); + *slot = parse_masm_const::(&masm, &name, "sys/vm/mod.masm") + .map(Felt::new) + .map_err(|e| e.to_string())?; + } + + if masm_digest != expected { + return Err("RELATION_DIGEST in sys/vm/mod.masm is stale".into()); + } + + Ok(()) +} + +fn parse_masm_const( + masm: &str, + name: &str, + file_label: &str, +) -> Result +where + T::Err: core::fmt::Debug, +{ + let prefix = format!("const {name} = "); + masm.lines() + .find_map(|line| line.trim().strip_prefix(&prefix).and_then(|v| v.parse::().ok())) + .ok_or_else(|| format!("constant {name} not found in {file_label}")) +} + +fn replace_masm_const(content: &mut String, name: &str, new_value: &str) { + let prefix = format!("const {name} = "); + let line_start = content.find(&prefix).unwrap_or_else(|| panic!("const {name} not found")); + let line_end = content[line_start..] + .find('\n') + .map(|i| line_start + i) + .unwrap_or(content.len()); + content.replace_range(line_start..line_end, &format!("{prefix}{new_value}")); +} + +fn read_file(rel_path: &str) -> String { + let path = format!("{}/{}", env!("CARGO_MANIFEST_DIR"), rel_path); + fs::read_to_string(&path).unwrap_or_else(|e| panic!("failed to read {path}: {e}")) +} + +fn write_file(rel_path: &str, contents: &str) -> io::Result<()> { + let path = format!("{}/{}", env!("CARGO_MANIFEST_DIR"), rel_path); + fs::write(&path, contents) + .map_err(|e| io::Error::new(e.kind(), format!("failed to write {path}: {e}"))) +} + +struct ComputedArtifacts { + num_inputs: usize, + num_eval_gates: usize, + adv_pipe_rows: usize, + circuit_commitment: [Felt; 4], + relation_digest: [Felt; 4], + constraints_eval: String, + relation_mod: String, + air_config: String, +} diff --git a/crates/lib/core/src/lib.rs b/crates/lib/core/src/lib.rs index 1ee5af8e3b..205475579c 100644 --- a/crates/lib/core/src/lib.rs +++ b/crates/lib/core/src/lib.rs @@ -1,5 +1,10 @@ #![no_std] +#[cfg(feature = "std")] +extern crate std; + +#[cfg(any(feature = "constraints-tools", all(test, feature = "std")))] +pub mod constraints_regen; pub mod dsa; pub mod handlers; diff --git a/crates/lib/core/tests/crypto/aead.rs b/crates/lib/core/tests/crypto/aead.rs index cb2e8b5a0b..0a886a1d62 100644 --- a/crates/lib/core/tests/crypto/aead.rs +++ b/crates/lib/core/tests/crypto/aead.rs @@ -347,3 +347,54 @@ fn test_decrypt_with_wrong_key() { // Should fail with assertion error assert!(test.execute().is_err(), "Wrong key should cause assertion failure"); } + +#[test] +fn test_encrypt_fails_on_overlap() { + // With num_blocks=1, encrypt uses (1+1)*8 = 16 elements per range. + // Source [1000, 1016) and dest [1008, 1024) overlap at [1008, 1016). + let source = r#" + use miden::core::crypto::aead + + begin + push.[10,11,12,13] push.1000 mem_storew_le dropw + push.[14,15,16,17] push.1004 mem_storew_le dropw + + push.1 # num_blocks + push.1008 # dst_ptr (overlaps with source) + push.1000 # src_ptr + push.[1,2,3,4] # nonce + push.[5,6,7,8] # key + exec.aead::encrypt + end + "#; + + let test = build_test!(source, &[]); + expect_assert_error_message!(test, contains "overlap"); +} + +#[test] +fn test_decrypt_fails_on_overlap() { + // With num_blocks=1, decrypt uses (1+1)*8 = 16 elements per range. + // Source [1000, 1016) and dest [1008, 1024) overlap at [1008, 1016). + let source = r#" + use miden::core::crypto::aead + + begin + push.[10,11,12,13] push.1000 mem_storew_le dropw + push.[14,15,16,17] push.1004 mem_storew_le dropw + push.[18,19,20,21] push.1008 mem_storew_le dropw + push.[22,23,24,25] push.1012 mem_storew_le dropw + push.[0,0,0,0] push.1016 mem_storew_le dropw + + push.1 # num_blocks + push.1008 # dst_ptr (overlaps with source) + push.1000 # src_ptr + push.[1,2,3,4] # nonce + push.[5,6,7,8] # key + exec.aead::decrypt + end + "#; + + let test = build_test!(source, &[]); + expect_assert_error_message!(test, contains "overlap"); +} diff --git a/crates/lib/core/tests/crypto/circuit_evaluation.rs b/crates/lib/core/tests/crypto/circuit_evaluation.rs index 9494f929b3..e0734d064c 100644 --- a/crates/lib/core/tests/crypto/circuit_evaluation.rs +++ b/crates/lib/core/tests/crypto/circuit_evaluation.rs @@ -1,5 +1,4 @@ -use miden_ace_codegen::{AceConfig, InputKey, LayoutKind, build_ace_circuit_for_air}; -use miden_air::ProcessorAir; +use miden_ace_codegen::{AceCircuit, AceConfig, InputKey, LayoutKind}; use miden_core::{ Felt, ONE, ZERO, advice::AdviceStackBuilder, @@ -7,6 +6,13 @@ use miden_core::{ }; use miden_utils_testing::rand::rand_quad_felt; +/// Build the batched ACE circuit for the Miden VM ProcessorAir. +fn build_batched_circuit(config: AceConfig) -> AceCircuit { + let air = miden_air::ProcessorAir; + let batch_config = miden_air::ace::reduced_aux_batch_config(); + miden_air::ace::build_batched_ace_circuit::<_, QuadFelt>(&air, config, &batch_config).unwrap() +} + #[test] fn circuit_evaluation_prove_verify() { let num_repetitions = 20; @@ -87,13 +93,12 @@ fn circuit_evaluation_prove_verify() { #[test] fn processor_air_eval_circuit_masm() { - let air = ProcessorAir; let config = AceConfig { num_quotient_chunks: 8, - num_aux_inputs: 14, + num_vlpi_groups: 1, layout: LayoutKind::Masm, }; - let circuit = build_ace_circuit_for_air::<_, Felt, QuadFelt>(&air, config).unwrap(); + let circuit = build_batched_circuit(config); let layout = circuit.layout().clone(); let mut inputs = fill_inputs(&layout); diff --git a/crates/lib/core/tests/crypto/ecdsa_k256_keccak.rs b/crates/lib/core/tests/crypto/ecdsa_k256_keccak.rs index 1a85d2cbb2..bd4a64ad8b 100644 --- a/crates/lib/core/tests/crypto/ecdsa_k256_keccak.rs +++ b/crates/lib/core/tests/crypto/ecdsa_k256_keccak.rs @@ -68,14 +68,14 @@ fn test_ecdsa_verify_cases() { ); let test = build_debug_test!(source, &[]); - let output = test.execute().unwrap(); + let (output, _) = test.execute_for_output().unwrap(); // Assert result - let result = output.stack_outputs().get_element(0).unwrap(); + let result = output.stack.get_element(0).unwrap(); assert_eq!(result, Felt::from_bool(expected_valid)); // Verify the precompile request was logged with the right event ID - let deferred = output.advice_provider().precompile_requests().to_vec(); + let deferred = output.advice.precompile_requests().to_vec(); assert_eq!(deferred.len(), 1); assert_eq!(deferred[0], request.as_precompile_request()); } @@ -112,8 +112,8 @@ fn test_ecdsa_verify_impl_commitment() { ); let test = build_debug_test!(source, &[]); - let output = test.execute().unwrap(); - let stack = output.stack_outputs(); + let (output, _) = test.execute_for_output().unwrap(); + let stack = output.stack; // Verify stack layout: [COMM (0-3), TAG (4-7), result (at position 8), ...] // TAG = [event_id, result, 0, 0] where TAG[1]=result is at position 5 @@ -137,11 +137,11 @@ fn test_ecdsa_verify_impl_commitment() { "result does not match expected validity" ); - let deferred = output.advice_provider().precompile_requests().to_vec(); + let deferred = output.advice.precompile_requests().to_vec(); assert_eq!(deferred.len(), 1, "expected a single deferred request"); assert_eq!(deferred[0], request.as_precompile_request()); - let advice_stack = output.advice_provider().stack(); + let advice_stack = output.advice.stack(); assert!(advice_stack.is_empty(), "advice stack should be empty after verify_impl"); } } @@ -213,8 +213,8 @@ fn test_ecdsa_verify_bis_wrapper() { ", ); - let mut test = build_debug_test!(&source); - test.add_event_handler(EVENT_ECDSA_SIG_TO_STACK, EcdsaSignatureHandler::new(&secret_key)); + let test = build_debug_test!(&source) + .with_event_handler(EVENT_ECDSA_SIG_TO_STACK, EcdsaSignatureHandler::new(&secret_key)); test.expect_stack(&[]); } diff --git a/crates/lib/core/tests/crypto/eddsa_ed25519.rs b/crates/lib/core/tests/crypto/eddsa_ed25519.rs index 99eb2f57dd..1d5e67c709 100644 --- a/crates/lib/core/tests/crypto/eddsa_ed25519.rs +++ b/crates/lib/core/tests/crypto/eddsa_ed25519.rs @@ -66,12 +66,12 @@ fn test_eddsa_verify_prehash_cases() { ); let test = build_debug_test!(source, &[]); - let output = test.execute().unwrap(); + let (output, _) = test.execute_for_output().unwrap(); - let result = output.stack_outputs().get_element(0).unwrap(); + let result = output.stack.get_element(0).unwrap(); assert_eq!(result, Felt::ONE, "verification result mismatch"); - let deferred = output.advice_provider().precompile_requests().to_vec(); + let deferred = output.advice.precompile_requests().to_vec(); assert_eq!(deferred.len(), 1, "expected one deferred request"); assert_eq!(deferred[0], valid_request.as_precompile_request()); @@ -94,12 +94,12 @@ fn test_eddsa_verify_prehash_cases() { ); let test = build_debug_test!(source, &[]); - let output = test.execute().unwrap(); + let (output, _) = test.execute_for_output().unwrap(); - let result = output.stack_outputs().get_element(0).unwrap(); + let result = output.stack.get_element(0).unwrap(); assert_eq!(result, Felt::ZERO, "verification result mismatch"); - let deferred = output.advice_provider().precompile_requests().to_vec(); + let deferred = output.advice.precompile_requests().to_vec(); assert_eq!(deferred.len(), 1, "expected one deferred request"); assert_eq!(deferred[0], invalid_request.as_precompile_request()); } @@ -133,8 +133,8 @@ fn test_eddsa_verify_prehash_impl_commitment() { ); let test = build_debug_test!(source, &[]); - let output = test.execute().unwrap(); - let stack = output.stack_outputs(); + let (output, _) = test.execute_for_output().unwrap(); + let stack = output.stack; let commitment = stack.get_word(0).unwrap(); let tag = stack.get_word(4).unwrap(); @@ -148,12 +148,12 @@ fn test_eddsa_verify_prehash_impl_commitment() { let result = stack.get_element(5).unwrap(); assert_eq!(result, Felt::from_bool(expected_valid)); - let deferred = output.advice_provider().precompile_requests().to_vec(); + let deferred = output.advice.precompile_requests().to_vec(); assert_eq!(deferred.len(), 1, "expected a single deferred request"); assert_eq!(deferred[0], request.as_precompile_request()); assert!( - output.advice_provider().stack().is_empty(), + output.advice.stack().is_empty(), "advice stack should be empty after verify_prehash_impl" ); } @@ -262,8 +262,8 @@ fn test_eddsa_verify_high_level_wrapper() { ", ); - let mut test = build_debug_test!(&source); - test.add_event_handler(EVENT_EDDSA_SIG_TO_STACK, EddsaSignatureHandler::new(&secret_key)); + let test = build_debug_test!(&source) + .with_event_handler(EVENT_EDDSA_SIG_TO_STACK, EddsaSignatureHandler::new(&secret_key)); test.expect_stack(&[]); test.execute().unwrap(); diff --git a/crates/lib/core/tests/crypto/falcon.rs b/crates/lib/core/tests/crypto/falcon.rs index bac222be3e..d785995208 100644 --- a/crates/lib/core/tests/crypto/falcon.rs +++ b/crates/lib/core/tests/crypto/falcon.rs @@ -10,11 +10,10 @@ use miden_core::{ }; use miden_core_lib::{CoreLibrary, dsa::falcon512_poseidon2}; use miden_processor::{ - DefaultHost, ExecutionError, ProcessorState, Program, StackInputs, + DefaultHost, ExecutionError, FastProcessor, ProcessorState, Program, StackInputs, advice::{AdviceInputs, AdviceMutation}, crypto::random::RandomCoin, event::EventError, - execute_sync, operation::OperationError, }; use miden_utils_testing::{ @@ -284,8 +283,8 @@ fn test_move_sig_to_adv_stack() { let adv_stack = vec![]; let store = MerkleStore::new(); - let mut test = build_debug_test!(source, &op_stack, &adv_stack, store, advice_map.into_iter()); - test.add_event_handler(EVENT_FALCON_SIG_TO_STACK, push_falcon_signature); + let test = build_debug_test!(source, &op_stack, &adv_stack, store, advice_map.into_iter()) + .with_event_handler(EVENT_FALCON_SIG_TO_STACK, push_falcon_signature); test.expect_stack(&[]) } @@ -297,8 +296,8 @@ fn falcon_execution() { let message = random_word(); let (source, op_stack, adv_stack, store, advice_map) = generate_test(sk, message); - let mut test = build_debug_test!(&source, &op_stack, &adv_stack, store, advice_map.into_iter()); - test.add_event_handler(EVENT_FALCON_SIG_TO_STACK, push_falcon_signature); + let test = build_debug_test!(&source, &op_stack, &adv_stack, store, advice_map.into_iter()) + .with_event_handler(EVENT_FALCON_SIG_TO_STACK, push_falcon_signature); test.expect_stack(&[]) } @@ -388,9 +387,9 @@ fn test_mod_12289_rejects_forged_remainder_zero(#[case] a_hi: u64, #[case] a_lo: // Use the upstream test builder directly so we do not auto-register the honest // falcon_div handler from CoreLibrary. let core_lib = miden_core_lib::CoreLibrary::default(); - let mut test = miden_utils_testing::build_test_by_mode!(false, source, &op_stack, &adv_stack); - test.libraries.push(core_lib.library().clone()); - test.add_event_handler(FALCON_DIV, malicious_falcon_div); + let test = miden_utils_testing::build_test_by_mode!(false, source, &op_stack, &adv_stack) + .with_library(core_lib.library().clone()) + .with_event_handler(FALCON_DIV, malicious_falcon_div); // Hardened mod_12289 must reject forged advice. expect_exec_error_matches!( @@ -434,6 +433,50 @@ fn test_mod_12289_rejects_forged_addition_overflow() { let op_stack = vec![a >> 32, a & 0xffff_ffff]; let adv_stack: Vec = vec![]; + let core_lib = miden_core_lib::CoreLibrary::default(); + let test = miden_utils_testing::build_test_by_mode!(false, source, &op_stack, &adv_stack) + .with_library(core_lib.library().clone()) + .with_event_handler(FALCON_DIV, malicious_falcon_div); + + expect_exec_error_matches!( + test, + ExecutionError::OperationError { + err: OperationError::FailedAssertion { err_msg, .. }, + .. + } if err_msg.as_deref() == Some("comparison failed: addition overflow") + ); +} + +#[test] +fn test_mod_12289_rejects_non_u32_remainder_advice() { + const FALCON_DIV: EventName = + EventName::new("miden::core::crypto::dsa::falcon512_poseidon2::falcon_div"); + + fn malicious_falcon_div(process: &ProcessorState) -> Result, EventError> { + let a_hi = process.get_stack_item(1).as_canonical_u64(); + let a_lo = process.get_stack_item(2).as_canonical_u64(); + let dividend = (a_hi << 32) | a_lo; + let quotient = dividend / M; + + let q_hi = Felt::new(quotient >> 32); + let q_lo = Felt::new(quotient & 0xffff_ffff); + let forged_remainder = Felt::new(Felt::ORDER_U64 - 1); + + let remainder = AdviceMutation::extend_stack([forged_remainder]); + let quotient = AdviceMutation::extend_stack([q_hi, q_lo]); + Ok(vec![remainder, quotient]) + } + + let source = " + use miden::core::crypto::dsa::falcon512_poseidon2 + begin + exec.falcon512_poseidon2::mod_12289 + end + "; + + let op_stack = vec![0, 100_000]; + let adv_stack: Vec = vec![]; + let core_lib = miden_core_lib::CoreLibrary::default(); let mut test = miden_utils_testing::build_test_by_mode!(false, source, &op_stack, &adv_stack); test.libraries.push(core_lib.library().clone()); @@ -442,9 +485,9 @@ fn test_mod_12289_rejects_forged_addition_overflow() { expect_exec_error_matches!( test, ExecutionError::OperationError { - err: OperationError::FailedAssertion { err_msg, .. }, + err: OperationError::NotU32Values { values }, .. - } if err_msg.as_deref() == Some("comparison failed: addition overflow") + } if values.iter().any(|value| value.as_canonical_u64() == Felt::ORDER_U64 - 1) ); } @@ -467,8 +510,11 @@ fn falcon_prove_verify() { host.register_handler(EVENT_FALCON_SIG_TO_STACK, Arc::new(push_falcon_signature)) .unwrap(); - let trace = execute_sync(&program, stack_inputs, advice_inputs, &mut host, Default::default()) - .expect("failed to execute"); + let trace_inputs = + FastProcessor::new_with_options(stack_inputs, advice_inputs, Default::default()) + .execute_trace_inputs_sync(&program, &mut host) + .expect("failed to execute"); + let trace = miden_processor::trace::build_trace(trace_inputs).expect("failed to build trace"); trace.check_constraints(); } diff --git a/crates/lib/core/tests/crypto/keccak256.rs b/crates/lib/core/tests/crypto/keccak256.rs index c8ae8734ae..f1fb01d30a 100644 --- a/crates/lib/core/tests/crypto/keccak256.rs +++ b/crates/lib/core/tests/crypto/keccak256.rs @@ -74,12 +74,12 @@ fn test_keccak_handler(input_u8: &[u8]) { let test = build_debug_test!(source, &[]); - let output = test.execute().unwrap(); + let (output, _) = test.execute_for_output().unwrap(); - let advice_stack = output.advice_provider().stack(); + let advice_stack = output.advice.stack(); assert_eq!(advice_stack, preimage.digest().as_ref()); - let deferred = output.advice_provider().precompile_requests().to_vec(); + let deferred = output.advice.precompile_requests().to_vec(); assert_eq!(deferred.len(), 1, "advice deferred must contain one entry"); let precompile_data = &deferred[0]; @@ -121,9 +121,9 @@ fn test_keccak_hash_bytes_impl(input_u8: &[u8]) { let test = build_debug_test!(source, &[]); - let output = test.execute().unwrap(); + let (output, _) = test.execute_for_output().unwrap(); - let stack = output.stack_outputs(); + let stack = output.stack; let commitment = stack.get_word(0).unwrap(); let tag = stack.get_word(4).unwrap(); let precompile_commitment = PrecompileCommitment::new(tag, commitment); @@ -134,13 +134,13 @@ fn test_keccak_hash_bytes_impl(input_u8: &[u8]) { let digest: [Felt; 8] = array::from_fn(|i| stack.get_element(8 + i).unwrap()); assert_eq!(&digest, preimage.digest().as_ref(), "output digest does not match"); - let deferred = output.advice_provider().precompile_requests().to_vec(); + let deferred = output.advice.precompile_requests().to_vec(); assert_eq!(deferred.len(), 1, "expected a single deferred request"); assert_eq!(deferred[0].event_id(), KECCAK_HASH_BYTES_EVENT_NAME.to_event_id()); assert_eq!(deferred[0].calldata(), preimage.as_ref()); assert_eq!(deferred[0], preimage.into()); - let advice_stack = output.advice_provider().stack(); + let advice_stack = output.advice.stack(); assert!(advice_stack.is_empty(), "advice stack should be empty after hash_bytes_impl"); } diff --git a/crates/lib/core/tests/crypto/sha512.rs b/crates/lib/core/tests/crypto/sha512.rs index 498fb5f268..8fbba52eae 100644 --- a/crates/lib/core/tests/crypto/sha512.rs +++ b/crates/lib/core/tests/crypto/sha512.rs @@ -56,12 +56,12 @@ fn test_sha512_handler(bytes: &[u8]) { ); let test = build_debug_test!(source, &[]); - let output = test.execute().unwrap(); + let (output, _) = test.execute_for_output().unwrap(); - let advice_stack: Vec<_> = output.advice_provider().stack().to_vec(); + let advice_stack: Vec<_> = output.advice.stack().to_vec(); assert_eq!(advice_stack, preimage.digest().as_ref()); - let deferred = output.advice_provider().precompile_requests().to_vec(); + let deferred = output.advice.precompile_requests().to_vec(); assert_eq!(deferred.len(), 1); let request = &deferred[0]; assert_eq!(request.calldata(), preimage.as_ref()); @@ -90,13 +90,13 @@ fn test_sha512_hash_memory_impl(bytes: &[u8]) { ); let test = build_debug_test!(source, &[]); - let output = test.execute().unwrap(); - let stack = output.stack_outputs(); + let (output, _) = test.execute_for_output().unwrap(); + let stack = &output.stack; // we cannot check the digest since it overflows the stack. // we check it in test_sha512_hash_memory - let deferred = output.advice_provider().precompile_requests().to_vec(); + let deferred = output.advice.precompile_requests().to_vec(); assert_eq!(deferred.len(), 1); let request = &deferred[0]; assert_eq!(request.event_id(), SHA512_HASH_BYTES_EVENT_NAME.to_event_id()); @@ -111,7 +111,7 @@ fn test_sha512_hash_memory_impl(bytes: &[u8]) { assert_eq!(precompile_commitment, verifier_commitment, "commitment mismatch"); assert!( - output.advice_provider().stack().is_empty(), + output.advice.stack().is_empty(), "advice stack must be empty after hash_memory_impl" ); } diff --git a/crates/lib/core/tests/main.rs b/crates/lib/core/tests/main.rs index 4ff79520b9..9be4cce29c 100644 --- a/crates/lib/core/tests/main.rs +++ b/crates/lib/core/tests/main.rs @@ -5,11 +5,9 @@ extern crate alloc; macro_rules! build_test { ($($params:tt)+) => {{ let core_lib = miden_core_lib::CoreLibrary::default(); - let mut test = miden_utils_testing::build_test_by_mode!(false, $($params)+); - test.libraries.push(core_lib.library().clone()); - test.add_event_handlers(core_lib.handlers()); - - test + miden_utils_testing::build_test_by_mode!(false, $($params)+) + .with_library(core_lib.library().clone()) + .with_event_handlers(core_lib.handlers()) }} } @@ -18,11 +16,9 @@ macro_rules! build_test { macro_rules! build_debug_test { ($($params:tt)+) => {{ let core_lib = miden_core_lib::CoreLibrary::default(); - let mut test = miden_utils_testing::build_test_by_mode!(true, $($params)+); - test.libraries.push(core_lib.library().clone()); - test.add_event_handlers(core_lib.handlers()); - - test + miden_utils_testing::build_test_by_mode!(true, $($params)+) + .with_library(core_lib.library().clone()) + .with_event_handlers(core_lib.handlers()) }} } @@ -83,6 +79,4 @@ mod stark_asserts; mod sys; mod word; -// These tests are disabled until the recursive verifier is updated to work with Plonky3 proofs -// mod pcs; -// mod stark; +mod stark; diff --git a/crates/lib/core/tests/math/u64_mod.rs b/crates/lib/core/tests/math/u64_mod.rs index ad9aba8413..59e778c767 100644 --- a/crates/lib/core/tests/math/u64_mod.rs +++ b/crates/lib/core/tests/math/u64_mod.rs @@ -4,7 +4,8 @@ use miden_core::assert_matches; use miden_core_lib::handlers::u64_div::{U64_DIV_EVENT_NAME, U64DivError}; use miden_processor::{ExecutionError, operation::OperationError}; use miden_utils_testing::{ - Felt, U32_BOUND, expect_exec_error_matches, proptest::prelude::*, rand::rand_value, stack, + Felt, PrimeField64, U32_BOUND, expect_exec_error_matches, proptest::prelude::*, + rand::rand_value, stack, }; #[test] @@ -1203,6 +1204,66 @@ fn unchecked_rotr() { build_test!(source, &stack![b as u64, a0, a1, 5]).expect_stack(&[c0, c1, 5]); } +#[test] +fn unchecked_rotr_large_value_by_0() { + let source = " + use miden::core::math::u64 + begin + exec.u64::rotr + end"; + + let a = Felt::ORDER_U64 + 1; + let (a1, a0) = split_u64(a); + + build_test!(source, &stack![0_u64, a0, a1, 5]).expect_stack(&[a0, a1, 5]); +} + +#[test] +fn unchecked_rotr_large_value_by_32() { + let source = " + use miden::core::math::u64 + begin + exec.u64::rotr + end"; + + let a = Felt::ORDER_U64 + 1; + let (a1, a0) = split_u64(a); + let c = a.rotate_right(32); + let (c1, c0) = split_u64(c); + + build_test!(source, &stack![32_u64, a0, a1, 5]).expect_stack(&[c0, c1, 5]); +} + +#[test] +fn unchecked_rotl_large_value_by_0() { + let source = " + use miden::core::math::u64 + begin + exec.u64::rotl + end"; + + let a = Felt::ORDER_U64 + 1; + let (a1, a0) = split_u64(a); + + build_test!(source, &stack![0_u64, a0, a1, 5]).expect_stack(&[a0, a1, 5]); +} + +#[test] +fn unchecked_rotl_large_value_by_32() { + let source = " + use miden::core::math::u64 + begin + exec.u64::rotl + end"; + + let a = Felt::ORDER_U64 + 1; + let (a1, a0) = split_u64(a); + let c = a.rotate_left(32); + let (c1, c0) = split_u64(c); + + build_test!(source, &stack![32_u64, a0, a1, 5]).expect_stack(&[c0, c1, 5]); +} + #[test] fn clz() { let source = " diff --git a/crates/lib/core/tests/mem/mod.rs b/crates/lib/core/tests/mem/mod.rs index 6f9e1aa792..2434dee99b 100644 --- a/crates/lib/core/tests/mem/mod.rs +++ b/crates/lib/core/tests/mem/mod.rs @@ -6,6 +6,48 @@ use miden_utils_testing::{ AdviceStackBuilder, build_expected_hash, build_expected_perm, felt_slice_to_ints, }; +#[test] +fn test_memcopy_words_fails_on_overlap() { + // Source [1000, 1000 + 4*3) = [1000, 1012) + // Dest [1008, 1008 + 4*3) = [1008, 1020) + // These overlap at [1008, 1012). + let source = " + use miden::core::mem + + begin + push.0.0.0.1.1000 mem_storew_be dropw + push.0.0.1.0.1004 mem_storew_be dropw + push.0.0.1.1.1008 mem_storew_be dropw + + push.1008.1000.3 exec.mem::memcopy_words + end + "; + + let test = build_test!(source, &[]); + expect_assert_error_message!(test, contains "overlap"); +} + +#[test] +fn test_memcopy_elements_fails_on_overlap() { + // Source [1000, 1000 + 10) = [1000, 1010) + // Dest [1005, 1005 + 10) = [1005, 1015) + // These overlap at [1005, 1010). + let source = " + use miden::core::mem + + begin + push.1.2.3.4.1000 mem_storew_be dropw + push.5.6.7.8.1004 mem_storew_be dropw + push.9.10.11.12.1008 mem_storew_be dropw + + push.1005.1000.10 exec.mem::memcopy_elements + end + "; + + let test = build_test!(source, &[]); + expect_assert_error_message!(test, contains "overlap"); +} + #[test] fn test_memcopy_words() { use miden_core_lib::CoreLibrary; diff --git a/crates/lib/core/tests/stark/ace_circuit.rs b/crates/lib/core/tests/stark/ace_circuit.rs new file mode 100644 index 0000000000..180c7f6994 --- /dev/null +++ b/crates/lib/core/tests/stark/ace_circuit.rs @@ -0,0 +1,14 @@ +#![cfg(feature = "constraints-tools")] + +use miden_core_lib::constraints_regen; + +#[test] +fn constraints_eval_masm_matches_air() { + constraints_regen::constraints_eval_masm_matches_air() + .expect("constraints_eval.masm drift check failed"); +} + +#[test] +fn relation_digest_matches_air() { + constraints_regen::relation_digest_matches_air().expect("relation digest check failed"); +} diff --git a/crates/lib/core/tests/stark/ace_read_check.rs b/crates/lib/core/tests/stark/ace_read_check.rs new file mode 100644 index 0000000000..3e9a06543a --- /dev/null +++ b/crates/lib/core/tests/stark/ace_read_check.rs @@ -0,0 +1,121 @@ +//! ACE READ section extraction and cross-validation. +//! +//! After the recursive verifier executes in MASM, this module: +//! 1. Extracts the ACE READ section from MASM memory into a flat `Vec`. +//! 2. Runs structural sanity checks on critical values (non-zero challenges, etc.). +//! 3. Evaluates the ACE circuit in Rust and asserts the result is zero. +//! +//! This catches bugs in the MASM verifier's input preparation (wrong values, wrong +//! memory slots, missing absorptions) that would silently break soundness. + +use miden_ace_codegen::{AceConfig, InputKey, InputLayout, LayoutKind}; +use miden_air::{ProcessorAir, ace::build_batched_ace_circuit}; +use miden_core::{ + Felt, + field::{PrimeCharacteristicRing, QuadFelt}, +}; +use miden_crypto::field::Field; +use miden_processor::{ContextId, ExecutionOutput}; + +// MASM CONSTANTS (must match crates/lib/core/asm/stark/constants.masm) +// ================================================================================================ + +const PUBLIC_INPUTS_ADDRESS_PTR: u32 = 3223322667; +const AUX_RAND_ELEM_PTR: u32 = 3225419776; + +// EXTRACTION +// ================================================================================================ + +/// Extract the ACE READ section from MASM memory into a flat input vector. +/// +/// Each pair of consecutive base felts forms one extension field element. +/// The returned vector has `layout.total_inputs` entries. +fn extract_ace_inputs(output: &ExecutionOutput, layout: &InputLayout) -> Vec { + let ctx = ContextId::root(); + + let pi_ptr = output + .memory + .read_element(ctx, Felt::from_u32(PUBLIC_INPUTS_ADDRESS_PTR)) + .expect("PUBLIC_INPUTS_ADDRESS_PTR not found in memory") + .as_canonical_u64() as u32; + + assert!( + pi_ptr < AUX_RAND_ELEM_PTR, + "pi_ptr ({pi_ptr}) >= AUX_RAND_ELEM_PTR ({AUX_RAND_ELEM_PTR})" + ); + + (0..layout.total_inputs) + .map(|i| { + let addr = pi_ptr + (i as u32) * 2; + let c0 = output.memory.read_element(ctx, Felt::from_u32(addr)).expect("read c0"); + let c1 = output.memory.read_element(ctx, Felt::from_u32(addr + 1)).expect("read c1"); + QuadFelt::new([c0, c1]) + }) + .collect() +} + +// SANITY CHECKS +// ================================================================================================ + +/// Assert critical Fiat-Shamir-derived values are non-zero. +fn sanity_check_ace_inputs(inputs: &[QuadFelt], layout: &InputLayout) { + let get = |key: InputKey| -> QuadFelt { inputs[layout.index(key).expect("missing key")] }; + + // Fiat-Shamir challenges + assert!(!get(InputKey::Alpha).is_zero(), "alpha is zero"); + assert!(!get(InputKey::AuxRandBeta).is_zero(), "beta is zero"); + assert!(!get(InputKey::Gamma).is_zero(), "gamma is zero"); + + // Vanishing polynomial + assert!( + !(get(InputKey::ZPowN) - QuadFelt::ONE).is_zero(), + "z^N - 1 = 0 -- OOD point is on the trace domain" + ); + + // Selector polynomials + assert!(!get(InputKey::IsFirst).is_zero(), "is_first is zero"); + assert!(!get(InputKey::IsLast).is_zero(), "is_last is zero"); + assert!(!get(InputKey::IsTransition).is_zero(), "is_transition is zero"); + + // Quotient recomposition + assert!(!get(InputKey::Weight0).is_zero(), "weight0 is zero"); + assert!(!get(InputKey::F).is_zero(), "f is zero"); + assert!(!get(InputKey::S0).is_zero(), "s0 is zero"); + + // OOD frame should have at least some non-zero values + assert!( + (0..layout.counts.width) + .any(|col| !get(InputKey::Main { offset: 0, index: col }).is_zero()), + "all main trace OOD values at current row are zero" + ); +} + +// CROSS-EVALUATION +// ================================================================================================ + +/// Build the ACE circuit, extract inputs from MASM memory, run sanity checks, +/// and verify the Rust evaluation matches (result is zero). +pub fn cross_check_ace_circuit(output: &ExecutionOutput) { + let config = AceConfig { + num_quotient_chunks: 8, + num_vlpi_groups: 1, + layout: LayoutKind::Masm, + }; + + let batch_config = miden_air::ace::reduced_aux_batch_config(); + let circuit = build_batched_ace_circuit::<_, QuadFelt>(&ProcessorAir, config, &batch_config) + .expect("ace circuit"); + let layout = circuit.layout(); + + let inputs = extract_ace_inputs(output, layout); + assert_eq!(inputs.len(), layout.total_inputs, "extracted input count mismatch"); + + sanity_check_ace_inputs(&inputs, layout); + + let result = circuit.eval(&inputs).expect("ACE eval failed"); + assert!( + result.is_zero(), + "ACE cross-evaluation is non-zero: {result:?}\n\ + MASM verifier populated the READ section incorrectly." + ); +} diff --git a/crates/lib/core/tests/stark/batch_query_gen.rs b/crates/lib/core/tests/stark/batch_query_gen.rs new file mode 100644 index 0000000000..00982c512c --- /dev/null +++ b/crates/lib/core/tests/stark/batch_query_gen.rs @@ -0,0 +1,277 @@ +//! Unit tests for the batch `generate_list_indices` procedure. +//! +//! Verifies that the batch implementation produces identical query indices to a reference +//! implementation that calls `sample_bits` in a loop. Both programs start from the same +//! sponge state and parameters, and we compare the resulting query words stored in memory. + +use miden_core::Felt; +use miden_processor::ContextId; +use rand::{Rng, SeedableRng}; +use rand_chacha::ChaCha20Rng; +use rstest::rstest; + +// Memory layout constants (must match constants.masm). +const R1_PTR: u32 = 3223322672; +const R2_PTR: u32 = 3223322676; +const C_PTR: u32 = 3223322668; +const NUM_QUERIES_PTR: u32 = 3223322628; +const LDE_DOMAIN_LOG_SIZE_PTR: u32 = 3223322625; +const FRI_QUERIES_ADDRESS_PTR: u32 = 3223322633; +const RANDOM_COIN_INPUT_LEN_PTR: u32 = 3223322756; +const RANDOM_COIN_OUTPUT_LEN_PTR: u32 = 3223322757; + +// Fixed query storage address. +const QUERY_PTR: u32 = 100_000; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/// Build the MASM preamble that initializes the sponge state and verifier parameters. +/// +/// `sponge` is 12 field-element values `[r1_0..r1_3, r2_0..r2_3, c_0..c_3]`. +fn setup_masm(sponge: &[u64; 12], output_len: u32, num_queries: u32, depth: u32) -> String { + format!( + r#" + # Store R1 (rate word 1) + push.{r1_3}.{r1_2}.{r1_1}.{r1_0} + push.{R1_PTR} mem_storew_le dropw + + # Store R2 (rate word 2) + push.{r2_3}.{r2_2}.{r2_1}.{r2_0} + push.{R2_PTR} mem_storew_le dropw + + # Store C (capacity) + push.{c_3}.{c_2}.{c_1}.{c_0} + push.{C_PTR} mem_storew_le dropw + + # Random coin buffer state + push.0 push.{RANDOM_COIN_INPUT_LEN_PTR} mem_store + push.{output_len} push.{RANDOM_COIN_OUTPUT_LEN_PTR} mem_store + + # Verifier parameters + push.{num_queries} push.{NUM_QUERIES_PTR} mem_store + push.{depth} push.{LDE_DOMAIN_LOG_SIZE_PTR} mem_store + push.{QUERY_PTR} push.{FRI_QUERIES_ADDRESS_PTR} mem_store + "#, + r1_0 = sponge[0], + r1_1 = sponge[1], + r1_2 = sponge[2], + r1_3 = sponge[3], + r2_0 = sponge[4], + r2_1 = sponge[5], + r2_2 = sponge[6], + r2_3 = sponge[7], + c_0 = sponge[8], + c_1 = sponge[9], + c_2 = sponge[10], + c_3 = sponge[11], + ) +} + +/// MASM source that calls the batch `generate_list_indices`. +fn batch_source(setup: &str) -> String { + format!( + r#" + use miden::core::stark::random_coin + begin + {setup} + exec.random_coin::generate_list_indices + end + "#, + ) +} + +/// MASM source with a reference per-query loop. +fn reference_source(setup: &str) -> String { + format!( + r#" + use miden::core::stark::random_coin + use miden::core::stark::utils + use miden::core::stark::constants + use miden::core::crypto::hashes::poseidon2 + + #! Sample a felt, permuting first if the output buffer is empty. + proc sample_felt_safe + push.{RANDOM_COIN_OUTPUT_LEN_PTR} mem_load + push.0 eq + if.true + exec.random_coin::load_random_coin_state + exec.poseidon2::permute + exec.random_coin::store_random_coin_state + push.8 push.{RANDOM_COIN_OUTPUT_LEN_PTR} mem_store + end + exec.random_coin::sample_felt + end + + #! sample_bits using the safe wrapper. + proc sample_bits_safe + dup + pow2 + u32assert u32overflowing_sub.1 assertz + exec.sample_felt_safe + u32split + swap + drop + u32and + swap + drop + end + + begin + {setup} + + exec.constants::get_number_queries + exec.constants::get_fri_queries_address + exec.constants::get_lde_domain_depth + dup push.32 swap u32wrapping_sub pow2 + movdn.2 swap + dup.3 push.0 neq + while.true + dup.1 + exec.sample_bits_safe + dup.2 dup.4 dup.2 + exec.utils::bit_reverse_len_parallel + push.0 movdn.3 + dup.4 + mem_storew_le + dropw + add.4 + movup.3 sub.1 movdn.3 + dup.3 push.0 neq + end + push.0 push.{RANDOM_COIN_INPUT_LEN_PTR} mem_store + drop drop drop drop + end + "#, + RANDOM_COIN_OUTPUT_LEN_PTR = RANDOM_COIN_OUTPUT_LEN_PTR, + RANDOM_COIN_INPUT_LEN_PTR = RANDOM_COIN_INPUT_LEN_PTR, + ) +} + +/// Run both batch and reference programs with identical initial state, then compare +/// all generated query words and the final `output_len`. +fn assert_batch_matches_reference( + sponge: &[u64; 12], + output_len: u32, + num_queries: u32, + depth: u32, +) { + let setup = setup_masm(sponge, output_len, num_queries, depth); + let batch_src = batch_source(&setup); + let ref_src = reference_source(&setup); + + let (batch_out, _) = build_test!(&batch_src, &[]).execute_for_output().unwrap_or_else(|e| { + panic!("batch failed (nq={num_queries}, d={depth}, ol={output_len}): {e}") + }); + let (ref_out, _) = build_test!(&ref_src, &[]).execute_for_output().unwrap_or_else(|e| { + panic!("reference failed (nq={num_queries}, d={depth}, ol={output_len}): {e}") + }); + + // Compare every stored query word. + for i in 0..num_queries { + let base = QUERY_PTR + i * 4; + for j in 0..4u32 { + let addr = base + j; + let bv = batch_out + .memory + .read_element(ContextId::root(), Felt::from_u32(addr)) + .map(|f| f.as_canonical_u64()) + .unwrap_or(0); + let rv = ref_out + .memory + .read_element(ContextId::root(), Felt::from_u32(addr)) + .map(|f| f.as_canonical_u64()) + .unwrap_or(0); + assert_eq!( + bv, rv, + "query {i} offset {j} (addr {addr}): batch={bv} vs ref={rv} \ + [nq={num_queries}, depth={depth}, output_len={output_len}]" + ); + } + } + + // Compare final output_len. + let b_ol = batch_out + .memory + .read_element(ContextId::root(), Felt::from_u32(RANDOM_COIN_OUTPUT_LEN_PTR)) + .map(|f| f.as_canonical_u64()) + .unwrap_or(u64::MAX); + let r_ol = ref_out + .memory + .read_element(ContextId::root(), Felt::from_u32(RANDOM_COIN_OUTPUT_LEN_PTR)) + .map(|f| f.as_canonical_u64()) + .unwrap_or(u64::MAX); + assert_eq!( + b_ol, r_ol, + "output_len mismatch: batch={b_ol} vs ref={r_ol} \ + [nq={num_queries}, depth={depth}, output_len={output_len}]" + ); +} + +/// Generate a deterministic sponge state from a seed. +fn random_sponge(seed: u64) -> [u64; 12] { + let mut rng = ChaCha20Rng::seed_from_u64(seed); + core::array::from_fn(|_| rng.random::()) +} + +// --------------------------------------------------------------------------- +// Parametric tests +// --------------------------------------------------------------------------- + +/// Test across a range of num_queries values with fixed sponge and depth. +/// Covers: 1 query, small batches, exact rate boundary (7), one past (8, 9), +/// typical (27), and a larger value (40 = 5 permutations). +#[rstest] +#[case::single_query(1)] +#[case::two_queries(2)] +#[case::three_queries(3)] +#[case::seven_queries_exact_first_batch(7)] +#[case::eight_queries_triggers_permute(8)] +#[case::nine_queries_one_past_permute(9)] +#[case::fifteen_queries_two_batches(15)] +#[case::twentyseven_queries_typical(27)] +#[case::forty_queries_five_permutes(40)] +fn batch_vs_reference_num_queries(#[case] num_queries: u32) { + let sponge = random_sponge(42); + assert_batch_matches_reference(&sponge, 7, num_queries, 17); +} + +/// Test across a range of LDE domain depths. +/// depth must be in 1..=31 (since pow2_shift = 2^(32-depth) must fit in u32, +/// and mask = 2^depth - 1 must be valid). +#[rstest] +#[case::depth_10(10)] +#[case::depth_13(13)] +#[case::depth_17(17)] +#[case::depth_20(20)] +#[case::depth_24(24)] +fn batch_vs_reference_depth(#[case] depth: u32) { + let sponge = random_sponge(99); + assert_batch_matches_reference(&sponge, 7, 27, depth); +} + +/// Test different initial output_len values. +/// After PoW the typical value is 7, but we test the range 1..=8 to ensure +/// the permute-on-exhaustion logic is correct at every boundary. +#[rstest] +#[case::output_len_1(1)] +#[case::output_len_2(2)] +#[case::output_len_4(4)] +#[case::output_len_7(7)] +#[case::output_len_8(8)] +fn batch_vs_reference_output_len(#[case] output_len: u32) { + let sponge = random_sponge(77); + assert_batch_matches_reference(&sponge, output_len, 27, 17); +} + +/// Test with several different random sponge states to exercise varied rate element values. +#[rstest] +#[case::seed_0(0)] +#[case::seed_1(1)] +#[case::seed_12345(12345)] +#[case::seed_999999(999999)] +fn batch_vs_reference_random_sponge(#[case] seed: u64) { + let sponge = random_sponge(seed); + assert_batch_matches_reference(&sponge, 7, 27, 17); +} diff --git a/crates/lib/core/tests/stark/mod.rs b/crates/lib/core/tests/stark/mod.rs index 67677fa5a0..0057b6fda7 100644 --- a/crates/lib/core/tests/stark/mod.rs +++ b/crates/lib/core/tests/stark/mod.rs @@ -1,61 +1,76 @@ use std::array; -use miden_air::{FieldExtension, HashFunction, PublicInputs}; +use miden_air::PublicInputs; use miden_assembly::Assembler; use miden_core::{ - Felt, FieldElement, QuadFelt, WORD_SIZE, Word, ZERO, precompile::PrecompileTranscriptState, -}; -use miden_processor::{ - DefaultHost, Program, ProgramInfo, - crypto::RandomCoin, -}; -use miden_utils_testing::{ - AdviceInputs, ProvingOptions, StackInputs, VerifierError, proptest::proptest, prove, + Felt, WORD_SIZE, + field::{BasedVectorSpace, PrimeCharacteristicRing, QuadFelt}, + precompile::PrecompileTranscriptState, + proof::HashFunction, }; +use miden_processor::{DefaultHost, ExecutionOptions, Program, ProgramInfo}; +use miden_utils_testing::{AdviceInputs, ProvingOptions, StackInputs, prove_sync}; use rand::{Rng, RngCore, SeedableRng}; use rand_chacha::ChaCha20Rng; use rstest::rstest; -use verifier_recursive::{VerifierData, generate_advice_inputs}; +use verifier_recursive::{VerifierData, VerifierError, generate_advice_inputs}; +mod ace_circuit; +mod ace_read_check; +mod batch_query_gen; mod verifier_recursive; -// Note: Changes to Miden VM may cause this test to fail when some of the assumptions documented -// in `crates/lib/core/asm/sys/vm/mod.masm` are violated. -#[rstest] -#[case(None)] -#[case(Some(KERNEL_EVEN_NUM_PROC))] -#[case(Some(KERNEL_ODD_NUM_PROC))] -#[ignore = "re-enable once we're done implementing all constraints in airscript"] -fn stark_verifier_e2f4(#[case] kernel: Option<&str>) { - // An example MASM program to be verified inside Miden VM. - let example_source = "begin - repeat.320 - swap dup.1 add - end - u32split drop - end"; - - let mut stack_inputs = vec![0_u64; 16]; - stack_inputs[15] = 0; - stack_inputs[14] = 1; - - let VerifierData { - initial_stack, - advice_stack: tape, - store, - advice_map, - } = generate_recursive_verifier_data(example_source, stack_inputs, kernel).unwrap(); - - // Verify inside Miden VM - let source = " - use miden::core::sys::vm - begin - exec.vm::verify_proof - end - "; +// RECURSIVE VERIFIER TESTS +// ================================================================================================ - let test = build_test!(source, &initial_stack, &tape, store, advice_map); - test.expect_stack(&[]); +#[test] +fn stark_verifier_e2f4_small() { + let inputs = fib_stack_inputs(); + let data = generate_recursive_verifier_data(EXAMPLE_FIB_SMALL, inputs, None).unwrap(); + run_recursive_verifier(&data); +} + +#[test] +fn stark_verifier_e2f4_large() { + let inputs = fib_stack_inputs(); + let data = generate_recursive_verifier_data(EXAMPLE_FIB_LARGE, inputs, None).unwrap(); + run_recursive_verifier(&data); +} + +#[test] +fn stark_verifier_e2f4_with_kernel_even() { + let inputs = fib_stack_inputs(); + let data = generate_recursive_verifier_data( + EXAMPLE_FIB_KERNEL_SMALL, + inputs, + Some(KERNEL_EVEN_NUM_PROC), + ) + .unwrap(); + run_recursive_verifier(&data); +} + +#[test] +fn stark_verifier_e2f4_with_kernel_odd() { + let inputs = fib_stack_inputs(); + let data = generate_recursive_verifier_data( + EXAMPLE_FIB_KERNEL_SMALL, + inputs, + Some(KERNEL_ODD_NUM_PROC), + ) + .unwrap(); + run_recursive_verifier(&data); +} + +#[test] +fn stark_verifier_e2f4_with_kernel_single() { + let inputs = fib_stack_inputs(); + let data = generate_recursive_verifier_data( + EXAMPLE_FIB_KERNEL_SMALL, + inputs, + Some(KERNEL_SINGLE_PROC), + ) + .unwrap(); + run_recursive_verifier(&data); } // Helper function for recursive verification @@ -64,31 +79,41 @@ pub fn generate_recursive_verifier_data( stack_inputs: Vec, kernel: Option<&str>, ) -> Result { - let program = { + let (program, kernel_lib) = { match kernel { Some(kernel) => { let context = miden_assembly::testing::TestContext::new(); let kernel_lib = Assembler::new(context.source_manager()).assemble_kernel(kernel).unwrap(); - let assembler = Assembler::with_kernel(context.source_manager(), kernel_lib); + let assembler = + Assembler::with_kernel(context.source_manager(), kernel_lib.clone()); let program: Program = assembler.assemble_program(source).unwrap(); - program + (program, Some(kernel_lib)) }, None => { let program: Program = Assembler::default().assemble_program(source).unwrap(); - program + (program, None) }, } }; let stack_inputs = StackInputs::try_from_ints(stack_inputs).unwrap(); let advice_inputs = AdviceInputs::default(); let mut host = DefaultHost::default(); + if let Some(ref kernel_lib) = kernel_lib { + host.load_library(kernel_lib.mast_forest()).unwrap(); + } - let options = - ProvingOptions::new(27, 8, 0, FieldExtension::Quadratic, 4, 127, HashFunction::Poseidon2); + let options = ProvingOptions::new(HashFunction::Poseidon2); - let (stack_outputs, proof) = - prove(&program, stack_inputs, advice_inputs, &mut host, options).unwrap(); + let (stack_outputs, proof) = prove_sync( + &program, + stack_inputs, + advice_inputs, + &mut host, + ExecutionOptions::default(), + options, + ) + .unwrap(); let program_info = ProgramInfo::from(program); @@ -99,10 +124,70 @@ pub fn generate_recursive_verifier_data( stack_outputs, PrecompileTranscriptState::default(), ); - let (_, proof, _precompile_requests) = proof.into_parts(); - Ok(generate_advice_inputs(proof, pub_inputs).unwrap()) + let (_, proof_bytes, _precompile_requests) = proof.into_parts(); + let data = generate_advice_inputs(&proof_bytes, pub_inputs).unwrap(); + Ok(data) +} + +/// Run the recursive verifier MASM program with the given VerifierData. +fn run_recursive_verifier(data: &VerifierData) { + let source = " + use miden::core::sys::vm + begin + exec.vm::verify_proof + end + "; + let test = build_test!( + source, + &data.initial_stack, + &data.advice_stack, + data.store.clone(), + data.advice_map.clone() + ); + let (output, _host) = test.execute_for_output().expect("recursive verifier execution failed"); + + // Cross-check: extract READ section, sanity-check values, evaluate circuit in Rust. + ace_read_check::cross_check_ace_circuit(&output); } +// EXAMPLE PROGRAMS +// ================================================================================================ + +/// repeat.320 -> log_trace_height=10 -> FRI remainder degree < 64 -> verify_64 path +const EXAMPLE_FIB_SMALL: &str = "begin + repeat.320 + swap dup.1 add + end + u32split drop + end"; + +/// repeat.400 -> log_trace_height=11 -> FRI remainder degree < 128 -> verify_128 path +const EXAMPLE_FIB_LARGE: &str = "begin + repeat.400 + swap dup.1 add + end + u32split drop + end"; + +/// Like EXAMPLE_FIB_SMALL but with a syscall, for kernel-aware tests. +const EXAMPLE_FIB_KERNEL_SMALL: &str = "begin + syscall.foo + repeat.320 + swap dup.1 add + end + u32split drop + end"; + +fn fib_stack_inputs() -> Vec { + let mut inputs = vec![0_u64; 16]; + inputs[15] = 0; + inputs[14] = 1; + inputs +} + +// VARIABLE LENGTH PUBLIC INPUTS TESTS +// ================================================================================================ + #[rstest] #[case(0)] #[case(1)] @@ -111,29 +196,16 @@ pub fn generate_recursive_verifier_data( #[case(8)] #[case(1000)] fn variable_length_public_inputs(#[case] num_kernel_proc_digests: usize) { - // STARK parameters - let num_queries = 27; - let log_trace_len = 10; - let grinding_bits = 16; - let num_constraints = 200; - let trace_info = 0x50010810; - let num_fixed_len_pi_padded = 40; - let mut initial_stack = vec![ - log_trace_len, - num_queries, - grinding_bits, - num_constraints, - trace_info, - num_fixed_len_pi_padded, - ]; - initial_stack.reverse(); - - // Seeded random number generator for reproducibility + // init_seed expects [log(trace_length), rd0, rd1, rd2, rd3, ...] + let log_trace_length = 10_u64; + // Relation digest values are arbitrary here; the test only validates VLPI reduction. + let rd = [1_u64, 2, 3, 4]; + let initial_stack = vec![log_trace_length, rd[0], rd[1], rd[2], rd[3]]; + let seed = [0_u8; 32]; let mut rng = ChaCha20Rng::from_seed(seed); - // 1) Generate fixed length public inputs - + // 1) Generate fixed-length public inputs let input_operand_stack: [u64; 16] = array::from_fn(|_| rng.next_u64()); let output_operand_stack: [u64; 16] = array::from_fn(|_| rng.next_u64()); let program_digest: [u64; 4] = array::from_fn(|_| rng.next_u64()); @@ -141,129 +213,68 @@ fn variable_length_public_inputs(#[case] num_kernel_proc_digests: usize) { let mut fixed_length_public_inputs = input_operand_stack.to_vec(); fixed_length_public_inputs.extend_from_slice(&output_operand_stack); fixed_length_public_inputs.extend_from_slice(&program_digest); - let fix_len_pi_with_padding = fixed_length_public_inputs.len().next_multiple_of(8); - fixed_length_public_inputs.resize(fix_len_pi_with_padding, 0); - - // 2) Generate the variable length public inputs, i.e., the kernel procedures digests + fixed_length_public_inputs.resize(fixed_length_public_inputs.len().next_multiple_of(8), 0); - let num_elements_kernel_proc_digests = num_kernel_proc_digests * WORD_SIZE.next_multiple_of(8); + // 2) Generate the variable-length public inputs (kernel procedure digests) let kernel_procedures_digests = generate_kernel_procedures_digests(&mut rng, num_kernel_proc_digests); // 3) Generate the auxiliary randomness - let auxiliary_rand_values: [u64; 4] = array::from_fn(|_| rng.next_u64()); // 4) Build the advice stack - - let mut advice_stack = vec![num_elements_kernel_proc_digests as u64]; - advice_stack.extend_from_slice(&fixed_length_public_inputs); + let mut advice_stack = fixed_length_public_inputs.clone(); + advice_stack.push(num_kernel_proc_digests as u64); advice_stack.extend_from_slice(&kernel_procedures_digests); advice_stack.extend_from_slice(&auxiliary_rand_values); - advice_stack.push(num_kernel_proc_digests as u64); - - // 5) Compute the expected randomness-reduced value of all the kernel procedures digests + // 5) Compute the expected reduced value let beta = QuadFelt::new([Felt::new(auxiliary_rand_values[0]), Felt::new(auxiliary_rand_values[1])]); let alpha = QuadFelt::new([Felt::new(auxiliary_rand_values[2]), Felt::new(auxiliary_rand_values[3])]); - let reduced_value_inv = - reduce_kernel_procedures_digests(&kernel_procedures_digests, alpha, beta).inv(); - let [reduced_value_inv_0, reduced_value_inv_1] = reduced_value_inv.to_base_elements(); - // 6) Run the test + let reduced_value = reduce_kernel_procedures_digests(&kernel_procedures_digests, alpha, beta); + let coeffs: &[Felt] = reduced_value.as_basis_coefficients_slice(); - let source = format!( - " + // 6) Run process_public_inputs and verify the reduced value in memory + let source = " use miden::core::stark::random_coin use miden::core::stark::constants use miden::core::sys::vm::public_inputs begin - # 1) Initialize the FS transcript exec.random_coin::init_seed - # => [C, ...] - - # 2) Process the public inputs exec.public_inputs::process_public_inputs - # => [...] - - # 3) Load the reduced value of all kernel procedures digests - # Note that the memory layout is as follows: - # [..., a_0, ..., a_[m-1], b_0, b_1, 0, 0, alpha0, alpha1, beta0, beta1, OOD-evaluations-start, ...] - # - # where: - # - # i) [a_0, ..., a[m-1]] are the fixed length public inputs, - # ii) [b_0, b_1] is the reduced value of all kernel procedures digests, - # iii) [alpha0, alpha1, beta0, beta1] is the auxiliary randomness, - # iv) [OOD-evaluations-start, ...] the start of the section that will hold the OOD evaluations, - # - # Note that [b_0, b_1, 0, 0, alpha0, alpha1, beta0, beta1, OOD-evaluations-start, ...] will hold temporarily - # the kernel procedures digests, but there will be later on overwritten by the reduced value, the auxiliary - # randomness, and the OOD evaluations. - padw - exec.constants::ood_evaluations_ptr - sub.8 - mem_loadw_be - - # 4) Compare with the expected result, including the padding - push.{reduced_value_inv_0} - push.{reduced_value_inv_1} - push.0.0 - eqw assert - - # 5) Clean up the stack - dropw dropw end - " - ); + "; let test = build_test!(source, &initial_stack, &advice_stack); - test.expect_stack(&[]); -} - -#[test] -fn generate_query_indices() { - let source = TEST_RANDOM_INDICES_GENERATION; - - let num_queries = 27; - let lde_log_size = 18; - let lde_size = 1 << lde_log_size; - - let input_stack = vec![num_queries as u64, lde_log_size as u64, lde_size as u64]; - - let seed = Word::default(); - let mut coin = RandomCoin::new(seed); - let indices = coin - .draw_integers(num_queries, lde_size, 0) - .expect("should not fail to generate the indices"); - - let advice_stack: Vec = indices.iter().rev().map(|index| *index as u64).collect(); - - let test = build_test!(source, &input_stack, &advice_stack); - - test.expect_stack(&[]); -} - -proptest! { - #[test] - fn generate_query_indices_proptest(num_queries in 7..150_usize, lde_log_size in 9..32_usize) { - let source = TEST_RANDOM_INDICES_GENERATION; - let lde_size = 1 << lde_log_size; - - let seed = Word::default(); - let mut coin = RandomCoin::new(seed); - let indices = coin - .draw_integers(num_queries, lde_size, 0) - .expect("should not fail to generate the indices"); - let advice_stack: Vec = indices.iter().rev().map(|index| *index as u64).collect(); - - let input_stack = vec![num_queries as u64, lde_log_size as u64, lde_size as u64]; - let test = build_test!(source, &input_stack, &advice_stack); - test.prop_expect_stack(&[])?; - } + let (output, _host) = test.execute_for_output().expect("execution failed"); + + use miden_processor::ContextId; + let ctx = ContextId::root(); + + // Read reduced kernel value from var_len_ptr (in ACE READ section) + let var_len_addr_ptr = 3223322666_u32; // VARIABLE_LEN_PUBLIC_INPUTS_ADDRESS_PTR + let var_len_ptr = output + .memory + .read_element(ctx, Felt::from_u32(var_len_addr_ptr)) + .unwrap() + .as_canonical_u64() as u32; + let masm_0 = output.memory.read_element(ctx, Felt::from_u32(var_len_ptr)).unwrap(); + let masm_1 = output.memory.read_element(ctx, Felt::from_u32(var_len_ptr + 1)).unwrap(); + + assert_eq!( + masm_0.as_canonical_u64(), + coeffs[0].as_canonical_u64(), + "kernel_reduced coord 0 mismatch (nk={num_kernel_proc_digests})" + ); + assert_eq!( + masm_1.as_canonical_u64(), + coeffs[1].as_canonical_u64(), + "kernel_reduced coord 1 mismatch (nk={num_kernel_proc_digests})" + ); } // HELPERS @@ -305,26 +316,24 @@ fn reduce_kernel_procedures_digests( fn reduce_digest(digest: &[u64], alpha: QuadFelt, beta: QuadFelt) -> QuadFelt { const KERNEL_OP_LABEL: Felt = Felt::new(48); - alpha - + KERNEL_OP_LABEL.into() + // gamma = beta^MAX_MESSAGE_WIDTH = beta^16 + let gamma = (0..16).fold(QuadFelt::ONE, |acc, _| acc * beta); + // CHIPLETS_BUS = 0, so bus_prefix = alpha + (0+1) * gamma = alpha + gamma + let bus_prefix = alpha + gamma; + bus_prefix + + QuadFelt::from(KERNEL_OP_LABEL) + beta * digest .iter() - .fold(QuadFelt::ZERO, |acc, coef| acc * beta + QuadFelt::from(*coef)) + .fold(QuadFelt::ZERO, |acc, coef| acc * beta + QuadFelt::from(Felt::new(*coef))) } // CONSTANTS // =============================================================================================== -const KERNEL_ODD_NUM_PROC: &str = r#" +const KERNEL_SINGLE_PROC: &str = r#" pub proc foo add - end - pub proc bar - div - end - pub proc baz - mul end"#; const KERNEL_EVEN_NUM_PROC: &str = r#" @@ -335,60 +344,13 @@ const KERNEL_EVEN_NUM_PROC: &str = r#" div end"#; -const TEST_RANDOM_INDICES_GENERATION: &str = r#" - const QUERY_ADDRESS = 1024 - - use miden::core::stark::random_coin - use miden::core::stark::constants - - begin - exec.constants::set_lde_domain_size - exec.constants::set_lde_domain_log_size - exec.constants::set_number_queries - push.QUERY_ADDRESS exec.constants::set_fri_queries_address - - exec.random_coin::load_random_coin_state - hperm - hperm - exec.random_coin::store_random_coin_state - - exec.random_coin::generate_list_indices - - exec.constants::get_lde_domain_log_size - exec.constants::get_number_queries neg - push.QUERY_ADDRESS - # => [query_ptr, loop_counter, lde_size_log, ...] - - push.1 - while.true - dup add.3 mem_load - movdn.3 - # => [query_ptr, loop_counter, lde_size_log, query_index, ...] - dup - add.2 mem_load - dup.3 assert_eq - - add.4 - # => [query_ptr + 4, loop_counter, lde_size_log, query_index, ...] - - swap add.1 swap - # => [query_ptr + 4, loop_counter, lde_size_log, query_index, ...] - - dup.1 neq.0 - # => [?, query_ptr + 4, loop_counter + 1, lde_size_log, query_index, ...] - end - drop drop drop - - exec.constants::get_number_queries neg - push.1 - while.true - swap - adv_push.1 - assert_eq - add.1 - dup - neq.0 - end - drop +const KERNEL_ODD_NUM_PROC: &str = r#" + pub proc foo + add end - "#; + pub proc bar + div + end + pub proc baz + mul + end"#; diff --git a/crates/lib/core/tests/stark/verifier_recursive/channel.rs b/crates/lib/core/tests/stark/verifier_recursive/channel.rs deleted file mode 100644 index 3d504a0b18..0000000000 --- a/crates/lib/core/tests/stark/verifier_recursive/channel.rs +++ /dev/null @@ -1,433 +0,0 @@ -use alloc::vec::Vec; - -use miden_air::ProcessorAir; -use miden_core::{Felt, FieldElement, PrimeField64, QuadFelt, Word}; -use miden_utils_testing::{ - MerkleTreeVC, VerifierError, - crypto::{BatchMerkleProof, PartialMerkleTree, Poseidon2}, - group_slice_elements, -}; -use winter_air::{ - Air, - proof::{Proof, Queries, QuotientOodFrame, Table, TraceOodFrame}, -}; -use winter_fri::{VerifierChannel as FriVerifierChannel, folding::fold_positions}; - -type AdvMap = Vec<(Word, Vec)>; - -/// A view into a [Proof] for a computation structured to simulate an "interactive" channel. -/// -/// A channel is instantiated for a specific proof, which is parsed into structs over the -/// appropriate field (specified by type parameter `E`). This also validates that the proof is -/// well-formed in the context of the computation for the specified [Air]. -pub struct VerifierChannel { - // trace queries - trace_roots: Vec, - trace_queries: Option, - // constraint queries - constraint_root: Word, - constraint_queries: Option, - // FRI proof - fri_roots: Option>, - fri_layer_proofs: Vec>, - fri_layer_queries: Vec>, - fri_remainder: Option>, - fri_num_partitions: usize, - // out-of-domain frame - ood_trace_frame: Option>, - ood_constraint_evaluations: Option>, - // query proof-of-work - pow_nonce: u64, -} - -impl VerifierChannel { - // CONSTRUCTOR - // -------------------------------------------------------------------------------------------- - /// Creates and returns a new [VerifierChannel] initialized from the specified `proof`. - pub fn new(air: &ProcessorAir, proof: Proof) -> Result { - let Proof { - context, - commitments, - trace_queries, - constraint_queries, - ood_frame, - fri_proof, - pow_nonce, - num_unique_queries, - } = proof; - - // make AIR and proof base fields are the same - if Felt::get_modulus_le_bytes() != context.field_modulus_bytes() { - return Err(VerifierError::InconsistentBaseField); - } - - let num_trace_segments = air.trace_info().num_segments(); - let main_trace_width = air.trace_info().main_trace_width(); - let aux_trace_width = air.trace_info().aux_segment_width(); - let lde_domain_size = air.lde_domain_size(); - let fri_options = air.options().to_fri_options(); - let constraint_frame_width = air.context().num_constraint_composition_columns(); - - // --- parse commitments ------------------------------------------------------------------ - let (trace_roots, constraint_root, fri_roots) = commitments - .parse::(num_trace_segments, fri_options.num_fri_layers(lde_domain_size)) - .map_err(|err| VerifierError::ProofDeserializationError(err.to_string()))?; - // --- parse trace and constraint queries ------------------------------------------------- - let trace_queries = TraceQueries::new(trace_queries, air, num_unique_queries as usize)?; - let constraint_queries = - ConstraintQueries::new(constraint_queries, air, num_unique_queries as usize)?; - - // --- parse FRI proofs ------------------------------------------------------------------- - let fri_num_partitions = fri_proof.num_partitions(); - let fri_remainder = fri_proof - .parse_remainder() - .map_err(|err| VerifierError::ProofDeserializationError(err.to_string()))?; - let (fri_layer_queries, fri_layer_proofs) = fri_proof - .parse_layers::>( - lde_domain_size, - fri_options.folding_factor(), - ) - .map_err(|err| VerifierError::ProofDeserializationError(err.to_string()))?; - - // --- parse out-of-domain evaluation frame ----------------------------------------------- - let (ood_trace_evaluations, ood_constraint_evaluations) = ood_frame - .parse(main_trace_width, aux_trace_width, constraint_frame_width) - .map_err(|err| VerifierError::ProofDeserializationError(err.to_string()))?; - - Ok(VerifierChannel { - // trace queries - trace_roots, - trace_queries: Some(trace_queries), - // constraint queries - constraint_root, - constraint_queries: Some(constraint_queries), - // FRI proof - fri_roots: Some(fri_roots), - fri_layer_proofs, - fri_layer_queries, - fri_remainder: Some(fri_remainder), - fri_num_partitions, - // out-of-domain evaluation - ood_trace_frame: Some(ood_trace_evaluations), - ood_constraint_evaluations: Some(ood_constraint_evaluations), - // query seed - pow_nonce, - }) - } - - // DATA READERS - // -------------------------------------------------------------------------------------------- - - /// Returns execution trace commitments sent by the prover. - /// - /// For computations requiring multiple trace segment, the returned slice will contain a - /// commitment for each trace segment. - pub fn read_trace_commitments(&self) -> &[Word] { - &self.trace_roots - } - - /// Returns constraint evaluation commitment sent by the prover. - pub fn read_constraint_commitment(&self) -> Word { - self.constraint_root - } - - /// Returns trace polynomial evaluations at out-of-domain points z and z * g, where g is the - /// generator of the LDE domain. - /// - /// For computations requiring multiple trace segments, evaluations of auxiliary trace - /// polynomials are also included as the second value of the returned tuple. Otherwise, the - /// second value is None. - pub fn read_ood_trace_frame(&mut self) -> TraceOodFrame { - self.ood_trace_frame.take().expect("already read") - } - - /// Returns evaluations of composition polynomial columns at z, where z is the out-of-domain - /// point. - pub fn read_ood_constraint_evaluations(&mut self) -> QuotientOodFrame { - self.ood_constraint_evaluations.take().expect("already read") - } - - /// Returns query proof-of-work nonce sent by the prover. - pub fn read_pow_nonce(&self) -> u64 { - self.pow_nonce - } - - /// Returns trace states at the specified positions of the LDE domain. This also checks if - /// the trace states are valid against the trace commitment sent by the prover. - /// - /// For computations requiring multiple trace segments, trace states for auxiliary segments - /// are also included as the second value of the returned tuple (trace states for all auxiliary - /// segments are merged into a single table). Otherwise, the second value is None. - pub fn read_queried_trace_states( - &mut self, - positions: &[usize], - ) -> Result<(AdvMap, Vec), VerifierError> { - let queries = self.trace_queries.take().expect("already read"); - let proofs = queries.query_proofs; - let main_queries = queries.main_states; - let aux_queries = queries.aux_states; - let main_queries_vec: Vec> = main_queries.rows().map(|a| a.to_owned()).collect(); - - let aux_queries_vec: Vec> = aux_queries - .as_ref() - .unwrap() - .rows() - .map(|a| QuadFelt::slice_as_base_elements(a).to_vec()) - .collect(); - - let (main_trace_pmt, mut main_trace_adv_map) = - unbatch_to_partial_mt(positions.to_vec(), main_queries_vec, proofs[0].clone()); - let (aux_trace_pmt, mut aux_trace_adv_map) = - unbatch_to_partial_mt(positions.to_vec(), aux_queries_vec, proofs[1].clone()); - - let mut trees = vec![main_trace_pmt]; - trees.push(aux_trace_pmt); - - main_trace_adv_map.append(&mut aux_trace_adv_map); - Ok((main_trace_adv_map, trees)) - } - - /// Returns constraint evaluations at the specified positions of the LDE domain. This also - /// checks if the constraint evaluations are valid against the constraint commitment sent by - /// the prover. - pub fn read_constraint_evaluations( - &mut self, - positions: &[usize], - ) -> Result<(AdvMap, PartialMerkleTree), VerifierError> { - let queries = self.constraint_queries.take().expect("already read"); - let proof = queries.query_proofs; - - let queries = queries - .evaluations - .rows() - .map(|a| QuadFelt::slice_as_base_elements(a).into()) - .collect(); - let (constraint_pmt, constraint_adv_map) = - unbatch_to_partial_mt(positions.to_vec(), queries, proof); - - Ok((constraint_adv_map, constraint_pmt)) - } - - /// Returns the FRI layers Merkle batch proofs. - pub fn fri_layer_proofs(&self) -> Vec> { - self.fri_layer_proofs.clone() - } - - /// Returns the unbatched Merkle proofs as well as a global key-value map for all the FRI layer - /// proofs. - pub fn unbatch_fri_layer_proofs( - &mut self, - positions_: &[usize], - domain_size: usize, - layer_commitments: Vec, - ) -> (Vec, Vec<(Word, Vec)>) { - let all_layers_queries = self.fri_layer_queries.clone(); - let mut current_domain_size = domain_size; - let mut positions = positions_.to_vec(); - let number_of_folds = layer_commitments.len() - 1; - - let mut global_adv_key_map = Vec::new(); - let mut global_partial_merkle_trees = Vec::new(); - let mut layer_proofs = self.fri_layer_proofs(); - for current_layer_queries in all_layers_queries.iter().take(number_of_folds) { - let mut folded_positions = fold_positions(&positions, current_domain_size, N); - - let layer_proof = layer_proofs.remove(0); - let queries: Vec<_> = group_slice_elements::(current_layer_queries) - .iter() - .map(|query| QuadFelt::slice_as_base_elements(query).to_vec()) - .collect(); - - let (current_partial_merkle_tree, mut cur_adv_key_map) = - unbatch_to_partial_mt(folded_positions.clone(), queries, layer_proof); - - global_partial_merkle_trees.push(current_partial_merkle_tree); - global_adv_key_map.append(&mut cur_adv_key_map); - - core::mem::swap(&mut positions, &mut folded_positions); - current_domain_size /= N; - } - - (global_partial_merkle_trees, global_adv_key_map) - } -} - -// FRI VERIFIER CHANNEL IMPLEMENTATION -// ================================================================================================ - -impl FriVerifierChannel for VerifierChannel { - type Hasher = Poseidon2; - type VectorCommitment = MerkleTreeVC; - - fn read_fri_num_partitions(&self) -> usize { - self.fri_num_partitions - } - - fn read_fri_layer_commitments(&mut self) -> Vec { - self.fri_roots.take().expect("already read") - } - - fn take_next_fri_layer_proof(&mut self) -> BatchMerkleProof { - self.fri_layer_proofs.remove(0) - } - - fn take_next_fri_layer_queries(&mut self) -> Vec { - self.fri_layer_queries.remove(0) - } - - fn take_fri_remainder(&mut self) -> Vec { - self.fri_remainder.take().expect("already read") - } -} - -// TRACE QUERIES -// ================================================================================================ - -/// Container of trace query data, including: -/// * Queried states for all trace segments. -/// * Merkle authentication paths for all queries. -/// -/// Trace states for all auxiliary segments are stored in a single table. -struct TraceQueries { - query_proofs: Vec>, - main_states: Table, - aux_states: Option>, -} - -impl TraceQueries { - /// Parses the provided trace queries into trace states in the specified field and - /// corresponding Merkle authentication paths. - pub fn new( - mut queries: Vec, - air: &ProcessorAir, - num_queries: usize, - ) -> Result { - // parse main trace segment queries; parsing also validates that hashes of each table row - // form the leaves of Merkle authentication paths in the proofs - let main_segment_width = air.trace_info().main_trace_width(); - let main_segment_queries = queries.remove(0); - let (main_segment_query_proofs, main_segment_states) = main_segment_queries - .parse::>( - air.lde_domain_size(), - num_queries, - main_segment_width, - ) - .map_err(|err| { - VerifierError::ProofDeserializationError(format!( - "main trace segment query deserialization failed: {err}" - )) - })?; - - // all query proofs will be aggregated into a single vector - let mut query_proofs = vec![main_segment_query_proofs]; - - // parse auxiliary trace segment queries (if any); parsing also validates that hashes of - // each table row form the leaves of Merkle authentication paths in the proofs - let aux_trace_states = if air.trace_info().is_multi_segment() { - assert_eq!(queries.len(), 1); - let segment_width = air.trace_info().aux_segment_width(); - let aux_segment_queries = queries.remove(0); - - let (segment_query_proof, segment_trace_states) = aux_segment_queries - .parse::>( - air.lde_domain_size(), - num_queries, - segment_width, - ) - .map_err(|err| { - VerifierError::ProofDeserializationError(format!( - "auxiliary trace segment query deserialization failed: {err}" - )) - })?; - - query_proofs.push(segment_query_proof); - - Some(segment_trace_states) - } else { - None - }; - - Ok(Self { - query_proofs, - main_states: main_segment_states, - aux_states: aux_trace_states, - }) - } -} - -// CONSTRAINT QUERIES -// ================================================================================================ - -/// Container of constraint evaluation query data, including: -/// * Queried constraint evaluation values. -/// * Merkle authentication paths for all queries. -struct ConstraintQueries { - query_proofs: BatchMerkleProof, - evaluations: Table, -} - -impl ConstraintQueries { - /// Parses the provided constraint queries into evaluations in the specified field and - /// corresponding Merkle authentication paths. - pub fn new( - queries: Queries, - air: &ProcessorAir, - num_queries: usize, - ) -> Result { - let (query_proofs, evaluations) = queries - .parse::>( - air.lde_domain_size(), - num_queries, - air.ce_blowup_factor(), - ) - .map_err(|err| { - VerifierError::ProofDeserializationError(format!( - "constraint evaluation query deserialization failed: {err}" - )) - })?; - - Ok(Self { query_proofs, evaluations }) - } -} - -// HELPER FUNCTIONS -// ================================================================================================ - -/// Takes a set of positions, query values of a trace at these positions and a Merkle batch proof -/// against a commitment to this trace, and outputs a partial Merkle tree with individual Merkle -/// paths for each position as well as a key-value map mapping the digests of the query values -/// (i.e. Merkle tree leaves) to their corresponding query values. -pub fn unbatch_to_partial_mt( - positions: Vec, - queries: Vec>, - proof: BatchMerkleProof, -) -> (PartialMerkleTree, Vec<(Word, Vec)>) { - // hash the query values in order to get the leaf - let leaves: Vec = queries.iter().map(|row| Poseidon2::hash_elements(row)).collect(); - - // use the computed leaves with the indices in order to unbatch the Merkle proof batch proof - let unbatched_proof = proof - .into_openings(&leaves, &positions) - .expect("failed to unbatch the batched Merkle proof"); - - // construct the partial Merkle tree data - let mut paths_with_leaves = vec![]; - for (position, merkle_proof) in positions.iter().zip(unbatched_proof.iter()) { - paths_with_leaves.push(( - *position as u64, - merkle_proof.0.to_owned(), - merkle_proof.1.to_owned().into(), - )) - } - - // construct the advice key map linking leaves to query values - let mut adv_key_map = Vec::new(); - leaves.into_iter().zip(queries.iter()).for_each(|(leaf, query_data)| { - adv_key_map.push((leaf, query_data.to_owned())); - }); - - ( - PartialMerkleTree::with_paths(paths_with_leaves).expect("should not fail from paths"), - adv_key_map, - ) -} diff --git a/crates/lib/core/tests/stark/verifier_recursive/mod.rs b/crates/lib/core/tests/stark/verifier_recursive/mod.rs index ea254f2389..d2cd4f8528 100644 --- a/crates/lib/core/tests/stark/verifier_recursive/mod.rs +++ b/crates/lib/core/tests/stark/verifier_recursive/mod.rs @@ -1,19 +1,45 @@ +//! Advice provision for the recursive STARK verifier. +//! +//! This module mirrors the Fiat-Shamir protocol implemented in MASM +//! (`crates/lib/core/asm/stark/`) on the Rust side. It deserializes a STARK proof, +//! replays the verifier transcript to extract commitments, challenges, and openings, +//! then packs them into the advice inputs (initial stack, advice stack, Merkle store, +//! and advice map) that the MASM recursive verifier consumes. +//! +//! The advice stack ordering must match the MASM consumption order exactly: +//! +//! security params (nq, query_pow, deep_pow, folding_pow) -> +//! fixed-length PI -> num_kernel_proc_digests -> kernel_digests -> +//! aux randomness -> main commit -> aux commit -> +//! aux finals -> quotient commit -> deep alpha ND -> OOD evals -> +//! DEEP PoW witness -> FRI rounds -> FRI remainder -> query PoW witness +//! +//! See `build_advice` for the authoritative layout. + use alloc::vec::Vec; -use miden_air::ProcessorAir; -use miden_core::{Felt, FieldElement, QuadFelt, ToElements, WORD_SIZE, Word}; -use miden_utils_testing::{ - MIN_STACK_DEPTH, VerifierError, - crypto::{MerkleStore, Poseidon2, RandomCoin}, -}; -use winter_air::{ - Air, - proof::{Proof, merge_ood_evaluations}, +use miden_air::{ProcessorAir, PublicInputs, config}; +use miden_core::{Felt, WORD_SIZE, Word, field::QuadFelt}; +use miden_crypto::{ + field::BasedVectorSpace, + stark::{ + StarkConfig, + air::AirInstance, + challenger::CanObserve, + fri::PcsTranscript, + lmcs::{BatchProof, Lmcs}, + proof::StarkTranscript, + verifier::VerifierError as CryptoVerifierError, + }, }; -use winter_fri::VerifierChannel as FriVerifierChannel; +use miden_utils_testing::crypto::{MerklePath, MerkleStore, PartialMerkleTree}; + +// TYPES +// ================================================================================================ -mod channel; -use channel::VerifierChannel; +type Challenge = QuadFelt; +type P2Config = config::Poseidon2Config; +type P2Lmcs = >::Lmcs; #[derive(Debug, Clone, Eq, PartialEq)] pub struct VerifierData { @@ -23,211 +49,385 @@ pub struct VerifierData { pub advice_map: Vec<(Word, Vec)>, } +#[derive(Debug, thiserror::Error)] +pub enum VerifierError { + #[error("proof deserialization error: {0}")] + ProofDeserializationError(String), + #[error("invalid proof shape: {0}")] + InvalidProofShape(&'static str), + #[error("transcript error: {0}")] + Transcript(#[from] CryptoVerifierError), +} + +/// Merkle store + advice map pair returned by Merkle data construction. +type MerkleAdvice = (MerkleStore, Vec<(Word, Vec)>); + +/// Partial trees + advice map entries returned by single batch proof conversion. +type BatchMerkleResult = (Vec, Vec<(Word, Vec)>); + +// PUBLIC API +// ================================================================================================ + +/// Deserialize a STARK proof and build the advice inputs for the MASM recursive verifier. pub fn generate_advice_inputs( - proof: Proof, - pub_inputs: ::PublicInputs, + proof_bytes: &[u8], + pub_inputs: PublicInputs, ) -> Result { - // we compute the number of procedures in the kernel - // the public inputs contain, in addition to the kernel procedure roots: - // - // 1. The input operand stack (16 field elements), - // 2. The output operand stack (16 field elements), - // 3. The program hash (4 field elements). - let pub_inputs_elements = pub_inputs.to_elements(); - let num_elements_pi = pub_inputs_elements.len(); - // note that since we are padding the fixed length inputs, in our case the program digest, to - // be double-word aligned, we have to subtract `2 * WORD_SIZE` instead of `WORD_SIZE` for - // the program digest - let digests_elements = num_elements_pi - MIN_STACK_DEPTH * 2 - 2 * WORD_SIZE; - assert_eq!(digests_elements % WORD_SIZE, 0); - let num_kernel_procedures_digests = digests_elements / (2 * WORD_SIZE); - - // we need to provide the following instance specific data through the operand stack - let initial_stack = vec![ - proof.context.options().grinding_factor() as u64, - proof.context.options().num_queries() as u64, - proof.context.trace_info().length().ilog2() as u64, - ]; - - // build a seed for the public coin; the initial seed is the hash of public inputs and proof - // context, but as the protocol progresses, the coin will be reseeded with the info received - // from the prover - let mut advice_stack = vec![digests_elements as u64]; - let mut public_coin_seed = proof.context.to_elements(); - public_coin_seed.extend_from_slice(&pub_inputs_elements); - - // add the public inputs, which is nothing but the input and output stacks to the VM as well as - // the digests of the procedures making up the kernel against which the program was compiled, - // to the advice tape - let pub_inputs_int: Vec = - pub_inputs_elements.iter().map(|a| a.as_canonical_u64()).collect(); - advice_stack.extend_from_slice(&pub_inputs_int); - - // add a placeholder for the auxiliary randomness - let aux_rand_insertion_index = advice_stack.len(); - advice_stack.extend_from_slice(&[0, 0, 0, 0]); - advice_stack.push(num_kernel_procedures_digests as u64); - - // create AIR instance for the computation specified in the proof - let air = ProcessorAir::new(proof.trace_info().to_owned(), pub_inputs, proof.options().clone()); - let seed_digest = Poseidon2::hash_elements(&public_coin_seed); - let mut public_coin: RandomCoin = RandomCoin::new(seed_digest); - let mut channel = VerifierChannel::new(&air, proof)?; - - // 1 ----- main segment trace ----------------------------------------------------------------- - let trace_commitments = channel.read_trace_commitments(); - - // reseed the coin with the commitment to the main segment trace - public_coin.reseed(trace_commitments[0]); - advice_stack.extend_from_slice(&digest_to_int_vec(trace_commitments)); - - // 2 ----- auxiliary segment trace ------------------------------------------------------------ - - // generate the auxiliary random elements - let mut aux_trace_rand_elements = vec![]; - for commitment in trace_commitments.iter().skip(1) { - let rand_elements: Vec = air - .get_aux_rand_elements(&mut public_coin) - .map_err(|_| VerifierError::RandomCoinError)? - .rand_elements() - .to_vec(); - aux_trace_rand_elements.push(rand_elements); - public_coin.reseed(*commitment); - } + let params = config::pcs_params(); + let config = config::poseidon2_config(params); + + // 1. Deserialize (log_trace_height, transcript_data) from proof bytes. + let (log_trace_height, transcript_data): (u8, _) = bincode::deserialize(proof_bytes) + .map_err(|e| VerifierError::ProofDeserializationError(e.to_string()))?; + let log_trace_height = log_trace_height as usize; + + // 2. Build domain-separated challenger, then observe public values. + let (public_values, kernel_felts) = pub_inputs.to_air_inputs(); + let mut challenger = config.challenger(); + config::observe_protocol_params(&mut challenger, log_trace_height as u64); + challenger.observe_slice(&public_values); + let var_len_public_inputs: &[&[Felt]] = &[&kernel_felts]; + config::observe_var_len_public_inputs(&mut challenger, var_len_public_inputs, &[WORD_SIZE]); + + // 3. Build AIR instance. + let air = ProcessorAir; + let instance = AirInstance { + log_trace_height: log_trace_height as u8, + public_values: &public_values, + var_len_public_inputs, + }; + + // 4. Parse STARK transcript (mirrors Fiat-Shamir protocol). + let (stark, _digest) = + StarkTranscript::from_proof(&config, &[(&air, instance)], &transcript_data, challenger)?; + + // 5. Reconstruct kernel digests as Words for advice building. + let kernel_digests: Vec = kernel_felts + .chunks_exact(4) + .map(|c| Word::new([c[0], c[1], c[2], c[3]])) + .collect(); + + // 6. Build advice from parsed transcript. + build_advice(&config, &stark, log_trace_height, pub_inputs, &kernel_digests) +} - let alpha = aux_trace_rand_elements[0][0].to_owned(); - let beta = aux_trace_rand_elements[0][2].to_owned(); - advice_stack[aux_rand_insertion_index] = QuadFelt::base_element(&beta, 0).as_canonical_u64(); - advice_stack[aux_rand_insertion_index + 1] = - QuadFelt::base_element(&beta, 1).as_canonical_u64(); - advice_stack[aux_rand_insertion_index + 2] = - QuadFelt::base_element(&alpha, 0).as_canonical_u64(); - advice_stack[aux_rand_insertion_index + 3] = - QuadFelt::base_element(&alpha, 1).as_canonical_u64(); - - // 3 ----- constraint composition trace ------------------------------------------------------- - - // build random coefficients for the composition polynomial. we don't need them but we have to - // generate them in order to update the random coin - let _constraint_coeffs: winter_air::ConstraintCompositionCoefficients = air - .get_constraint_composition_coefficients(&mut public_coin) - .map_err(|_| VerifierError::RandomCoinError)?; - - let constraint_commitment = channel.read_constraint_commitment(); - advice_stack.extend_from_slice(&digest_to_int_vec(&[constraint_commitment])); - public_coin.reseed(constraint_commitment); - - // 4 ----- OOD frames -------------------------------------------------------------- - - // generate the the OOD point - let _z: QuadFelt = public_coin.draw().unwrap(); - - // read the main and auxiliary segments' OOD frames and add them to advice tape - let ood_trace_frame = channel.read_ood_trace_frame(); - let ood_constraint_evaluations = channel.read_ood_constraint_evaluations(); - let ood_evals = merge_ood_evaluations(&ood_trace_frame, &ood_constraint_evaluations); - - // placeholder for the alpha_deep - let alpha_deep_index = advice_stack.len(); - advice_stack.extend_from_slice(&[0, 0]); - - // add OOD evaluations to advice stack - advice_stack.extend_from_slice(&to_int_vec(&ood_evals)); - - // reseed with the digest of the OOD evaluations - let ood_digest = Poseidon2::hash_elements(&ood_evals); - public_coin.reseed(ood_digest); - - // 5 ----- FRI ------------------------------------------------------------------------------- - - // read the FRI layer commitments as well as remainder polynomial - let fri_commitments_digests = channel.read_fri_layer_commitments(); - let poly = channel.read_remainder().unwrap(); - - // add the above to the advice tape - let fri_commitments: Vec = digest_to_int_vec(&fri_commitments_digests); - advice_stack.extend_from_slice(&fri_commitments); - advice_stack.extend_from_slice(&to_int_vec(&poly)); - - // reseed with FRI layer commitments - let deep_coefficients = air - .get_deep_composition_coefficients::(&mut public_coin) - .map_err(|_| VerifierError::RandomCoinError)?; - - // since we are using Horner batching, the randomness will be located in the penultimate - // position, the last position holds the constant `1` - assert_eq!( - deep_coefficients.constraints[deep_coefficients.constraints.len() - 1], - QuadFelt::ONE +// ADVICE CONSTRUCTION +// ================================================================================================ + +/// Packs the parsed STARK transcript into the advice inputs consumed by the MASM verifier. +/// +/// The initial operand stack receives `[log_trace_height]`. +/// The advice stack receives security parameters first, then all remaining data +/// in the order listed in the module doc. +fn build_advice( + config: &P2Config, + stark: &StarkTranscript, + log_trace_height: usize, + pub_inputs: PublicInputs, + kernel_digests: &[Word], +) -> Result { + let pcs = &stark.pcs_transcript; + + // --- initial stack --- + // Only log(trace_length) is on the operand stack. Security parameters are on the advice stack. + let initial_stack = vec![log_trace_height as u64]; + + // --- advice stack --- + let mut advice_stack = Vec::new(); + + // 0. Security parameters: [num_queries, query_pow_bits, deep_pow_bits, folding_pow_bits]. + // Consumed first by load_security_params in the specific verifier. num_queries is the + // configured protocol parameter, not the potentially deduplicated count (e.g. + // tree_indices.len()) + let params = config::pcs_params(); + let num_queries = params.num_queries(); + advice_stack.push(num_queries as u64); + advice_stack.push(params.query_pow_bits() as u64); + // DEEP and folding PoW bits are not publicly exposed on PcsParams; + // use the constants from air/src/config.rs directly. + advice_stack.push(config::DEEP_POW_BITS as u64); + advice_stack.push(config::FOLDING_POW_BITS as u64); + + // 1. Fixed-length public inputs. + let fixed_len_inputs = build_fixed_len_inputs(&pub_inputs); + advice_stack.extend_from_slice(&fixed_len_inputs); + + // 2. Number of kernel procedure digests. + let num_kernel_proc_digests = kernel_digests.len(); + advice_stack.push(num_kernel_proc_digests as u64); + + // 3. Kernel procedure digest elements (each digest padded to 8 elements, reversed). + let kernel_advice = build_kernel_digest_advice(kernel_digests); + advice_stack.extend_from_slice(&kernel_advice); + + // 4. Auxiliary randomness [beta0, beta1, alpha0, alpha1]. + assert!( + stark.randomness.len() >= 2, + "expected at least 2 randomness challenges (alpha, beta), got {}", + stark.randomness.len() ); - let alpha_deep = deep_coefficients.constraints[deep_coefficients.constraints.len() - 2]; - advice_stack[alpha_deep_index] = alpha_deep.base_element(0).as_canonical_u64(); - advice_stack[alpha_deep_index + 1] = alpha_deep.base_element(1).as_canonical_u64(); - - let layer_commitments = fri_commitments_digests.clone(); - for commitment in layer_commitments.iter() { - public_coin.reseed(*commitment); - let _alpha: QuadFelt = public_coin.draw().expect("failed to draw random indices"); + let alpha = stark.randomness[0]; + let beta = stark.randomness[1]; + let beta_coeffs: &[Felt] = beta.as_basis_coefficients_slice(); + let alpha_coeffs: &[Felt] = alpha.as_basis_coefficients_slice(); + advice_stack.extend_from_slice(&[ + beta_coeffs[0].as_canonical_u64(), + beta_coeffs[1].as_canonical_u64(), + alpha_coeffs[0].as_canonical_u64(), + alpha_coeffs[1].as_canonical_u64(), + ]); + + // 5. Main trace commitment (4 felts). + advice_stack.extend_from_slice(&commitment_to_u64s(stark.main_commit)); + + // 6. Aux trace commitment. + advice_stack.extend_from_slice(&commitment_to_u64s(stark.aux_commit)); + + // 7. Aux finals (bus boundary values). + if !stark.all_aux_values.is_empty() { + let aux_values = &stark.all_aux_values[0]; + advice_stack.extend_from_slice(&challenges_to_u64s(aux_values)); } - // 6 ----- trace and constraint queries ------------------------------------------------------- - - // read proof-of-work nonce sent by the prover and draw pseudo-random query positions for - // the LDE domain from the public coin - let pow_nonce = channel.read_pow_nonce(); - let mut query_positions = public_coin - .draw_integers(air.options().num_queries(), air.lde_domain_size(), pow_nonce) - .map_err(|_| VerifierError::RandomCoinError)?; - advice_stack.extend_from_slice(&[pow_nonce]); - query_positions.sort(); - query_positions.dedup(); - - // read advice maps and Merkle paths of the queries to main/aux and constraint composition - // traces - let (mut main_aux_adv_map, mut partial_trees_traces) = - channel.read_queried_trace_states(&query_positions)?; - let (mut constraint_adv_map, partial_tree_constraint) = - channel.read_constraint_evaluations(&query_positions)?; - - let (mut partial_trees_fri, mut fri_adv_map) = channel.unbatch_fri_layer_proofs::<4>( - &query_positions, - air.lde_domain_size(), - fri_commitments_digests, - ); + // 8. Quotient commitment. + advice_stack.extend_from_slice(&commitment_to_u64s(stark.quotient_commit)); - // consolidate advice maps - main_aux_adv_map.append(&mut constraint_adv_map); - main_aux_adv_map.append(&mut fri_adv_map); + // 9. Deep alpha (2 felts) -- the DEEP column-batching challenge. + let deep_alpha = pcs.deep_transcript.challenge_columns; + let deep_coeffs: &[Felt] = deep_alpha.as_basis_coefficients_slice(); + advice_stack + .extend_from_slice(&[deep_coeffs[1].as_canonical_u64(), deep_coeffs[0].as_canonical_u64()]); - // build the full MerkleStore - partial_trees_fri.append(&mut partial_trees_traces); - partial_trees_fri.push(partial_tree_constraint); - let mut store = MerkleStore::new(); - for partial_tree in &partial_trees_fri { - store.extend(partial_tree.inner_nodes()); + // 10. OOD evaluations. + append_ood_evaluations(&mut advice_stack, pcs); + + // 11. DEEP PoW witness. + advice_stack.push(pcs.deep_transcript.pow_witness.as_canonical_u64()); + + // 12. FRI layer commitments + per-round PoW witnesses. + for round in &pcs.fri_transcript.rounds { + advice_stack.extend_from_slice(&commitment_to_u64s(round.commitment)); + advice_stack.push(round.pow_witness.as_canonical_u64()); } + // 13. FRI remainder polynomial (already in descending degree order from the prover, matching + // the order observed into the Fiat-Shamir transcript). + let final_poly = &pcs.fri_transcript.final_poly; + let remainder_base: Vec = QuadFelt::flatten_to_base(final_poly.to_vec()); + let remainder_u64s: Vec = remainder_base.iter().map(|f| f.as_canonical_u64()).collect(); + advice_stack.extend_from_slice(&remainder_u64s); + + // 14. Query PoW witness. + advice_stack.push(pcs.query_pow_witness.as_canonical_u64()); + + // --- Merkle data --- + let (store, advice_map) = build_merkle_data(config, stark, log_trace_height)?; + Ok(VerifierData { initial_stack, advice_stack, store, - advice_map: main_aux_adv_map, + advice_map, }) } -// HELPER FUNCTIONS +// OOD EVALUATIONS +// ================================================================================================ + +/// Flatten OOD evaluations into the advice stack. +/// +/// The DEEP transcript contains evaluations at two points (z and z*g) for each committed +/// matrix (main, aux, quotient). We split them into local (at z) and next (at z*g) rows, +/// then append local followed by next. +fn append_ood_evaluations(advice_stack: &mut Vec, pcs: &PcsTranscript) +where + L: Lmcs, +{ + let evals = &pcs.deep_transcript.evals; + let mut local_values = Vec::new(); + let mut next_values = Vec::new(); + + for group in evals { + for matrix in group { + let width = matrix.width; + let values = matrix.values.as_slice(); + let local_row = &values[..width]; + let next_row = if values.len() > width { + &values[width..2 * width] + } else { + &[] + }; + local_values.extend_from_slice(local_row); + next_values.extend_from_slice(next_row); + } + } + + advice_stack.extend_from_slice(&challenges_to_u64s(&local_values)); + advice_stack.extend_from_slice(&challenges_to_u64s(&next_values)); +} + +// MERKLE DATA +// ================================================================================================ + +/// Build Merkle store and advice map from the DEEP and FRI opening proofs. +/// +/// Each opening proof is converted into a `PartialMerkleTree` (for the Merkle store) +/// and leaf-hash -> leaf-data entries (for the advice map). The MASM verifier uses +/// `mtree_get` to fetch authentication paths and `adv_keyval` to retrieve leaf data. +fn build_merkle_data( + config: &P2Config, + stark: &StarkTranscript, + log_trace_height: usize, +) -> Result { + let pcs = &stark.pcs_transcript; + let lmcs = config.lmcs(); + let log_blowup = config::pcs_params().log_blowup() as usize; + let log_lde_height = log_trace_height + log_blowup; + + let mut partial_trees = Vec::new(); + let mut advice_map = Vec::new(); + + // DEEP openings -- one BatchProof per commitment (main, aux, quotient). + for batch_proof in pcs.deep_openings.iter() { + let (trees, advs) = + batch_proof_to_merkle(lmcs, batch_proof, log_lde_height, &pcs.tree_indices)?; + partial_trees.extend(trees); + advice_map.extend(advs); + } + + // FRI openings -- one BatchProof per FRI round. + let log_arity = config::LOG_FOLDING_ARITY as usize; + for (round_idx, batch_proof) in pcs.fri_openings.iter().enumerate() { + let log_folded = log_arity * (round_idx + 1); + let round_indices: Vec = + pcs.tree_indices.iter().map(|&idx| idx >> log_folded).collect(); + let fri_log_height = log_lde_height - log_folded; + let (trees, advs) = + batch_proof_to_merkle(lmcs, batch_proof, fri_log_height, &round_indices)?; + partial_trees.extend(trees); + advice_map.extend(advs); + } + + let mut store = MerkleStore::new(); + for tree in &partial_trees { + store.extend(tree.inner_nodes()); + } + + Ok((store, advice_map)) +} + +/// Convert a `BatchProof` into `PartialMerkleTree` entries and advice map entries. +/// +/// For each query index, reconstructs the Merkle authentication path from the batch proof, +/// computes the leaf hash, and produces: +/// - A `(index, leaf_hash, path)` triple for the partial Merkle tree +/// - A `(leaf_hash, leaf_data)` pair for the advice map +fn batch_proof_to_merkle( + lmcs: &L, + batch_proof: &L::BatchProof, + log_height: usize, + query_indices: &[usize], +) -> Result +where + L: Lmcs, + L::Commitment: Copy + Into<[Felt; 4]>, + L::BatchProof: AsLmcsBatchProof, + L::Commitment: PartialEq, +{ + let batch = batch_proof.as_batch_proof(); + + let widths = infer_widths(batch); + let single_proofs = batch + .single_proofs(lmcs, &widths, log_height as u8) + .ok_or(VerifierError::InvalidProofShape("failed to reconstruct merkle paths"))?; + + let mut paths = Vec::new(); + let mut advice_entries = Vec::new(); + + for &index in query_indices { + let proof = single_proofs + .get(&index) + .ok_or(VerifierError::InvalidProofShape("missing opening for query index"))?; + + let leaf_data: Vec = proof.rows.as_slice().to_vec(); + let leaf_hash = lmcs.hash(proof.rows.iter_rows()); + let leaf_word: Word = Word::new(leaf_hash.into()); + let merkle_path = + MerklePath::new(proof.siblings.iter().map(|c| Word::new((*c).into())).collect()); + + paths.push((index as u64, leaf_word, merkle_path)); + advice_entries.push((leaf_word, leaf_data)); + } + + let tree = PartialMerkleTree::with_paths(paths) + .map_err(|_| VerifierError::InvalidProofShape("invalid merkle paths"))?; + + Ok((vec![tree], advice_entries)) +} + +// BATCH PROOF TRAIT // ================================================================================================ -pub fn digest_to_int_vec(digest: &[Word]) -> Vec { - digest - .iter() - .flat_map(|digest| digest.as_elements().iter().map(|e| e.as_canonical_u64())) - .collect() +/// Trait to access `BatchProof` fields generically through the `Lmcs::BatchProof` associated type. +pub trait AsLmcsBatchProof { + fn as_batch_proof(&self) -> &BatchProof; +} + +impl AsLmcsBatchProof for BatchProof { + fn as_batch_proof(&self) -> &BatchProof { + self + } +} + +// HELPERS +// ================================================================================================ + +fn infer_widths(batch: &BatchProof) -> Vec { + batch + .openings + .values() + .next() + .map(|opening| opening.rows.iter_rows().map(|row| row.len()).collect()) + .unwrap_or_default() +} + +/// Build kernel digest advice data. +/// +/// Each digest (4 elements) is padded to 8 elements with zeros, then reversed. This matches +/// the format used by the MASM `reduce_kernel_digests` procedure which uses `mem_stream` + +/// `horner_eval_base` to process digests in 8-element chunks. +fn build_kernel_digest_advice(kernel_digests: &[Word]) -> Vec { + let mut result = Vec::with_capacity(kernel_digests.len() * 8); + for digest in kernel_digests { + let mut padded: Vec = + digest.as_elements().iter().map(|f| f.as_canonical_u64()).collect(); + padded.resize(8, 0); + padded.reverse(); + result.extend_from_slice(&padded); + } + result +} + +/// Build the fixed-length public inputs in the order the MASM random coin observes them. +/// +/// Must stay in sync with `PublicInputs::to_air_inputs()`. +fn build_fixed_len_inputs(pub_inputs: &PublicInputs) -> Vec { + let mut felts = Vec::::new(); + felts.extend_from_slice(pub_inputs.program_info().program_hash().as_elements()); + felts.extend_from_slice(pub_inputs.stack_inputs().as_ref()); + felts.extend_from_slice(pub_inputs.stack_outputs().as_ref()); + felts.extend_from_slice(pub_inputs.pc_transcript_state().as_ref()); + let mut fixed_len: Vec = felts.iter().map(|f| f.as_canonical_u64()).collect(); + fixed_len.resize(fixed_len.len().next_multiple_of(8), 0); + fixed_len +} + +fn commitment_to_u64s>(commitment: C) -> Vec { + let felts: [Felt; 4] = commitment.into(); + felts.iter().map(|f| f.as_canonical_u64()).collect() } -pub fn to_int_vec(ext_felts: &[QuadFelt]) -> Vec { - QuadFelt::slice_as_base_elements(ext_felts) - .iter() - .map(|e| e.as_canonical_u64()) - .collect() +fn challenges_to_u64s(challenges: &[Challenge]) -> Vec { + let base: Vec = QuadFelt::flatten_to_base(challenges.to_vec()); + base.iter().map(|f| f.as_canonical_u64()).collect() } diff --git a/crates/lib/core/tests/stark_asserts/mod.rs b/crates/lib/core/tests/stark_asserts/mod.rs index 8470390e9f..74294befe2 100644 --- a/crates/lib/core/tests/stark_asserts/mod.rs +++ b/crates/lib/core/tests/stark_asserts/mod.rs @@ -1,39 +1,83 @@ +// ---- validate_inputs tests ---- +// +// validate_inputs reads log(trace_length) from the stack and security parameters +// (num_queries, query_pow_bits, deep_pow_bits, folding_pow_bits) from memory. +// Tests must store the parameters in memory before calling validate_inputs. + +fn validate_inputs_source( + log_tl: u32, + num_queries: u32, + query_pow_bits: u32, + deep_pow_bits: u32, + folding_pow_bits: u32, +) -> String { + format!( + "use miden::core::stark::utils + use miden::core::stark::constants + begin + push.{num_queries} exec.constants::set_number_queries + push.{query_pow_bits} exec.constants::set_query_pow_bits + push.{deep_pow_bits} exec.constants::set_deep_pow_bits + push.{folding_pow_bits} exec.constants::set_folding_pow_bits + push.{log_tl} + exec.utils::validate_inputs + end" + ) +} + #[test] fn validate_inputs_trace_length_upper_bound() { - let test = build_test!(validate_inputs_source(), &[30, 7, 0]); + // log(trace_length) = 30 must be rejected (must be < 30) + let source = validate_inputs_source(30, 27, 0, 0, 16); + let test = build_test!(&source, &[]); expect_assert_error_message!(test); } #[test] fn validate_inputs_trace_length_lower_bound() { - let test = build_test!(validate_inputs_source(), &[5, 7, 0]); + // log(trace_length) = 5 must be rejected (must be > 5) + let source = validate_inputs_source(5, 27, 0, 0, 16); + let test = build_test!(&source, &[]); expect_assert_error_message!(test); } #[test] fn validate_inputs_num_queries_upper_bound() { - let test = build_test!(validate_inputs_source(), &[10, 151, 0]); + // num_queries = 151 must be rejected (must be < 151) + let source = validate_inputs_source(10, 151, 0, 0, 16); + let test = build_test!(&source, &[]); expect_assert_error_message!(test); } #[test] fn validate_inputs_num_queries_lower_bound() { - let test = build_test!(validate_inputs_source(), &[10, 6, 0]); + // num_queries = 6 must be rejected (must be > 6) + let source = validate_inputs_source(10, 6, 0, 0, 16); + let test = build_test!(&source, &[]); expect_assert_error_message!(test); } #[test] fn validate_inputs_grinding_upper_bound() { - let test = build_test!(validate_inputs_source(), &[10, 7, 32]); + // folding_pow_bits = 32 must be rejected (must be < 32) + let source = validate_inputs_source(10, 27, 0, 0, 32); + let test = build_test!(&source, &[]); expect_assert_error_message!(test); } +// ---- init_seed tests ---- +// +// init_seed expects: +// Stack: [log(trace_length), rd0, rd1, rd2, rd3, ...] +// Memory: num_queries, query_pow_bits, deep_pow_bits, folding_pow_bits + #[test] fn init_seed_trace_length_too_large_has_message() { + // log(trace_length) = 32 overflows u32 at pow2, triggering an assertion. let source = " use miden::core::stark::random_coin begin - push.0 push.0 push.0 push.0 push.7 push.32 + push.0.0.0.0 push.32 exec.random_coin::init_seed end "; @@ -58,24 +102,23 @@ fn generate_aux_randomness_mismatch_has_message() { #[test] fn check_pow_invalid_has_message() { + // Store query_pow_bits = 16 so check_pow actually exercises the PoW path. + // Use a valid log(trace_length) = 10 so init_seed succeeds. + // The advice nonce (0) will fail the PoW check. let source = " use miden::core::stark::random_coin + use miden::core::stark::constants begin - push.0 push.0 push.0 push.1 push.7 push.32 + push.27 exec.constants::set_number_queries + push.16 exec.constants::set_query_pow_bits + push.0 exec.constants::set_deep_pow_bits + push.16 exec.constants::set_folding_pow_bits + push.0.0.0.0 push.10 exec.random_coin::init_seed - exec.random_coin::check_pow + exec.random_coin::check_query_pow end "; let advice_stack = &[0_u64]; let test = build_test!(source, &[], advice_stack); expect_assert_error_message!(test); } - -fn validate_inputs_source() -> &'static str { - " - use miden::core::stark::utils - begin - exec.utils::validate_inputs - end - " -} diff --git a/crates/lib/core/tests/sys/mod.rs b/crates/lib/core/tests/sys/mod.rs index b039104d4a..2a66629c2d 100644 --- a/crates/lib/core/tests/sys/mod.rs +++ b/crates/lib/core/tests/sys/mod.rs @@ -13,7 +13,7 @@ use miden_core::{ }; use miden_core_lib::CoreLibrary; use miden_processor::{ - DefaultHost, ProcessorState, Program, StackInputs, + DefaultHost, ExecutionOptions, ProcessorState, Program, StackInputs, advice::{AdviceInputs, AdviceMutation}, event::{EventError, EventHandler}, }; @@ -30,11 +30,28 @@ fn truncate_stack() { } #[test] -fn reduce_kernel_digests_too_many_procs_has_message() { +fn reduce_kernel_digests_upper_bound() { + // init_seed contract: + // Stack: [log(trace_length), rd0, rd1, rd2, rd3, ...] + // Memory: num_queries, query_pow_bits, deep_pow_bits, folding_pow_bits + // + // process_public_inputs advice stack (consumed in order): + // 1. load_public_inputs: 40 fixed-length PI felts (5 iterations of 8) + // 2. reduce_variable_length_public_inputs: + // - 1 felt (num_kernel_proc_digests) + // - num_kernel_proc_digests * 8 felts (digests via adv_pipe) + // - 4 felts (aux randomness via adv_loadw) + // 3. reduce_kernel_digests asserts num_kernel_proc_digests < 1024 let source = " use miden::core::stark::random_coin + use miden::core::stark::constants use miden::core::sys::vm::public_inputs begin + push.27 exec.constants::set_number_queries + push.0 exec.constants::set_query_pow_bits + push.0 exec.constants::set_deep_pow_bits + push.16 exec.constants::set_folding_pow_bits + push.0.0.0.0 push.10 exec.random_coin::init_seed exec.public_inputs::process_public_inputs end @@ -46,40 +63,15 @@ fn reduce_kernel_digests_too_many_procs_has_message() { let kernel_procedures_digests = vec![0_u64; num_elements_kernel_proc_digests]; let auxiliary_rand_values = [0_u64; 4]; - let mut advice_stack = vec![num_elements_kernel_proc_digests as u64]; + // Advice layout (consumed top-to-bottom): + // 40 fixed-len PI, 1 num_kernel_proc_digests, 8192 digest felts, 4 aux rand + let mut advice_stack = Vec::new(); advice_stack.extend_from_slice(&fixed_length_public_inputs); + advice_stack.push(num_kernel_proc_digests as u64); advice_stack.extend_from_slice(&kernel_procedures_digests); advice_stack.extend_from_slice(&auxiliary_rand_values); - advice_stack.push(num_kernel_proc_digests as u64); - - let mut initial_stack = vec![10, 27, 16, 200, 0x50010810, 40]; - initial_stack.reverse(); - - let test = build_test!(source, &initial_stack, &advice_stack); - expect_assert_error_message!(test); -} - -#[test] -fn process_public_inputs_misaligned_var_len_has_message() { - let source = " - use miden::core::stark::random_coin - use miden::core::sys::vm::public_inputs - begin - exec.random_coin::init_seed - exec.public_inputs::process_public_inputs - end - "; - // Not divisible by 8, so the alignment assert in load_public_inputs should fire. - let num_var_len_pi = 1_u64; - let fixed_length_public_inputs = vec![0_u64; 40]; - let mut advice_stack = vec![num_var_len_pi]; - advice_stack.extend_from_slice(&fixed_length_public_inputs); - - let mut initial_stack = vec![10, 27, 16, 200, 0x50010810, 40]; - initial_stack.reverse(); - - let test = build_test!(source, &initial_stack, &advice_stack); + let test = build_test!(source, &[], &advice_stack); expect_assert_error_message!(test); } @@ -130,8 +122,7 @@ fn log_precompile_request_procedure() { let handler = DummyLogPrecompileHandler { event_id, calldata: calldata.clone() }; - let mut test = build_debug_test!(&source, &[]); - test.add_event_handler(EVENT_NAME, handler.clone()); + let test = build_debug_test!(&source, &[]).with_event_handler(EVENT_NAME, handler.clone()); let trace = test.execute().expect("failed to execute log_precompile test"); @@ -166,9 +157,15 @@ fn log_precompile_request_procedure() { .expect("failed to register dummy handler"); let options = ProvingOptions::with_96_bit_security(HashFunction::Blake3_256); - let (stack_outputs, proof) = - miden_utils_testing::prove_sync(&program, stack_inputs, advice_inputs, &mut host, options) - .expect("failed to generate proof for log_precompile helper"); + let (stack_outputs, proof) = miden_utils_testing::prove_sync( + &program, + stack_inputs, + advice_inputs, + &mut host, + ExecutionOptions::default(), + options, + ) + .expect("failed to generate proof for log_precompile helper"); // Proof should include the single deferred request that we expect. assert_eq!(proof.precompile_requests().len(), 1); @@ -193,7 +190,7 @@ fn log_precompile_request_procedure() { ); let program_info = ProgramInfo::from(program); - let (_, transcript_digest) = miden_verifier::verify_with_precompiles( + let (_, pc_transcript_digest) = miden_verifier::verify_with_precompiles( program_info, stack_inputs, stack_outputs, @@ -201,7 +198,7 @@ fn log_precompile_request_procedure() { &verifier_registry, ) .expect("proof verification with precompiles failed"); - assert_eq!(transcript.finalize(), transcript_digest); + assert_eq!(transcript.finalize(), pc_transcript_digest); } #[derive(Clone)] diff --git a/crates/mast-package/src/package/mod.rs b/crates/mast-package/src/package/mod.rs index 76112502ef..a246215052 100644 --- a/crates/mast-package/src/package/mod.rs +++ b/crates/mast-package/src/package/mod.rs @@ -179,13 +179,21 @@ impl Package { && let Some(entrypoint) = self.mast.mast_forest().find_procedure_root(digest) { let mast_forest = self.mast.mast_forest().clone(); - match self.try_embedded_kernel_library()? { - Some(kernel_library) => Ok(Program::with_kernel( + let kernel_dependency = self.kernel_runtime_dependency()?.cloned(); + match (self.try_embedded_kernel_library()?, kernel_dependency) { + (Some(kernel_library), _) => Ok(Program::with_kernel( mast_forest, entrypoint, kernel_library.kernel().clone(), )), - None => Ok(Program::new(mast_forest, entrypoint)), + (None, Some(kernel_dependency)) => Err(Report::msg(format!( + "package '{}' declares kernel runtime dependency '{}@{}#{}', but does not embed the kernel package required to reconstruct a program", + self.name, + kernel_dependency.name, + kernel_dependency.version, + kernel_dependency.digest + ))), + (None, None) => Ok(Program::new(mast_forest, entrypoint)), } } else { Err(Report::msg(format!( diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index cfbcb1a7b6..3373f09f0d 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -30,7 +30,7 @@ proptest-derive = { workspace = true, optional = true } serde = { workspace = true, optional = true } serde-untagged = { workspace = true, optional = true } thiserror.workspace = true -toml = { version = "1.0", default-features = false } +toml = { workspace = true } [dev-dependencies] miden-core.workspace = true @@ -38,7 +38,7 @@ miden-mast-package = { workspace = true, features = ["arbitrary"] } miden-test-serde-macros.workspace = true serde_json.workspace = true tempfile.workspace = true -toml = { version = "1.0", default-features = false, features = ["std", "serde", "parse"] } +toml = { workspace = true, features = ["std", "serde", "parse"] } [lints.rust] # This is needed until this warning appears in stable when this is commented out. Currently, it diff --git a/crates/project/examples/protocol/kernel/bin/main-alt.masm b/crates/project/examples/protocol/kernel/bin/main-alt.masm index 8b3b356195..462ab6f950 100644 --- a/crates/project/examples/protocol/kernel/bin/main-alt.masm +++ b/crates/project/examples/protocol/kernel/bin/main-alt.masm @@ -2,15 +2,12 @@ # program to be executed, so we store that into procedure local memory, and then dyncall it @locals(4) proc invoke_user_script - loc_storew.0 + loc_storew_be.0 locaddr.0 dyncall end begin - # At program start, initialize the kernel environment - exec.$kernel::init - # Execute the user script whose entrypoint digest is on top of the stack exec.invoke_user_script end diff --git a/crates/project/examples/protocol/kernel/bin/main.masm b/crates/project/examples/protocol/kernel/bin/main.masm index 8b3b356195..462ab6f950 100644 --- a/crates/project/examples/protocol/kernel/bin/main.masm +++ b/crates/project/examples/protocol/kernel/bin/main.masm @@ -2,15 +2,12 @@ # program to be executed, so we store that into procedure local memory, and then dyncall it @locals(4) proc invoke_user_script - loc_storew.0 + loc_storew_be.0 locaddr.0 dyncall end begin - # At program start, initialize the kernel environment - exec.$kernel::init - # Execute the user script whose entrypoint digest is on top of the stack exec.invoke_user_script end diff --git a/crates/project/examples/protocol/kernel/kernel/io.masm b/crates/project/examples/protocol/kernel/kernel/io.masm index 851adb296f..8b2458c0cd 100644 --- a/crates/project/examples/protocol/kernel/kernel/io.masm +++ b/crates/project/examples/protocol/kernel/kernel/io.masm @@ -1,4 +1,4 @@ -const PRINTLN = event("sys.println") +const PRINTLN = 0 #! Prints the given null-terminated byte string to stdout, if debug tracing is enabled pub proc println(message: ptr) diff --git a/crates/project/examples/protocol/kernel/kernel/mod.masm b/crates/project/examples/protocol/kernel/kernel/mod.masm index 5000ce1c60..cf048a3964 100644 --- a/crates/project/examples/protocol/kernel/kernel/mod.masm +++ b/crates/project/examples/protocol/kernel/kernel/mod.masm @@ -7,11 +7,11 @@ const PRINTLN_ADDR = SYSCALL_TABLE_ADDR + 2 #! Initializes the kernel environment pub proc init procref.is_valid_syscall - mem_storew.SYSCALL_TABLE_ADDR + mem_storew_be.SYSCALL_TABLE_ADDR procref.$kernel::sys::panic - mem_storew.PANIC_ADDR + mem_storew_be.PANIC_ADDR procref.$kernel::io::println - mem_storew.PRINTLN_ADDR + mem_storew_be.PRINTLN_ADDR end #! Execute one of this kernel's syscalls @@ -24,7 +24,7 @@ pub proc system_call # validate syscall id dup.0 mem_load.SYSCALL_TABLE_ADDR dynexec # invoke the syscall - add.SYSCALL_TABLE_ADDR mem_loadw dynexec + add.SYSCALL_TABLE_ADDR mem_loadw_be dynexec end proc is_valid_syscall diff --git a/crates/project/src/dependencies/graph.rs b/crates/project/src/dependencies/graph.rs index b47f3980f6..5752931ae6 100644 --- a/crates/project/src/dependencies/graph.rs +++ b/crates/project/src/dependencies/graph.rs @@ -125,9 +125,20 @@ pub enum ProjectDependencyNodeProvenance { path: PathBuf, /// The version of the preassembled package selected: Version, + /// The target kind of the preassembled package + kind: crate::TargetType, + /// The dependency requirements declared by the preassembled package manifest + requirements: BTreeMap, }, } +/// The manifest dependency metadata pinned for a preassembled package. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct PreassembledDependencyMetadata { + pub version: Version, + pub kind: crate::TargetType, +} + /// Represents information about a package whose provenance is a Miden project in source form. #[derive(Debug, Clone, PartialEq, Eq)] pub enum ProjectSource { @@ -473,16 +484,9 @@ impl<'a, R: PackageRegistry + ?Sized> ProjectDependencyGraphBuilder<'a, R> { continue; } - let Some(versions) = self.registry.available_versions(&package) else { - continue; - }; - - for record in versions.values() { - registry - .insert_record(package.clone(), record.clone()) - .map_err(|error| Report::msg(error.to_string()))?; - - for dependency in record.dependencies().keys() { + if let Some(versions) = registry.available_versions(&package) { + for dependency in versions.values().flat_map(|record| record.dependencies().keys()) + { if local_packages.contains(dependency) { return Err(Report::msg(format!( "dependency conflict for '{dependency}': local source or preassembled dependency conflicts with a registry dependency" @@ -492,6 +496,26 @@ impl<'a, R: PackageRegistry + ?Sized> ProjectDependencyGraphBuilder<'a, R> { pending.insert(dependency.clone()); } } + continue; + } + + if let Some(versions) = self.registry.available_versions(&package) { + for record in versions.values() { + registry + .insert_record(package.clone(), record.clone()) + .map_err(|error| Report::msg(error.to_string()))?; + + for dependency in record.dependencies().keys() { + if local_packages.contains(dependency) { + return Err(Report::msg(format!( + "dependency conflict for '{dependency}': local source or preassembled dependency conflicts with a registry dependency" + ))); + } + if !copied.contains(dependency) { + pending.insert(dependency.clone()); + } + } + } } } @@ -765,17 +789,37 @@ impl<'a, R: PackageRegistry + ?Sized> ProjectDependencyGraphBuilder<'a, R> { self.ensure_version_satisfies(expected_name, requirement, selected.clone())?; } + let mut dependencies = Vec::with_capacity(package.manifest.num_dependencies()); + let requirements = package_requirements(&package); + let mut solver_dependencies = BTreeMap::new(); + for dependency in package.manifest.dependencies() { + solver_dependencies.insert( + dependency.name.clone(), + VersionRequirement::Exact(Version::new( + dependency.version.clone(), + dependency.digest, + )), + ); + + dependencies.push(ProjectDependencyEdge { + dependency: dependency.name.clone(), + linkage: Linkage::Dynamic, + }); + } + Ok(CollectedDependencyNode { graph_node: ProjectDependencyNode { - dependencies: Vec::new(), + dependencies, name: PackageId::from(expected_name), provenance: ProjectDependencyNodeProvenance::Preassembled { path, selected: selected.clone(), + kind: package.kind, + requirements, }, version: selected.version.clone(), }, - solver_dependencies: BTreeMap::new(), + solver_dependencies, }) } @@ -1031,6 +1075,24 @@ struct GitCheckout { resolved_revision: Arc, } +fn package_requirements( + package: &MastPackage, +) -> BTreeMap { + package + .manifest + .dependencies() + .map(|dependency| { + ( + dependency.name.clone(), + PreassembledDependencyMetadata { + version: Version::new(dependency.version.clone(), dependency.digest), + kind: dependency.kind, + }, + ) + }) + .collect() +} + #[cfg(test)] mod tests { use alloc::{boxed::Box, string::ToString}; @@ -1600,11 +1662,122 @@ mod tests { ProjectDependencyNodeProvenance::Preassembled { ref path, ref selected, + .. } if path == &package_path.canonicalize().unwrap() && *selected == Version::new("1.0.0".parse().unwrap(), digest) ); } + #[test] + fn preassembled_path_dependency_propagates_runtime_dependencies_into_resolution() { + let tempdir = TempDir::new().unwrap(); + let runtime_package = build_registry_test_package("runtime", "1.0.0"); + let runtime_version = + Version::new(runtime_package.version.clone(), runtime_package.digest()); + let dep_package = MastPackage::generate( + "dep".into(), + "1.0.0".parse().unwrap(), + TargetType::Library, + [miden_mast_package::Dependency { + name: PackageId::from("runtime"), + version: runtime_version.version.clone(), + kind: TargetType::Library, + digest: runtime_package.digest(), + }], + ); + let dep_package_path = tempdir.path().join("dep.masp"); + fs::write(&dep_package_path, dep_package.to_bytes()).unwrap(); + + let root_dir = tempdir.path().join("root"); + let root_manifest = write_package( + &root_dir, + "root", + "1.0.0", + Some("export.foo\nend\n"), + [Dependency::new( + Span::unknown("dep".into()), + DependencyVersionScheme::Path { + path: Span::unknown(Uri::from(dep_package_path.as_path())), + version: None, + }, + Linkage::Dynamic, + )], + ); + + let mut registry = TestRegistry::default(); + registry + .insert_record( + PackageId::from("runtime"), + PackageRecord::new(runtime_version.clone(), std::iter::empty()), + ) + .unwrap(); + + let graph = builder(®istry, &tempdir.path().join("git")) + .build_from_path(&root_manifest) + .unwrap(); + let dep = graph.get(&PackageId::from("dep")).unwrap(); + let runtime = graph.get(&PackageId::from("runtime")).unwrap(); + + assert_eq!( + dep.dependencies, + vec![ProjectDependencyEdge { + dependency: PackageId::from("runtime"), + linkage: Linkage::Dynamic, + }] + ); + assert_matches!( + runtime.provenance, + ProjectDependencyNodeProvenance::Registry { ref selected, .. } + if *selected == runtime_version + ); + } + + #[test] + fn preassembled_path_dependency_keeps_embedded_kernel_in_solver_requirements() { + let tempdir = TempDir::new().unwrap(); + let kernel_package = MastPackage::generate( + "kernelpkg".into(), + "1.0.0".parse().unwrap(), + TargetType::Kernel, + [], + ); + let kernel_version = Version::new(kernel_package.version.clone(), kernel_package.digest()); + let dep_package = MastPackage::generate( + "dep".into(), + "1.0.0".parse().unwrap(), + TargetType::Library, + [miden_mast_package::Dependency { + name: PackageId::from("kernelpkg"), + version: kernel_version.version.clone(), + kind: TargetType::Kernel, + digest: kernel_package.digest(), + }], + ); + + let dep_package_path = tempdir.path().join("dep.masp"); + fs::write(&dep_package_path, dep_package.to_bytes()).unwrap(); + + let registry = TestRegistry::default(); + let node = builder(®istry, &tempdir.path().join("git")) + .load_preassembled_dependency(&dep_package_path, "dep", None) + .unwrap(); + + assert_eq!( + node.graph_node.dependencies, + vec![ProjectDependencyEdge { + dependency: PackageId::from("kernelpkg"), + linkage: Linkage::Dynamic, + }] + ); + assert_eq!( + node.solver_dependencies, + BTreeMap::from([( + PackageId::from("kernelpkg"), + VersionRequirement::Exact(kernel_version), + )]) + ); + } + #[test] fn preassembled_path_dependency_validates_digest_requirement_against_artifact_digest() { let tempdir = TempDir::new().unwrap(); diff --git a/crates/test-serde-macros/Cargo.toml b/crates/test-serde-macros/Cargo.toml index 8c77843106..6f7e2331ee 100644 --- a/crates/test-serde-macros/Cargo.toml +++ b/crates/test-serde-macros/Cargo.toml @@ -17,8 +17,8 @@ edition.workspace = true proc-macro = true [dependencies] -proc-macro2 = "1.0" -quote = "1.0" +proc-macro2 = { workspace = true } +quote = { workspace = true } syn = { workspace = true, features = ["derive", "extra-traits", "full"] } proptest.workspace = true proptest-derive.workspace = true diff --git a/crates/test-utils/Cargo.toml b/crates/test-utils/Cargo.toml index 82ec8d8fbd..2f9e4976c2 100644 --- a/crates/test-utils/Cargo.toml +++ b/crates/test-utils/Cargo.toml @@ -34,11 +34,11 @@ miden-verifier.workspace = true test-case = "3.2" [target.'cfg(target_family = "wasm")'.dependencies] -pretty_assertions = { version = "1.4", default-features = false, features = [ +pretty_assertions = { workspace = true, default-features = false, features = [ "alloc", ] } [target.'cfg(not(target_family = "wasm"))'.dependencies] env_logger.workspace = true -pretty_assertions = "1.4" +pretty_assertions = { workspace = true, features = ["std"] } proptest.workspace = true diff --git a/crates/test-utils/src/lib.rs b/crates/test-utils/src/lib.rs index 92792c68eb..d86ce78d10 100644 --- a/crates/test-utils/src/lib.rs +++ b/crates/test-utils/src/lib.rs @@ -40,12 +40,10 @@ pub use miden_processor::{ #[cfg(not(target_family = "wasm"))] use miden_processor::{DefaultDebugHandler, trace::build_trace}; use miden_processor::{ - DefaultHost, ExecutionOutput, FastProcessor, Program, event::EventHandler, - trace::execution_tracer::TraceGenerationContext, + DefaultHost, ExecutionOutput, FastProcessor, Program, TraceBuildInputs, event::EventHandler, }; #[cfg(not(target_family = "wasm"))] pub use miden_prover::prove_sync; -use miden_prover::utils::range; pub use miden_prover::{ProvingOptions, prove}; pub use miden_verifier::verify; pub use pretty_assertions::{assert_eq, assert_ne, assert_str_eq}; @@ -225,6 +223,63 @@ impl Test { } } + /// Adds kernel source to this test so it is assembled and linked during compilation. + #[track_caller] + pub fn with_kernel(self, kernel_source: impl ToString) -> Self { + self.with_kernel_source( + format!("kernel{}", core::panic::Location::caller().line()), + kernel_source, + ) + } + + /// Adds kernel source to this test so it is assembled and linked during compilation. + pub fn with_kernel_source( + mut self, + kernel_name: impl Into, + kernel_source: impl ToString, + ) -> Self { + self.kernel_source = Some(self.source_manager.load( + SourceLanguage::Masm, + kernel_name.into().into(), + kernel_source.to_string(), + )); + self + } + + /// Sets the stack inputs for this test using stack-ordered values. + #[track_caller] + pub fn with_stack_inputs(mut self, stack_inputs: impl AsRef<[u64]>) -> Self { + self.stack_inputs = StackInputs::try_from_ints(stack_inputs.as_ref().to_vec()).unwrap(); + self + } + + /// Adds a library to link in during assembly. + pub fn with_library(mut self, library: impl Into) -> Self { + self.libraries.push(library.into()); + self + } + + /// Adds a handler for a specific event when running the `Host`. + pub fn with_event_handler(mut self, event: EventName, handler: impl EventHandler) -> Self { + self.add_event_handler(event, handler); + self + } + + /// Adds handlers for specific events when running the `Host`. + pub fn with_event_handlers( + mut self, + handlers: Vec<(EventName, Arc)>, + ) -> Self { + self.add_event_handlers(handlers); + self + } + + /// Adds an extra module to link in during assembly. + pub fn with_module(mut self, path: impl AsRef, source: impl ToString) -> Self { + self.add_module(path, source); + self + } + /// Add an extra module to link in during assembly pub fn add_module(&mut self, path: impl AsRef, source: impl ToString) { self.add_modules.push((path.as_ref().into(), source.to_string())); @@ -286,8 +341,9 @@ impl Test { let execution_output = processor.execute_sync(&program, &mut host).unwrap(); // validate the memory state - for (addr, mem_value) in - (range(mem_start_addr as usize, expected_mem.len())).zip(expected_mem.iter()) + for (addr, mem_value) in ((mem_start_addr as usize) + ..(mem_start_addr as usize + expected_mem.len())) + .zip(expected_mem.iter()) { let mem_state = execution_output .memory @@ -394,14 +450,14 @@ impl Test { .with_core_trace_fragment_size(FRAGMENT_SIZE) .unwrap(), ); - fast_processor.execute_for_trace_sync(&program, &mut host) + fast_processor.execute_trace_inputs_sync(&program, &mut host) }; // compare fast and slow processors' stack outputs self.assert_result_with_step_execution(&fast_stack_result); - fast_stack_result.and_then(|(execution_output, trace_generation_ctx)| { - let trace = build_trace(execution_output, trace_generation_ctx, program.to_info())?; + fast_stack_result.and_then(|trace_inputs| { + let trace = build_trace(trace_inputs)?; assert_eq!(&program.hash(), trace.program_hash(), "inconsistent program hash"); Ok(trace) @@ -473,6 +529,7 @@ impl Test { stack_inputs, self.advice_inputs.clone(), &mut host, + miden_processor::ExecutionOptions::default(), ProvingOptions::default(), ) .unwrap(); @@ -555,7 +612,7 @@ impl Test { #[cfg(not(target_family = "wasm"))] fn assert_result_with_step_execution( &self, - fast_result: &Result<(ExecutionOutput, TraceGenerationContext), ExecutionError>, + fast_result: &Result, ) { fn compare_results( left_result: Result, @@ -610,7 +667,7 @@ impl Test { }; compare_results( - fast_result.as_ref().map(|(output, _)| output.stack), + fast_result.as_ref().map(|trace_inputs| *trace_inputs.stack_outputs()), &fast_result_by_step, "fast processor", "fast processor by step", @@ -706,33 +763,45 @@ pub fn get_column_name(col_idx: usize) -> String { // Decoder columns i if i == DECODER_TRACE_OFFSET + ADDR_COL_IDX => "decoder_addr".to_string(), - i if range(DECODER_TRACE_OFFSET + OP_BITS_OFFSET, NUM_OP_BITS).contains(&i) => { + i if (DECODER_TRACE_OFFSET + OP_BITS_OFFSET + ..DECODER_TRACE_OFFSET + OP_BITS_OFFSET + NUM_OP_BITS) + .contains(&i) => + { format!("op_bits[{}]", i - (DECODER_TRACE_OFFSET + OP_BITS_OFFSET)) }, - i if range(DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET, NUM_HASHER_COLUMNS).contains(&i) => { + i if (DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + ..DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + NUM_HASHER_COLUMNS) + .contains(&i) => + { format!("hasher_state[{}]", i - (DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET)) }, i if i == DECODER_TRACE_OFFSET + IN_SPAN_COL_IDX => "in_span".to_string(), i if i == DECODER_TRACE_OFFSET + GROUP_COUNT_COL_IDX => "group_count".to_string(), i if i == DECODER_TRACE_OFFSET + OP_INDEX_COL_IDX => "op_index".to_string(), - i if range(DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET, NUM_OP_BATCH_FLAGS) + i if (DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET + ..DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET + NUM_OP_BATCH_FLAGS) .contains(&i) => { format!("op_batch_flag[{}]", i - (DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET)) }, - i if range(DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET, NUM_OP_BITS_EXTRA_COLS) + i if (DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET + ..DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET + NUM_OP_BITS_EXTRA_COLS) .contains(&i) => { format!("op_bits_extra[{}]", i - (DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET)) }, - i if range(DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET, NUM_OP_BITS_EXTRA_COLS) + i if (DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET + ..DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET + NUM_OP_BITS_EXTRA_COLS) .contains(&i) => { format!("op_bits_extra[{}]", i - (DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET)) }, // Stack columns - i if range(STACK_TRACE_OFFSET + STACK_TOP_OFFSET, MIN_STACK_DEPTH).contains(&i) => { + i if (STACK_TRACE_OFFSET + STACK_TOP_OFFSET + ..STACK_TRACE_OFFSET + STACK_TOP_OFFSET + MIN_STACK_DEPTH) + .contains(&i) => + { format!("stack[{}]", i - (STACK_TRACE_OFFSET + STACK_TOP_OFFSET)) }, i if i == STACK_TRACE_OFFSET + B0_COL_IDX => "stack_b0".to_string(), diff --git a/crates/utils-core-derive/Cargo.toml b/crates/utils-core-derive/Cargo.toml index 39d6498c71..b92550569d 100644 --- a/crates/utils-core-derive/Cargo.toml +++ b/crates/utils-core-derive/Cargo.toml @@ -16,6 +16,6 @@ edition.workspace = true proc-macro = true [dependencies] -proc-macro2 = "1.0" -quote = "1.0" +proc-macro2 = { workspace = true } +quote = { workspace = true } syn = { workspace = true, features = ["derive", "extra-traits", "full"] } diff --git a/crates/utils-diagnostics/Cargo.toml b/crates/utils-diagnostics/Cargo.toml index 54a8ce666a..7471f8cd62 100644 --- a/crates/utils-diagnostics/Cargo.toml +++ b/crates/utils-diagnostics/Cargo.toml @@ -20,7 +20,7 @@ std = ["miette/fancy-no-syscall", "miette/std", "miden-crypto/std", "miden-debug [dependencies] miden-debug-types.workspace = true -miette = { package = "miden-miette", version = "8.0", default-features = false, features = [ +miette = { workspace = true, features = [ "fancy-no-syscall", "derive", ] } diff --git a/crates/utils-sync/Cargo.toml b/crates/utils-sync/Cargo.toml index 47b933e07b..26802b0d16 100644 --- a/crates/utils-sync/Cargo.toml +++ b/crates/utils-sync/Cargo.toml @@ -24,11 +24,11 @@ once_cell = { version = "1.21", default-features = false, features = ["alloc", " parking_lot = { version = "0.12", optional = true } [dev-dependencies] -loom = "0.7" +loom = { workspace = true } proptest.workspace = true [target.'cfg(loom)'.dependencies] -loom = "0.7" +loom.workspace = true [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(loom)'] } diff --git a/deny.toml b/deny.toml index 2079458345..a12f642138 100644 --- a/deny.toml +++ b/deny.toml @@ -49,7 +49,6 @@ deny = [ #{ name = "ansi_term", version = "=0.11.0" }, ] skip = [ - { name = "cpufeatures" }, # Allow duplicate spin versions - transitively pulled by p3-dft and flume { name = "spin" }, # Allow duplicate rand versions - miden-field uses 0.10, miden-vm uses 0.9 @@ -67,6 +66,8 @@ skip-tree = [ { name = "rustc_version", version = "=0.2.3" }, # Allow unicode-width v0.1.x - miden-miette vs miden-formatting conflict (complex to fix) { name = "unicode-width", version = "=0.1.14" }, + # Allow windows-sys v0.59.x - multiple Windows system libraries (hard to converge) + { name = "windows-sys", version = "=0.59.0" }, # Allow syn v1.x and v2.x - our derive macros need v1.x while ecosystem uses v2.x { name = "syn", version = "=1.0.109" }, { name = "syn", version = "=2.0.117" }, diff --git a/docs/src/design/chiplets/hasher.md b/docs/src/design/chiplets/hasher.md index 46975e3711..8365755c63 100644 --- a/docs/src/design/chiplets/hasher.md +++ b/docs/src/design/chiplets/hasher.md @@ -5,514 +5,678 @@ sidebar_position: 2 # Hash chiplet -Miden VM "offloads" all hash-related computations to a separate _hash processor_. This chiplet supports executing the [Poseidon2](https://eprint.iacr.org/2023/323) hash function in the following settings: - -- A single permutation of Poseidon2. -- A simple 2-to-1 hash. -- A linear hash of $n$ field elements. -- Merkle path verification. +The hash chiplet executes all Poseidon2-based hashing performed by the VM. In the +current design it is split into two **sub-chiplets** that each own their own +chiplet-level selector in the shared chiplet tri-state selector system: + +1. **Controller** (`s_ctrl = 1`) records hash requests as compact `(input, output)` + row pairs and communicates with the rest of the VM via the chiplets bus. +2. **Permutation** (`s_perm = 1`) executes Poseidon2 permutations in a dedicated + compute region, using one packed 16-row cycle per unique input state. + +This separation lets the VM **deduplicate permutations**: if the same input +state is requested multiple times, the controller records multiple requests but +the permutation segment executes the permutation only once and carries the +request count as a multiplicity. + +The two physical selectors `s_ctrl` (= `chiplets[0]`) and `s_perm` +(the last chiplets column) partition hasher rows. The virtual selector +`s0 = 1 - s_ctrl - s_perm` covers all non-hasher rows and is subdivided by +`s1..s4` into the remaining chiplets (bitwise, memory, ACE, kernel ROM). The +transition rules `ctrl → ctrl | perm`, `perm → perm | s0`, `s0 → s0` enforce +the trace ordering. + +## Supported operations + +The chiplet supports: + +- a single Poseidon2 permutation (`HPERM` / full-state return), +- a 2-to-1 hash, +- sequential sponge hashing of many rate blocks, +- Merkle path verification, - Merkle root update. -The chiplet can be thought of as having a small instruction set of $11$ instructions. These instructions are listed below, and examples of how these instructions are used by the chiplet are described in the following sections. +These operations are encoded by the three **hasher-internal sub-selector** columns +`(s0, s1, s2)` on controller rows. These are the `ControllerCols` fields and live +in `chiplets[1..4]`. They are separate from the chiplet-level virtual +`s0 = 1 - s_ctrl - s_perm` (which is only ever an expression inside the chiplet +selector system, never a physical column or struct field). + +| Sub-selectors | Meaning | +|---------------|---------| +| `(1, 0, 0)` | sponge input / linear hash input | +| `(1, 0, 1)` | Merkle path verify input | +| `(1, 1, 0)` | Merkle update old-path input | +| `(1, 1, 1)` | Merkle update new-path input | +| `(0, 0, 0)` | return digest (HOUT) | +| `(0, 0, 1)` | return full state (SOUT) | +| `(0, 1, *)` | controller padding | + +On permutation rows these same physical columns are **not selectors**: they are +reused as witness columns `(w0, w1, w2)` for the packed internal rounds. + +## Trace layout + +Within the chiplets segment, the hasher occupies **20 columns** split between the +two sub-chiplets. The chiplet-level selectors `s_ctrl` (= `chiplets[0]`) and +`s_perm` (the separate 20th column) select which sub-chiplet owns +the current row. The remaining 19 columns (`chiplets[1..20]`) are a **union** +whose interpretation depends on which sub-chiplet is active. + +| Physical column(s) | Controller (`s_ctrl = 1`) | Permutation (`s_perm = 1`) | +|-------------------|---------------------------|----------------------------| +| `chiplets[0]` | `s_ctrl = 1` (controller gate) | `s_ctrl = 0` | +| `s_perm` | `s_perm = 0` | `s_perm = 1` (perm gate) | +| `chiplets[1]` | `s0` (input / output-or-pad) | `w0` (S-box witness) | +| `chiplets[2]` | `s1` (operation sub-selector) | `w1` (S-box witness) | +| `chiplets[3]` | `s2` (operation sub-selector) | `w2` (S-box witness) | +| `h0..h11` | Poseidon2 state `[RATE0, RATE1, CAPACITY]` | Poseidon2 state | +| `node_index` | Merkle node index | Request multiplicity | +| `mrupdate_id` | Domain separator for sibling table | Zero (enforced) | +| `is_boundary` | 1 on first/last controller row | Zero (enforced) | +| `direction_bit` | Merkle path direction bit | Zero (enforced) | + +The Poseidon2 state is stored in little-endian sponge order: + +```text +[h0..h11] = [RATE0(4), RATE1(4), CAPACITY(4)] +``` -| Instruction | Description | Cycles | Context | Notes | -| ----------- | ----------- | ------ | ------- | ----- | -| `HR` | Executes a single round of the VM's native hash function | $0$-$30$, $32$-$62$, $64$-$94$... (not $31$, $63$, $95$...) | Any | | -| `BP` | Initiates computation of a single permutation, a 2-to-1 hash, or a linear hash of many elements | Multiples of $32$ ($0$, $32$, $64$...) | Start of computation | Concurrent with `HR` | -| `MP` | Initiates Merkle path verification computation | Multiples of $32$ | Start of computation | Concurrent with `HR` | -| `MV` | Initiates Merkle path verification for the "old" node value | Multiples of $32$ | Merkle root update | Concurrent with `HR` | -| `MU` | Initiates Merkle path verification for the "new" node value | Multiples of $32$ | Merkle root update | Concurrent with `HR` | -| `HOUT` | Returns the "output" portion of the hasher state (indices $[0,4)$) | $32n-1$ ($31$, $63$, $95$...) | End of computation | | -| `SOUT` | Returns entire hasher state | $32n-1$ ($31$, $63$, $95$...) | End of computation | Only after `BP` | -| `ABP` | Absorbs a new set of elements into the hasher state | $32n-1$ ($31$, $63$, $95$...) | Linear hash (multi-block) | Only after `BP` | -| `MPA` | Absorbs the next Merkle path node into the hasher state | $32n-1$ ($31$, $63$, $95$...) | Merkle path verification | Only after `MP` | -| `MVA` | Absorbs the next Merkle path node into the hasher state during Merkle path verification for the "old" node value | $32n-1$ ($31$, $63$, $95$...) | Merkle root update | Only after `MV` | -| `MUA` | Absorbs the next Merkle path node into the hasher state during Merkle path verification for the "new" node value | $32n-1$ ($31$, $63$, $95$...) | Merkle root update | Only after `MU` | +`RATE0` (`h0..h3`) is always the digest word. -## Chiplet trace +In the constraint code, the union layout is modeled by two typed column structs +`ControllerCols` and `PermutationCols` that overlay the same `chiplets[1..20]` +range with sub-chiplet-specific field names (see +`air/src/constraints/chiplets/columns.rs`). -Execution trace table of the chiplet consists of $16$ trace columns and $3$ periodic columns. The structure of the table is such that a single permutation of the hash function can be computed using $32$ table rows. The layout of a single 32-row cycle is summarized below (rows omitted are identical permutation rows). +## Design invariants -| Row (mod 32) | $k_2$ | $k_1$ | $k_0$ | $s_0,s_1,s_2$ | RATE0 ($h_0..h_3$) | RATE1 ($h_4..h_7$) | CAP ($h_8..h_{11}$) | $i$ | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | 1 | 0 | 0 | op-specific | input rate0 | input rate1 | input capacity | index | -| 1 | 0 | 0 | 0 | op-specific | permutation state | permutation state | permutation state | index | -| ... | ... | ... | ... | ... | ... | ... | ... | ... | -| 30 | 0 | 1 | 0 | op-specific | permutation state | permutation state | permutation state | index | -| 31 | 0 | 0 | 1 | op-specific | state (post-permutation) | state (post-permutation) | state (post-permutation) | index | +The current hasher design relies on a few invariants. -The meaning of the columns is as follows: +- **`s_ctrl` / `s_perm` are the authoritative sub-chiplet discriminators.** + Controller rows have `s_ctrl = 1, s_perm = 0`; permutation rows have + `s_ctrl = 0, s_perm = 1`. Non-hasher rows have `s_ctrl = s_perm = 0`. The + tri-state constraints in `selectors.rs` enforce booleanity of each selector and + of their sum, so at most one fires on any row. On controller rows, `s0/s1/s2` + are interpreted as sub-selectors; on permutation rows the same physical + columns hold S-box witnesses. -- Three periodic columns $k_0$, $k_1$, and $k_2$ are used to help select the instruction executed at a given row. All of these columns contain patterns which repeat every $32$ rows. For $k_0$ the pattern is $31$ zeros followed by $1$ one, helping us identify the last row in the cycle. For $k_1$ the pattern is $30$ zeros, $1$ one, and $1$ zero, which can be used to identify the second-to-last row in a cycle. For $k_2$ the pattern is $1$ one followed by $31$ zeros, which can identify the first row in the cycle. -- Three selector columns $s_0$, $s_1$, and $s_2$. These columns can contain only binary values (ones or zeros), and they are also used to help select the instruction to execute at a given row. -- Twelve hasher state columns $h_0, ..., h_{11}$. These columns are used to hold the hasher state for each round of the hash function permutation. The state is laid out as follows: - - The first eight columns ($h_0, ..., h_7$) are reserved for the rate elements of the state, arranged as two 4-element words (RATE0, RATE1). Once the permutation is complete, the hash output is located in the first rate word ($h_0, ..., h_3$). - - The last four columns ($h_8, ..., h_{11}$) are reserved for capacity elements of the state. When the state is initialized for hash computations, $h_8$ should be set to $0$ if the number of elements to be hashed is a multiple of the rate width ($8$). Otherwise, $h_8$ should be set to $1$. $h_9$ should be set to the domain value if a domain has been provided (as in the case of [control block hashing](../programs.md#program-hash-computation)). The remaining capacity lanes ($h_{10}$, $h_{11}$) are set to $0$. -- One index column $i$. This column is used to help with Merkle path verification and Merkle root update computations. +- **Trace ordering is enforced by selector transitions.** + The transitions `ctrl → ctrl | perm`, `perm → perm | s0`, and `s0 → s0` + guarantee that the controller section comes first, the permutation section + comes second, and any remaining chiplets follow in the `s0` region. -In addition to the columns described above, the chiplet relies on two running product columns which are used to facilitate multiset checks (similar to the ones described [here](https://hackmd.io/@relgabizon/ByFgSDA7D)). These columns are: +- **Only controller rows participate in the external chiplets interface.** + The controller is the only sub-chiplet that sends or receives hasher messages + on `b_chiplets`. The permutation segment is internal compute only. -- $b_{chip}$ - which is used to tie the chiplet table with the main VM's stack and decoder. That is, values representing inputs consumed by the chiplet and outputs produced by the chiplet are multiplied into $b_{chip}$, while the main VM stack (or decoder) divides them out of $b_{chip}$. Thus, if the sets of inputs and outputs between the main VM stack and hash chiplet are the same, the value of $b_{chip}$ should be equal to $1$ at the start and the end of the execution trace. -- $p_1$ - which is used to keep track of the _sibling_ table used for Merkle root update computations. Specifically, when a root for the old leaf value is computed, we add an entry for all sibling nodes to the table (i.e., we multiply $p_1$ by the values representing these entries). When the root for the new leaf value is computed, we remove the entries for the nodes from the table (i.e., we divide $p_1$ by the value representing these entries). Thus, if both computations used the same set of sibling nodes (in the same order), the sibling table should be empty by the time Merkle root update procedure completes (i.e., the value of $p_1$ would be $1$). +- **Permutation cycles are aligned.** + Entering the permutation segment can happen only at packed cycle row `0`, and + leaving the hasher while still in the permutation segment can happen only at + packed cycle row `15`. These alignment constraints live in `permutation/mod.rs` + and use the precomputed `next_is_first` and `is_last` flags from + [`ChipletFlags`]. -## Instruction flags +- **Multiplicity is cycle-wide.** + On permutation rows, the column physically shared with `node_index` is + interpreted as a multiplicity counter. It must stay constant within a cycle + so that one multiplicity is attached to the entire permutation. -As mentioned above, chiplet instructions are encoded using a combination of periodic and selector columns. These columns can be used to compute a binary flag for each instruction. Thus, when a flag for a given instruction is set to $1$, the chiplet executes this instruction. Formulas for computing instruction flags are listed below. +- **Witness reuse is explicit.** + On packed internal rows, `(s0, s1, s2)` carry witness values for + internal-round S-box outputs (`w0, w1, w2`). On row `11`, only `w0` is used. + Unused witness slots are constrained to zero. Similarly, `mrupdate_id`, + `is_boundary`, and `direction_bit` are forced to zero on permutation rows so + they cannot leak controller-side meaning into the permutation gate. -| Flag | Value | Notes | -| ---------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -| $f_{rpr}$ | $1 - k_0$ | Set to $1$ on the first $31$ steps of every $32$-step cycle. | -| $f_{bp}$ | $k_2 \cdot s_0 \cdot (1 - s_1) \cdot (1 - s_2)$ | Set to $1$ when selector flags are $(1, 0, 0)$ on rows which are multiples of $32$. | -| $f_{mp}$ | $k_2 \cdot s_0 \cdot (1 - s_1) \cdot s_2$ | Set to $1$ when selector flags are $(1, 0, 1)$ on rows which are multiples of $32$. | -| $f_{mv}$ | $k_2 \cdot s_0 \cdot s_1 \cdot (1 - s_2)$ | Set to $1$ when selector flags are $(1, 1, 0)$ on rows which are multiples of $32$. | -| $f_{mu}$ | $k_2 \cdot s_0 \cdot s_1 \cdot s_2$ | Set to $1$ when selector flags are $(1, 1, 1)$ on rows which are multiples of $32$. | -| $f_{hout}$ | $k_0 \cdot (1 - s_0) \cdot (1 - s_1) \cdot (1 - s_2)$ | Set to $1$ when selector flags are $(0, 0, 0)$ on rows which are $1$ less than a multiple of $32$. | -| $f_{sout}$ | $k_0 \cdot (1 - s_0) \cdot (1 - s_1) \cdot s_2$ | Set to $1$ when selector flags are $(0, 0, 1)$ on rows which are $1$ less than a multiple of $32$. | -| $f_{abp}$ | $k_0 \cdot s_0 \cdot (1 - s_1) \cdot (1 - s_2)$ | Set to $1$ when selector flags are $(1, 0, 0)$ on rows which are $1$ less than a multiple of $32$. | -| $f_{mpa}$ | $k_0 \cdot s_0 \cdot (1 - s_1) \cdot s_2$ | Set to $1$ when selector flags are $(1, 0, 1)$ on rows which are $1$ less than a multiple of $32$. | -| $f_{mva}$ | $k_0 \cdot s_0 \cdot s_1 \cdot (1 - s_2)$ | Set to $1$ when selector flags are $(1, 1, 0)$ on rows which are $1$ less than a multiple of $32$. | -| $f_{mua}$ | $k_0 \cdot s_0 \cdot s_1 \cdot s_2$ | Set to $1$ when selector flags are $(1, 1, 1)$ on rows which are $1$ less than a multiple of $32$. | +- **Merkle routing happens entirely in the controller region.** + Merkle-specific values (`node_index`, `direction_bit`, `mrupdate_id`) have + controller semantics only. The permutation segment does not carry Merkle + routing meaning. -A few additional notes about flag values: +- **Sibling-table balancing is partitioned by `mrupdate_id`.** + The old-path and new-path legs of a single `MRUPDATE` share the same + `mrupdate_id`, and different updates use different IDs. This prevents sibling + entries from unrelated updates from cancelling each other. -- With the exception of $f_{rpr}$, all flags are mutually exclusive. That is, if one flag is set to $1$, all other flats are set to $0$. -- With the exception of $f_{rpr}$, computing flag values involves $3$ multiplications, and thus the degree of these flags is $4$. -- We can also define a flag $f_{out} = k_0 \cdot (1 - s_0) \cdot (1 - s_1)$. This flag will be set to $1$ when either $f_{hout}=1$ or $f_{sout}=1$ in the current row. -- We can define a flag $f_{out}' = k_1 \cdot (1 - s_0') \cdot (1 - s_1')$. This flag will be set to $1$ when either $f_{hout}=1$ or $f_{sout}=1$ in the next row. +## Controller region -We also impose the following restrictions on how values in selector columns can be updated: +Each hash request is recorded as a pair of consecutive rows: -- Values in columns $s_1$ and $s_2$ must be copied over from one row to the next, unless $f_{out} = 1$ or $f_{out}' = 1$ indicating the `hout` or `sout` flag is set for the current or the next row. -- Value in $s_0$ must be set to $1$ if $f_{out}=1$ for the previous row, and to $0$ if any of the flags $f_{abp}$, $f_{mpa}$, $f_{mva}$, or $f_{mua}$ are set to $1$ for the previous row. +- **input row** (`s0 = 1`) contains the pre-permutation state, +- **output row** (`s0 = 0, s1 = 0`) contains the post-permutation state. -The above rules ensure that we must finish one computation before starting another, and we can't change the type of the computation before the computation is finished. +These two rows are the rows that participate in the chiplets bus. The controller +region is then padded to a multiple of `HASH_CYCLE_LEN = 16` before the +permutation segment begins. -## Computation examples +### Multi-batch sponge hashing -### Single permutation +Sequential hashing is represented as a chain of controller pairs: -Computing a single permutation of Poseidon2 hash function involves the following steps: +- first input row has `is_boundary = 1`, +- middle continuation rows have `is_boundary = 0`, +- final output row has `is_boundary = 1`. -1. Initialize hasher state with $12$ field elements. -2. Apply Poseidon2 permutation. -3. Return the entire hasher state as output. +Across continuation boundaries, the next input row overwrites the rate lanes but +must preserve the previous permutation's capacity word. This is enforced by the +AIR. -The chiplet accomplishes the above by executing the following instructions: +### Merkle operations -``` -[BP, HR] // init state and execute a hash round (concurrently) -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -SOUT // return the entire state as output -``` +For Merkle verification / update, the controller also carries: -Execution trace for this computation would look as illustrated below. +- `node_index`, +- `direction_bit`, +- `mrupdate_id` (for the old/new path pairing used by `MRUPDATE`). -| Row (mod 32) | $k_2$ | $k_1$ | $k_0$ | $s_0,s_1,s_2$ | RATE0 ($h_0..h_3$) | RATE1 ($h_4..h_7$) | CAP ($h_8..h_{11}$) | $i$ | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | 1 | 0 | 0 | BP | $a_0..a_3$ | $a_4..a_7$ | $a_8..a_{11}$ | $i$ | -| 1 | 0 | 0 | 0 | HR | permute | permute | permute | $i$ | -| ... | ... | ... | ... | ... | ... | ... | ... | ... | -| 31 | 0 | 0 | 1 | SOUT | $b_0..b_3$ | $b_4..b_7$ | $b_8..b_{11}$ | $i$ | +The controller AIR enforces: -In the above $\{a_0, ..., a_{11}\}$ is the input state of the hasher, and $\{b_0, ..., b_{11}\}$ is the output state of the hasher. +- index decomposition `idx = 2 * idx_next + direction_bit` on Merkle input rows, +- direction bit booleanity, +- continuity of the shifted index across non-final controller boundaries, +- zero capacity on Merkle input rows, +- digest routing into the correct rate half for the next path step. -### Simple 2-to-1 hash +## Permutation segment -Computing a 2-to-1 hash involves the following steps: +After the padded controller region, the chiplet appends one permutation cycle for + each unique input state. Each cycle has length **16**. -1. Initialize hasher state with $8$ field elements, setting the second capacity element to $domain$ if the domain is provided (as in the case of [control block hashing](../programs.md#program-hash-computation)) or else $0$, and the remaining capacity elements to $0$. -2. Apply Poseidon2 permutation. -3. Return elements $[0, 4)$ of the hasher state as output. +### Packed 16-row schedule -The chiplet accomplishes the above by executing the following instructions: +The 31-step Poseidon2 schedule -``` -[BP, HR] // init state and execute a hash round (concurrently) -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HOUT // return elements 0, 1, 2, 3 of the state as output (the digest) -``` +- init linear, +- 4 initial external rounds, +- 22 internal rounds, +- 4 terminal external rounds -Execution trace for this computation would look as illustrated below. +is packed into 16 rows as follows: -| Row (mod 32) | $k_2$ | $k_1$ | $k_0$ | $s_0,s_1,s_2$ | RATE0 ($h_0..h_3$) | RATE1 ($h_4..h_7$) | CAP ($h_8..h_{11}$) | $i$ | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | 1 | 0 | 0 | BP | $a_0..a_3$ | $b_0..b_3$ | $0,\,domain,\,0,\,0$ | $i$ | -| 1 | 0 | 0 | 0 | HR | permute | permute | permute | $i$ | -| ... | ... | ... | ... | ... | ... | ... | ... | ... | -| 31 | 0 | 0 | 1 | HOUT | $c_0..c_3$ | unused | unused | $i$ | +| Row | Meaning | +|-----|---------| +| 0 | `init + ext1` | +| 1 | `ext2` | +| 2 | `ext3` | +| 3 | `ext4` | +| 4 | `int1 + int2 + int3` | +| 5 | `int4 + int5 + int6` | +| 6 | `int7 + int8 + int9` | +| 7 | `int10 + int11 + int12` | +| 8 | `int13 + int14 + int15` | +| 9 | `int16 + int17 + int18` | +| 10 | `int19 + int20 + int21` | +| 11 | `int22 + ext5` | +| 12 | `ext6` | +| 13 | `ext7` | +| 14 | `ext8` | +| 15 | boundary / final state | -In the above, we compute the following: +The state stored on each permutation row is the **pre-transition** state for +that packed step, and row 15 stores the final permutation output. -$$ -\{c_0, c_1, c_2, c_3\} \leftarrow hash(\{a_0, a_1, a_2, a_3\}, \{b_0, b_1, b_2, b_3\}) -$$ +### Periodic columns -### Linear hash of n elements +The AIR uses 16 periodic columns: -Computing a linear hash of $n$ elements consists of the following steps: +- 4 step-type selectors: + - `is_init_ext`, + - `is_ext`, + - `is_packed_int`, + - `is_int_ext`, +- 12 shared round-constant columns. -1. Initialize hasher state with the first $8$ elements, setting the first capacity register to $0$ if $n$ is a multiple of the rate width ($8$) or else $1$, and the remaining capacity elements to $0$. -2. Apply Poseidon2 permutation. -3. Absorb the next set of elements into the state (up to $8$ elements), while keeping capacity elements unchanged. -4. Repeat steps 2 and 3 until all $n$ elements have been absorbed. -5. Return elements $[0, 4)$ of the hasher state as output. +The packed schedule uses the shared round-constant columns as follows: -The chiplet accomplishes the above by executing the following instructions (for hashing $16$ elements): +- external rows use all 12 external round constants, +- packed-internal rows use `ark[0..2]` for the 3 internal round constants, +- row 11 uses terminal external constants, while the final internal constant is + embedded directly in the constraint. -``` -[BP, HR] // init state and execute a hash round (concurrently) -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -ABP // absorb the next set of elements into the state -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR HR // execute 11 more hash rounds -HOUT // return elements 0, 1, 2, 3 of the state as output (the digest) -``` +### Witness columns on permutation rows -Execution trace for this computation would look as illustrated below. +On permutation rows, `(s0, s1, s2)` — the same physical columns that hold +the hasher-internal sub-selectors on controller rows — hold witness values +`(w0, w1, w2)`: -| Row (mod 32) | $k_2$ | $k_1$ | $k_0$ | $s_0,s_1,s_2$ | RATE0 ($h_0..h_3$) | RATE1 ($h_4..h_7$) | CAP ($h_8..h_{11}$) | $i$ | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | 1 | 0 | 0 | BP | $a_0..a_3$ | $a_4..a_7$ | $p,\,0,\,0,\,0$ | $i$ | -| 1 | 0 | 0 | 0 | HR | permute | permute | permute | $i$ | -| ... | ... | ... | ... | ... | ... | ... | ... | ... | -| 31 | 0 | 0 | 1 | ABP | $b_0..b_3$ | $b_4..b_7$ | (carry) | $i$ | -| 32 | 1 | 0 | 0 | BP | $b_0..b_3$ | $b_4..b_7$ | (carry) | $i$ | -| ... | ... | ... | ... | ... | ... | ... | ... | ... | -| 63 | 0 | 0 | 1 | HOUT | $r_0..r_3$ | unused | unused | $i$ | +- rows `4..10`: `w0, w1, w2` are the three S-box outputs for the packed + internal rounds, +- row `11`: `w0` is the S-box output for the final internal round, +- all other permutation rows: unused witness slots are constrained to zero. -In the above, the value absorbed into hasher state between rows $31$ and $32$ is the next batch of -$8$ input elements, which overwrite the rate lanes. Thus, if we define these elements as $b_i$ for -$i \in [0, 8)$, the above computes the following: +Reusing these physical columns as witnesses keeps the packed internal rows +within the degree-9 budget. -$$ -\{r_0, r_1, r_2, r_3\} \leftarrow hash(a_0, ..., a_7, b_0, ..., b_7) -$$ +The chiplet-level selectors `s_ctrl` and `s_perm` are the authoritative +sub-chiplet discriminators: any consumer that needs to interpret the shared +columns as controller sub-selectors must first gate on `s_ctrl = 1`. The +constraint code does this by gating on `s_ctrl = 1` via the precomputed chiplet +selectors, while permutation rows access the same physical columns as witnesses. -### Verify Merkle path +## Buses -Verifying a Merkle path involves the following steps: + -1. Initialize hasher state with the leaf and the first node of the path, setting all capacity elements to $0$s. - a. Also, initialize the index register to the leaf's index value. -2. Apply Poseidon2 permutation. - a. Make sure the index value doesn't change during this step. -3. Copy the result of the hash to the next row, and absorb the next node of the Merkle path into the hasher state. - a. Remove a single bit from the index, and use it to determine how to place the copied result and absorbed node in the state. -4. Repeat steps 2 and 3 until all nodes of the Merkle path have been absorbed. -5. Return elements $[0, 4)$ of the hasher state as output. - a. Also, make sure the index value has been reduced to $0$. +The hasher participates in three different lookup constructions. -The chiplet accomplishes the above by executing the following instructions (for Merkle tree of depth $3$): + -``` -[MP, HR] // init state and execute a hash round (concurrently) -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -MPA // copy result & absorb the next node into the state -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR HR // execute 11 more hash rounds -HOUT // return elements 0, 1, 2, 3 of the state as output (the digest) -``` +### 1. Chiplets bus (`b_chiplets`) + +The controller region sends and receives the chiplets-bus messages used by: + +- the decoder, +- the stack, +- the recursive verifier. + +Examples: + +- sponge start: full 12-lane state, +- sponge continuation: rate only, +- Merkle input: selected leaf word, +- return digest / return state. + +Permutation rows do **not** touch this bus. + +### 2. Hasher permutation-link on `v_wiring` + +A LogUp running sum links the controller rows to the permutation segment: + +- controller input rows contribute `+1/msg_in`, +- controller output rows contribute `+1/msg_out`, +- permutation row 0 contributes `-m/msg_in`, +- permutation row 15 contributes `-m/msg_out`, + +where `m` is the multiplicity stored in `node_index` on permutation rows. + +This is the mechanism that makes permutation deduplication sound. + +Because `v_wiring` is a shared bus, the AIR also forces it to stay constant on +rows where none of its stacked contributors are active. In particular, on +bitwise rows, kernel-ROM rows, and trailing chiplet padding rows, the hasher-side +wiring relation contributes an `idle_flag * delta` term so those rows cannot let +`v_wiring` drift before the final boundary. -Suppose we have a Merkle tree as illustrated below. This Merkle tree has $4$ leaves, each of which consists of $4$ field elements. For example, leaf $a$ consists of elements $a_0, a_1, a_2, a_3$, leaf be consists of elements $b_0, b_1, b_2, b_3$ etc. + -![hash_merkle_tree](../../img/design/chiplets/hasher/hash_merkle_tree.png) +### 3. Hash-kernel virtual table (`b_hash_kernel`) -If we wanted to verify that leaf $d$ is in fact in the tree, we'd need to compute the following hashes: +During `MRUPDATE`, the chiplet inserts sibling entries on the old-path leg and +removes them on the new-path leg. The running product must balance, ensuring +that both legs use the same siblings. -$$ -r \leftarrow hash(e, hash(c, d)) -$$ +## Main AIR obligations -And if $r = g$, we can be convinced that $d$ is in fact in the tree at position $3$. Execution trace for this computation would look as illustrated below. +At a high level, the hasher AIR enforces: -| Row (mod 32) | $k_2$ | $k_1$ | $k_0$ | $s_0,s_1,s_2$ | RATE0 ($h_0..h_3$) | RATE1 ($h_4..h_7$) | CAP ($h_8..h_{11}$) | $i$ | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | 1 | 0 | 0 | MP | $c_0..c_3$ | $d_0..d_3$ | $0,0,0,0$ | $3$ | -| 1 | 0 | 0 | 0 | HR | permute | permute | permute | $3$ | -| ... | ... | ... | ... | ... | ... | ... | ... | ... | -| 31 | 0 | 0 | 1 | MPA | $e_0..e_3$ | $f_0..f_3$ | $0,0,0,0$ | $3$ | -| 32 | 1 | 0 | 0 | MP | $e_0..e_3$ | $f_0..f_3$ | $0,0,0,0$ | $1$ | -| ... | ... | ... | ... | ... | ... | ... | ... | ... | -| 63 | 0 | 0 | 1 | HOUT | $g_0..g_3$ | unused | unused | $0$ | +- chiplet tri-state selector partition and transition rules for `s_ctrl` and + `s_perm` (in `selectors.rs`, shared with other chiplets), +- `s0/s1/s2` sub-selector booleanity on controller rows, +- well-formed controller `(input, output)` pairing (adjacency, output + non-adjacency, padding stability, first-row boundary), +- structural confinement on both sub-chiplets: `is_boundary`, `direction_bit`, + and `mrupdate_id` are zero on permutation rows, and `is_boundary` / + `direction_bit` are boolean on controller rows (`mrupdate_id` is a free + integer counter whose only controller-side rule is the progression below), +- packed Poseidon2 permutation transitions in the permutation segment, +- permutation cycle alignment (entry at cycle row 0, exit at cycle row 15) and + multiplicity constancy within a cycle, +- capacity preservation across sponge continuation boundaries, +- Merkle index decomposition, cross-step index continuity, direction-bit + forward propagation, digest routing, and capacity-zeroing rules, +- `mrupdate_id` progression on controller-to-controller transitions. -In the above, the prover provides values for nodes $c$ and $e$ non-deterministically. -The index $i$ remains constant throughout a permutation and is shifted at the `MPA` row, so it -changes only between cycles. +The high-degree Poseidon2 step constraints are gated by the degree-1 `s_perm` +selector and by periodic step selectors, which keeps the overall constraint +degree at the system's max of 9. -### Update Merkle root +## Detailed constraint structure -Updating a node in a Merkle tree (which also updates the root of the tree) can be simulated by verifying two Merkle paths: the path that starts with the old leaf and the path that starts with the new leaf. +The full set of constraints is split across: -Suppose we have the same Merkle tree as in the previous example, and we want to replace node $d$ with node $d'$. The computations we'd need to perform are: +- `air/src/constraints/chiplets/selectors.rs` — chiplet tri-state selector + system, booleanity, transition rules, precomputed `ChipletFlags`. +- `air/src/constraints/chiplets/hasher_control/` — controller sub-chiplet: + lifecycle, Merkle routing, capacity preservation, `mrupdate_id` progression. +- `air/src/constraints/chiplets/permutation/` — permutation sub-chiplet: cycle + alignment, multiplicity constancy, unused-column zeroing, packed Poseidon2 + step constraints. +- `air/src/constraints/chiplets/columns.rs` — `ControllerCols`, + `PermutationCols`, and `HasherPeriodicCols` definitions. -$$ -r \leftarrow hash(e, hash(c, d)) -r' \leftarrow hash(e, hash(c, d')) -$$ +This section does **not** attempt to describe every constraint. Instead, +it records the key structural constraints and representative formulas that +capture the key design decisions. -Then, as long as $r = g$, and the same values were used for $c$ and $e$ in both computations, we can be convinced that the new root of the tree is $r'$. +## Representative AIR formulas -The chiplet accomplishes the above by executing the following instructions: +The following formulas capture the most important structure of the current +hasher AIR. +### Controller selectors, lifecycle, and the tri-state selector system + +On **controller rows** (`s_ctrl = 1`), `s0/s1/s2` are ordinary sub-selectors. +On **permutation rows** (`s_perm = 1`), the same physical columns are witness +columns `w0/w1/w2`. The chiplet-level `s_ctrl` and `s_perm` are the authoritative +discriminators between the two sub-chiplets. + +The tri-state selector system in `selectors.rs` enforces: + +- booleanity of `s_ctrl`, `s_perm`, and their sum `s_ctrl + s_perm` (so at most + one can be 1 on any given row), +- transition rules: + - `s_ctrl = 1 → s_ctrl' + s_perm' = 1` (a controller row must be followed by + another controller row or the first permutation row), + - `s_perm = 1 → s_ctrl' = 0` (once in permutation, the hasher cannot return + to the controller), + - `s0 = 1 → s_ctrl' = 0 ∧ s_perm' = 0` (once in the non-hasher region, stay + there), +- a last-row invariant that forces `s_ctrl = s_perm = 0` on the final trace row, + so every chiplet's `is_active` flag vanishes there. + +Permutation cycle alignment (entry at cycle row 0, exit at cycle row 15) and +multiplicity constancy are enforced by the permutation sub-chiplet in +`permutation/mod.rs` using the precomputed `next_is_first` and `is_last` +flags from `ChipletFlags`. + +The first-row controller constraint is intentionally strong: + +```text +s_ctrl * s0 = 1 (on the first trace row) ``` -// verify the old merkle path -[MV, HR] // init state and execute a hash round (concurrently) -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -MVA // copy result & absorb the next node into the state -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR HR // execute 11 more hash rounds -HOUT // return elements 0, 1, 2, 3 of the state as output (the digest) - -// verify the new merkle path -[MU, HR] // init state and execute a hash round (concurrently) -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -MUA // copy result & absorb the next node into the state -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR // execute 10 more hash rounds -HR HR HR HR HR HR HR HR HR HR HR // execute 11 more hash rounds -HOUT // return elements 0, 1, 2, 3 of the state as output (the digest) + +This forces the first hasher row to be a controller *input* row (`s_ctrl = 1` +AND `s0 = 1`). Because `s0` is a witness column on permutation rows, this +also rules out a permutation row masquerading as the first row. + +The controller structure is then completed by: + +- input-row adjacency: an input row must be followed by an output row, +- output non-adjacency: two controller output rows cannot be adjacent, +- padding stability: once controller padding begins, no new controller operation + can appear after it. + +### Packed Poseidon2 transition constraints + +The permutation segment uses four transition types plus a boundary row. + +#### 1. Row 0: merged init + first external round + +The packed row-0 transition is: + +```text +h_next = M_E(S(M_E(h) + ark)) ``` -The semantics of `MV` and `MU` instructions are similar to the semantics of `MP` instruction from the previous example (and `MVA` and `MUA` are similar to `MPA`) with one important difference: `MV*` instructions add the absorbed node (together with its index in the tree) to permutation column $p_1$, while `MU*` instructions remove the absorbed node (together with its index in the tree) from $p_1$. Thus, if the same nodes were used during both Merkle path verification, the state of $p_1$ should not change. This mechanism is used to ensure that the same internal nodes were used in both computations. +This merges the initial external linear layer with the first external round while +keeping only one S-box layer over affine expressions. + +#### 2. Rows 1-3 and 12-14: single external rounds + +Each such row enforces: + +```text +h_next = M_E(S(h + ark)) +``` -## AIR constraints +where `ark` is the row's external round-constant vector. -When describing AIR constraints, we adopt the following notation: for column $x$, we denote the value in the current row simply as $x$, and the value in the next row of the column as $x'$. Thus, all transition constraints described in this note work with two consecutive rows of the execution trace. +#### 3. Rows 4-10: packed triples of internal rounds -### Selector columns constraints +These rows use the shared physical columns `(s0, s1, s2)` as witnesses +`(w0, w1, w2)` for the three internal-round S-box outputs. If we define: -For selector columns, first we must ensure that only binary values are allowed in these columns. This can be done with the following constraints: +- `y^(0) = h`, +- `w_k = (y^(k)[0] + ark_k)^7` for `k in {0,1,2}`, +- `y^(k+1) = M_I(y^(k) with lane 0 replaced by w_k)`, -$$ -s_0^2 - s_0 = 0 \text{ | degree} = 2 -s_1^2 - s_1 = 0 \text{ | degree} = 2 -s_2^2 - s_2 = 0 \text{ | degree} = 2 -$$ +then the row enforces: -Next, we need to make sure that unless $f_{out}=1$ or $f_{out}'=1$, the values in columns $s_1$ and $s_2$ are copied over to the next row. This can be done with the following constraints: +- three witness equations `w_k - (y^(k)[0] + ark_k)^7 = 0`, and +- `h_next = y^(3)`. -$$ -(s_1' - s_1) \cdot (1 - f_{out}') \cdot (1 - f_{out}) = 0 \text{ | degree} = 7 -(s_2' - s_2) \cdot (1 - f_{out}') \cdot (1 - f_{out}) = 0 \text{ | degree} = 7 -$$ +This is the core packing idea: the witness equations carry the nonlinearity, +while the final next-state relation stays affine in the trace columns. -Next, we need to enforce that if any of $f_{abp}, f_{mpa}, f_{mva}, f_{mua}$ flags is set to $1$, the next value of $s_0$ is $0$. In all other cases, $s_0$ should be unconstrained. These flags will only be set for rows that are 1 less than a multiple of 32 (the last row of each cycle). This can be done with the following constraint: +#### 4. Row 11: merged final internal round + first terminal external round -$$ -s_0' \cdot (f_{abp} + f_{mpa} + f_{mva} + f_{mua})= 0 \text{ | degree} = 5 -$$ +Row 11 uses only `w0` as a witness: -Lastly, we need to make sure that no invalid combinations of flags are allowed. This can be done with the following constraints: +```text +w0 = (h[0] + ARK_INT[21])^7 +``` -$$ -k_0 \cdot (1 - s_0) \cdot s_1 = 0 \text{ | degree} = 3 -$$ +Then: -The above constraints enforce that on every step which is one less than a multiple of $32$, if $s_0 = 0$, then $s_1$ must also be set to $0$. Basically, if we set $s_0=0$, then we must make sure that either $f_{hout}=1$ or $f_{sout}=1$. +```text +y = M_I(h with lane 0 replaced by w0) +h_next = M_E(S(y + ark)) +``` -### Node index constraints +The internal round constant `ARK_INT[21]` is hard-coded in the constraint +rather than read from a periodic column: row 11 is the only row gated by +`is_int_ext`, so a periodic column would waste 15 zero slots to deliver one +value. -Node index column $i$ is relevant only for Merkle path verification and Merkle root update computations, but to simplify the overall constraint system, the same constraints will be imposed on this column for all computations. +#### 5. Row 15: boundary / final state -Overall, we want values in the index column to behave as follows: +The final row of the packed cycle stores the final permutation output and has no +next-state permutation-step constraint. -- When we start a new computation, we should be able to set $i$ to an arbitrary value. -- When a computation is finished, value in $i$ must be $0$. -- When we absorb a new node into the hasher state we must shift the value in $i$ by one bit to the right. -- In all other cases value in $i$ should not change. +### Unused witness zeroing -A shift by one bit to the right can be described with the following equation: $i = 2 \cdot i' + b$, where $b$ is the value of the bit which is discarded. Thus, as long as $b$ is a binary value, the shift to the right is performed correctly, and this can be enforced with the following constraint: +Because the physical columns that hold `s0/s1/s2` on controller rows become +witnesses `w0/w1/w2` on permutation rows, the AIR constrains unused witness +slots to zero: -$$ -b^2 - b = 0 -$$ +- rows `0..3` and `12..15`: `w0 = w1 = w2 = 0`, +- row `11`: `w1 = w2 = 0`. -Since we want to enforce this constraint only when a new node is absorbed into the hasher state, we'll define a flag for when this should happen as follows: +Similarly, `mrupdate_id`, `is_boundary`, and `direction_bit` are forced to +zero on all permutation rows (see `PermutationCols::unused_padding()`). -$$ -f_{an} = f_{mp} + f_{mv} + f_{mu} + f_{mpa} + f_{mva} + f_{mua} -$$ +These constraints are primarily defensive: they make permutation rows inert +with respect to any constraint that might read the shared columns as if they +were controller sub-selectors or routing metadata. -And then the full constraint would looks as follows: +### Sponge continuation capacity preservation -$$ -f_{an} \cdot (b^2 - b) = 0 \text{ | degree} = 6 -$$ +For multi-batch sponge hashing, the next controller input row overwrites the rate +lanes but must preserve the previous permutation's capacity word. The AIR +therefore enforces capacity equality across controller continuation boundaries: -Next, to make sure when a computation is finished $i=0$, we can use the following constraint: +- only when the next row is a controller sponge input, +- only when that next row is not a boundary row. -$$ -f_{out} \cdot i = 0 \text{ | degree} = 4 -$$ +This is the key invariant that makes `RESPAN` represent continued sponge +absorption rather than a fresh hash. -Finally, to make sure that the value in $i$ is copied over to the next row unless we are absorbing a new row or the computation is finished, we impose the following constraint: +### Merkle controller constraints -$$ -(1 - f_{an} - f_{out}) \cdot (i' - i) = 0 \text{ | degree} = 5 -$$ +Merkle operations are expressed entirely in the controller region. -To satisfy these constraints for computations not related to Merkle paths (i.e., 2-to-1 hash and liner hash of elements), we can set $i = 0$ at the start of the computation. This guarantees that $i$ will remain $0$ until the end of the computation. +The AIR enforces: -### Hasher state constraints +- index decomposition on Merkle input rows: -Hasher state columns $h_0, ..., h_{11}$ should behave as follows: +```text +idx = 2 * idx_next + direction_bit +``` -- For the first $31$ rows of every $32$-row cycle (i.e., when $k_0=0$), we need to apply [Poseidon2](https://eprint.iacr.org/2023/323) round constraints to the hasher state. For brevity, we omit these constraints from this note. -- On the $32$nd row of every $32$-row cycle, we apply the constraints based on which transition flag is set as described in the table below. +- direction-bit booleanity on Merkle input rows, +- `direction_bit = 0` on sponge input rows and `HOUT` output rows (confinement), +- continuity of the shifted index across non-final output → next-input + boundaries, +- zero capacity on Merkle input rows, +- `node_index = 0` on sponge input rows and on digest-return (`HOUT`) rows. -Specifically, when absorbing the next set of elements into the state during linear hash computation (i.e., $f_{abp} = 1$), the last $4$ elements (the capacity portion) are carried over to the next row. For $j \in [0, 4)$ this can be described as follows: +In addition, on non-final Merkle boundaries the output row carries the next +step's `direction_bit` (forward propagation), allowing the AIR to route the +current digest into either `RATE0` or `RATE1` of the next Merkle input row. -$$ -f_{abp} \cdot (h'_{j+8} - h_{j+8}) = 0 \text{ | degree} = 5 -$$ +A small degree optimization is used for the Merkle-next gate: instead of +computing the full `f_merkle_input_next` (degree 3) to detect that the next +row is a Merkle input, the routing constraints use a lightweight +`s1' + s2'` expression (degree 1) which is nonzero exactly on Merkle inputs +(`(0,1), (1,0), (1,1)`) and zero on sponge inputs. The non-unit value `2` +on MU rows is harmless because the constraint is gated by `on_output * (1 - +is_boundary)`, and the digest routing equation is linear in the gate. A +malicious prover cannot bypass routing by mislabeling a Merkle input as +sponge: the chiplets bus would then fire a sponge message with no matching +decoder request. -When absorbing the next node during Merkle path computation (i.e., $f_{mp} + f_{mv} + f_{mu}=1$), the result of the previous hash ($h_0, ..., h_3$) is copied over either to $(h_0', ..., h_3')$ or to $(h_4', ..., h_7')$ depending on the value of $b$, which is defined in the same way as in the previous section. For $j \in [0, 4)$ this can be described as follows: +### `mrupdate_id` and sibling-table soundness -$$ -(f_{mp} + f_{mv} + f_{mu}) \cdot ((1 - b) \cdot (h_{j}' - h_{j}) + b \cdot (h_{j + 4}' - h_{j})) = 0 \text{ | degree} = 6 -$$ +`MRUPDATE` executes two Merkle legs: -Note, that when a computation is completed (i.e., $f_{out}=1$), the next hasher state is unconstrained. +- old-path verification, +- new-path verification. -### Multiset check constraints +To prevent sibling entries from different `MRUPDATE` operations from cancelling +against each other, the chiplet introduces a dedicated `mrupdate_id` column. +The AIR enforces: -In this sections we describe constraints which enforce updates for [multiset check columns](../lookups/multiset.md) $b_{chip}$ and $p_1$. These columns can be updated only on rows which are multiples of $32$ or $1$ less than a multiple of $32$. On all other rows the values in the columns remain the same. +- `mrupdate_id` increments once per `MRUPDATE` start, +- it stays constant through the old/new legs of that same update, +- it is zero on all permutation rows. -To simplify description of the constraints, we define the following variables. Below, we denote random values sent by the verifier after the prover commits to the main execution trace as $\alpha_0$, $\alpha_1$, $\alpha_2$ etc. +Sibling-table messages on `b_hash_kernel` include `mrupdate_id`, so the running +product only balances if the old and new paths of the **same** update use the +same siblings. -$$ -m = op_{label} + 2^4 \cdot k_2 + 2^5 \cdot k_0 -v_h = \alpha_0 + \alpha_1 \cdot m + \alpha_2 \cdot (clk + 1) + \alpha_3 \cdot i -v_a = \sum_{j=0}^{3}(\alpha_{j+4} \cdot h_j) -v_b = \sum_{j=0}^{3}(\alpha_{j+8} \cdot h_{j+4}) -v_c = \sum_{j=0}^{3}(\alpha_{j+12} \cdot h_{j+8}) -v_d = \sum_{j=0}^{3}(\alpha_{j+4} \cdot h_{j+4}) -$$ +### Bus constraints -Message slot layout is fixed: slots $0..3$ use $\alpha_{4..7}$, slots $4..7$ use -$\alpha_{8..11}$, and slots $8..11$ use $\alpha_{12..15}$. For partial messages, -we place the payload into slots $0..7$ and set capacity slots $8..11$ to zero. -Leaf/output messages use only slots $0..3$. +The hasher participates in three different lookup relations. -In the above: +#### Chiplets bus (`b_chiplets`) -- $m$ is a _transition label_, composed of the [operation label](./index.md#operation-labels) and the periodic columns that uniquely identify each transition function. The values in the $k_0$ and $k_2$ periodic columns are included to identify the row in the hash cycle where the operation occurs. They serve to differentiate between operations that share selectors but occur at different rows in the cycle, such as `BP`, which uses $op_{linhash}$ at the first row in the cycle to initiate a linear hash, and `ABP`, which uses $op_{linhash}$ at the last row in the cycle to absorb new elements. -- $v_h$ is a _common header_ which is a combination of the transition label, a unique row address, and the node index. For the unique row address, the `clk` column from the system component is used, but we add $1$, because the system's `clk` column starts at $0$. -- $v_a$, $v_b$, $v_c$ are the rate0, rate1, and capacity words (4 elements each). -- $v_d$ reuses the rate0 alpha slice on the rate1 word. This is used for Merkle leaf encoding - when the right child is selected. For next-row values, $v_d'$ is defined the same way using $h'$. +Only controller rows contribute here. The chiplets bus carries the external VM +interface messages: -#### Chiplets bus constraints +- full-state sponge start, +- rate-only sponge continuation, +- selected Merkle leaf word, +- digest return, +- full-state return. -As described previously, the [chiplets bus](./index.md#chiplets-bus) $b_{chip}$, implemented as a running product column, is used to tie the hash chiplet with the main VM's stack and decoder. When receiving inputs from or returning results to the stack (or decoder), the hash chiplet multiplies $b_{chip}$ by their respective values. On the other side, when sending inputs to the hash chiplet or receiving results from the chiplet, the stack (or decoder) divides $b_{chip}$ by their values. +Permutation rows do not contribute. -In the section below we describe only the hash chiplet side of the constraints (i.e., multiplying $b_{chip}$ by relevant values). We define the values which are to be multiplied into $b_{chip}$ for each operation as follows: +#### Permutation-link LogUp on `v_wiring` -When starting a new simple or linear hash computation (i.e., $f_{bp}=1$) or when returning the entire state of the hasher ($f_{sout}=1$), the entire hasher state is included into $b_{chip}$: +The permutation-link relation binds controller requests to the permutation +segment by balancing: -$$ -v_{all} = v_h + v_a + v_b + v_c -$$ +- controller input rows against permutation row `0`, and +- controller output rows against permutation row `15`. -When starting a Merkle path computation (i.e., $f_{mp} + f_{mv} + f_{mu} = 1$), we include the leaf of the path into $b_{chip}$. The leaf is selected from the state based on value of $b$ (defined as in the previous section): +In common-denominator form, the hasher-side AIR enforces: -$$ -v_{leaf} = v_h + (1-b) \cdot v_a + b \cdot v_d -$$ +```text +hasher_flag * (delta * msg_in * msg_out + - msg_out * (f_in - f_p_in * m) + - msg_in * (f_out - f_p_out * m)) ++ idle_flag * delta +``` -When absorbing a new set of elements into the state while computing a linear hash (i.e., $f_{abp}=1$), we include the next rate (state slots $0..7$) into $b_{chip}$: +where `m` is the permutation multiplicity and `idle_flag` covers rows where the +shared `v_wiring` accumulator must propagate unchanged. -$$ -v_{abp} = v_h + v_a' + v_b' -$$ +This is the core mechanism for memoization. -When a computation is complete (i.e., $f_{hout}=1$), we include the first rate word of the hasher state (the result) into $b_{chip}$: +#### Hash-kernel virtual table (`b_hash_kernel`) -$$ -v_{res} = v_h + v_a -$$ +The hasher uses this running product for two logically separate purposes: -Using the above values, we can describe the constraints for updating column $b_{chip}$ as follows. +- sibling-table balancing for `MRUPDATE`, +- precompile transcript state tracking for `LOG_PRECOMPILE`. -$$ -b_{chip}' = b_{chip} \cdot ((f_{bp} + f_{sout}) \cdot v_{all} + (f_{mp} + f_{mv} + f_{mu}) \cdot v_{leaf} + f_{abp} \cdot v_{abp} + f_{hout} \cdot v_{res} + -1 - (f_{bp} + f_{mp} + f_{mv} + f_{mu} + f_{abp} + f_{out})) -$$ +For the sibling-table part, the old-path leg inserts siblings and the new-path +leg removes them. Because the entries are keyed by `(mrupdate_id, node_index, +sibling_word)`, unrelated updates cannot cancel each other. -The above constraint reduces to the following under various flag conditions: +## Implementation map -| Condition | Applied constraint | -| -------------- | ------------------------------------- | -| $f_{bp} = 1$ | $b_{chip}' = b_{chip} \cdot v_{all}$ | -| $f_{sout} = 1$ | $b_{chip}' = b_{chip} \cdot v_{all}$ | -| $f_{mp} = 1$ | $b_{chip}' = b_{chip} \cdot v_{leaf}$ | -| $f_{mv} = 1$ | $b_{chip}' = b_{chip} \cdot v_{leaf}$ | -| $f_{mu} = 1$ | $b_{chip}' = b_{chip} \cdot v_{leaf}$ | -| $f_{abp} = 1$ | $b_{chip}' = b_{chip} \cdot v_{abp}$ | -| $f_{hout} = 1$ | $b_{chip}' = b_{chip} \cdot v_{res}$ | -| Otherwise | $b_{chip}' = b_{chip}$ | +The hasher design is implemented across the following files: -Note that the degree of the above constraint is $7$. +- `air/src/constraints/chiplets/selectors.rs` + Chiplet-level tri-state selector system (`s_ctrl`, `s_perm`, virtual `s0`, + `s1..s4`), booleanity, transition rules, last-row invariant, and precomputed + `ChipletFlags` (`is_active`, `is_transition`, `is_last`, `next_is_first`) for + every chiplet. -#### Sibling table constraints +- `air/src/constraints/chiplets/hasher_control/mod.rs` + Controller sub-chiplet entry point: first-row boundary, sub-selector + booleanity, input/output/padding adjacency, `mrupdate_id` progression, + RESPAN capacity preservation. -_Note: Although this table is described independently, it is implemented as part of the [chiplets virtual table](../chiplets/index.md#chiplets-virtual-table), which combines all virtual tables required by any of the chiplets into a single master table._ +- `air/src/constraints/chiplets/hasher_control/flags.rs` + Pre-computed `ControllerFlags` struct: sub-operation flags + (`on_sponge`, `on_merkle_input`, `on_hout`, `on_sout`, `on_padding`) and + next-row flags used by transition constraints. -As mentioned previously, the sibling table (represented by running column $p_1$) is used to keep track of sibling nodes used during Merkle root update computations. For this computation, we need to enforce the following rules: +- `air/src/constraints/chiplets/hasher_control/merkle.rs` + Merkle index decomposition, direction-bit booleanity/confinement/forward + propagation, zero-capacity rule for Merkle inputs, cross-step index + continuity, and digest routing. -- When computing the old Merkle root, whenever a new sibling node is absorbed into the hasher state (i.e., $f_{mv} + f_{mva} = 1$), an entry for this sibling should be included into $p_1$. -- When computing the new Merkle root, whenever a new sibling node is absorbed into the hasher state (i.e., $f_{mu} + f_{mua} = 1$), the entry for this sibling should be removed from $p_1$. +- `air/src/constraints/chiplets/permutation/mod.rs` + Permutation sub-chiplet entry point: Poseidon2 step gating, cycle alignment + (entry at row 0, exit at row 15), multiplicity constancy, and structural + zeroing of unused metadata columns. -To simplify the description of the constraints, we use variables $v_a$ and $v_b$ defined above and define the value representing an entry in the sibling table as follows: +- `air/src/constraints/chiplets/permutation/state.rs` + Packed 16-row Poseidon2 transition constraints and unused-witness zeroing. -$$ -v_{sib0} = \alpha_0 + \alpha_3 \cdot i + v_b +- `air/src/constraints/chiplets/columns.rs` + `ControllerCols`, `PermutationCols`, and `HasherPeriodicCols` (including the + packed 16-row schedule and round-constant encoding). -v_{sib1} = \alpha_0 + \alpha_3 \cdot i + v_a +- `air/src/constraints/chiplets/bus/chiplets.rs` + Hasher messages visible to the rest of the VM via `b_chiplets`. -v_{sibling} = (1-b) \cdot v_{sib0} + b \cdot v_{sib1} -$$ +- `air/src/constraints/chiplets/bus/wiring.rs` + Controller-to-permutation perm-link relation on the shared `v_wiring` + column. -Using the above value, we can define the constraint for updating $p_1$ as follows: +- `air/src/constraints/chiplets/bus/hash_kernel.rs` + Sibling-table balancing and `log_precompile`-related hasher interactions + on `b_hash_kernel`. -$$ -p_1' \cdot \left( (f_{mv} + f_{mva}) \cdot v_{sibling} + 1 - (f_{mv} + f_{mva}) \right) = -p_1 \cdot \left( (f_{mu} + f_{mua}) \cdot v_{sibling} + 1 - (f_{mu} + f_{mua}) \right) -$$ +- `processor/src/trace/chiplets/hasher/trace.rs` + Trace generation for the controller and packed permutation segment. -The above constraint reduces to the following under various flag conditions: +- `processor/src/trace/chiplets/aux_trace/hasher_perm.rs` + Auxiliary trace generation for the perm-link running sum. -| Condition | Applied constraint | -| ------------- | ------------------------------ | -| $f_{mv} = 1$ | $p_1' \cdot v_{sibling} = p_1$ | -| $f_{mva} = 1$ | $p_1' \cdot v_{sibling} = p_1$ | -| $f_{mu} = 1$ | $p_1' = p_1 \cdot v_{sibling}$ | -| $f_{mua} = 1$ | $p_1' = p_1 \cdot v_{sibling}$ | -| Otherwise | $p_1' = p_1$ | +## Soundness-critical design points -Note that the degree of the above constraint is $7$. +A few aspects of the packed design are especially important: -To make sure computation of the old Merkle root is immediately followed by the computation of the new Merkle root, we impose the following constraint: +1. **Controller/permutation separation.** Only controller rows can interact with + the external chiplets bus; only permutation rows can satisfy the packed + Poseidon2 transition constraints. +2. **Cycle alignment.** The permutation segment can start only at cycle row 0 and + can end only at cycle row 15. +3. **Multiplicity constancy.** `node_index` is constant inside a permutation + cycle, so a single multiplicity is attached to the whole cycle. +4. **Witness reuse hardening.** Unused witness slots are forced to zero, and the + first-row controller constraint explicitly forbids a permutation row from + masquerading as the first controller row. -$$ -(f_{bp} + f_{mp} + f_{mv}) \cdot (1 - p_1) = 0 \text{ | degree} = 5 -$$ +## References -The above means that whenever we start a new computation which is not the computation of the new Merkle root, the sibling table must be empty. Thus, after the hash chiplet computes the old Merkle root, the only way to clear the table is to compute the new Merkle root. +Implementation files: -Together with boundary constraints enforcing that $p_1=1$ at the first and last rows of the running product column which implements the sibling table, the above constraints ensure that if a node was included into $p_1$ as a part of computing the old Merkle root, the same node must be removed from $p_1$ as a part of computing the new Merkle root. These two boundary constraints are described as part of the [chiplets virtual table constraints](../chiplets/index.md#chiplets-virtual-table-constraints). +- `air/src/constraints/chiplets/selectors.rs` +- `air/src/constraints/chiplets/columns.rs` +- `air/src/constraints/chiplets/hasher_control/mod.rs` +- `air/src/constraints/chiplets/hasher_control/flags.rs` +- `air/src/constraints/chiplets/hasher_control/merkle.rs` +- `air/src/constraints/chiplets/permutation/mod.rs` +- `air/src/constraints/chiplets/permutation/state.rs` +- `air/src/constraints/chiplets/bus/chiplets.rs` +- `air/src/constraints/chiplets/bus/wiring.rs` +- `air/src/constraints/chiplets/bus/hash_kernel.rs` +- `processor/src/trace/chiplets/hasher/trace.rs` +- `processor/src/trace/chiplets/aux_trace/hasher_perm.rs` diff --git a/docs/src/design/chiplets/index.md b/docs/src/design/chiplets/index.md index 2472a6c878..f841ba994d 100644 --- a/docs/src/design/chiplets/index.md +++ b/docs/src/design/chiplets/index.md @@ -23,7 +23,7 @@ The execution trace of the Chiplets module is generated by stacking the executio Each chiplet is identified within the Chiplets module by one or more chiplet selector columns which cause its constraints to be selectively applied. -The result is an execution trace of 18 trace columns, which allows space for the widest chiplet component (the hash chiplet) and a column to select for it. +The result is an execution trace of 21 trace columns, which allows space for the widest chiplet component (the hash chiplet, at 20 internal columns) plus the shared chiplet selector prefix. ![chiplets](../../img/design/chiplets/chiplets.png) @@ -43,9 +43,9 @@ The resulting order is as follows: | Chiplet | Cycle Length | Internal Degree | Chiplet Selector Degree | Total Degree | Columns | Chiplet Selector Flag | | --------------- | :----------: | :-------------: | :---------------------: | :----------: | :-----: | --------------------- | -| Hash chiplet | 32 | 8 | 1 | 9 | 17 | $\{0\}$ | +| Hash chiplet | 16 | 8 | 1 | 9 | 20 | $\{0\}$ | | Bitwise chiplet | 8 | 3 | 2 | 5 | 13 | $\{1, 0\}$ | -| Memory | - | 6 | 3 | 9 | 12 | $\{1, 1, 0\}$ | +| Memory | - | 6 | 3 | 9 | 17 | $\{1, 1, 0\}$ | | ACE | - | 5 | 4 | 9 | 16 | $\{1, 1, 1, 0\}$ | | Kernel ROM | - | 3 | 5 | 8 | 5 | $\{1, 1, 1, 1, 0\}$ | | Padding | - | - | - | - | - | $\{1, 1, 1, 1, 1\}$ | @@ -58,7 +58,7 @@ This is true for any transition constraints that are applied at every row and se This requires the following adjustments for each chiplet. -**In the hash chiplet:** there is no conflict, and therefore no change, since all constraints are periodic. +**In the hash chiplet:** the permutation-step constraints are periodic, while the controller constraints explicitly confine the controller/permutation boundary. The controller region is padded to a multiple of the 16-row cycle before the permutation segment begins, so no extra inter-chiplet alignment rows are required. **In the bitwise chiplet:** there is no conflict, and therefore no change, since all constraints are periodic. diff --git a/docs/src/design/decoder/constraints.md b/docs/src/design/decoder/constraints.md index 76f58a7f50..8055b9fa28 100644 --- a/docs/src/design/decoder/constraints.md +++ b/docs/src/design/decoder/constraints.md @@ -68,10 +68,10 @@ Also, when `REPEAT` operation is executed, the value in $h_4$ column (the `is_lo > f_{repeat} \cdot (1 - h_4) = 0 \text{ | degree} = 5 > $$ -When `RESPAN` operation is executed, we need to make sure that the block ID is incremented by $32$: +When `RESPAN` operation is executed, we need to make sure that the block ID is incremented by $2$: > $$ -> f_{respan} \cdot (a' - a - 32) = 0 \text{ | degree} = 5 +> f_{respan} \cdot (a' - a - 2) = 0 \text{ | degree} = 5 > $$ When `END` operation is executed and we are exiting a *loop* block (i.e., `is_loop`, value which is stored in $h_5$, is $1$), the value at the top of the operand stack must be $0$: @@ -139,9 +139,9 @@ When the value in `in_span` column is set to $1$, control flow operations cannot ## Block hash computation constraints As described [previously](./index.md#program-block-hashing), when the VM starts executing a new block, it also initiates computation of the block's hash. There are two separate methodologies for computing block hashes. -For *join* and *split* blocks, the hash is computed directly from the hashes of the block's children. The prover provides these child hashes non-deterministically by populating registers $h_0,..., h_7$. For *loop* blocks, only the loop body hash is provided in $h_0..h_3$ and the remaining registers $h_4..h_7$ are set to $0$ (padding to a full 8-element rate). For *dyn*, only the second half of the hasher registers ($h_4,\dots,h_7$) are forced to $0$, while the first half holds the callee digest read from memory; thus the input is not all zeros. The hasher is initialized using the hash chiplet, and we use the address of the hasher as the block's ID. The result of the hash is available $31$ rows down in the hasher table (i.e., at row with index equal to block ID plus $31$). We read the result from the hasher table at the time the `END` operation is executed for a given block. +For *join* and *split* blocks, the hash is computed directly from the hashes of the block's children. The prover provides these child hashes non-deterministically by populating registers $h_0,..., h_7$. For *loop* blocks, only the loop body hash is provided in $h_0..h_3$ and the remaining registers $h_4..h_7$ are set to $0$ (padding to a full 8-element rate). For *dyn*, only the second half of the hasher registers ($h_4,\dots,h_7$) are forced to $0$, while the first half holds the callee digest read from memory; thus the input is not all zeros. The hasher is initialized using the hash chiplet, and we use the address of the controller input row as the block's ID. The result of the hash is then available in the paired controller output row at block ID plus $1$, and we read that result when the `END` operation is executed for the block. -For *basic* blocks, the hash is computed by absorbing a linear sequence of instructions (organized into operation groups and batches) into the hasher and then returning the result. The prover provides operation batches non-deterministically by populating registers $h_0, ..., h_7$. Similarly to other blocks, the hasher is initialized using the hash chiplet at the start of the block, and we use the address of the hasher as the ID of the first operation batch in the block. As we absorb additional operation batches into the hasher (by executing `RESPAN` operation), the batch address is incremented by $32$. This moves the "pointer" into the hasher table $32$ rows down with every new batch. We read the result from the hasher table at the time the `END` operation is executed for a given block. +For *basic* blocks, the hash is computed by absorbing a linear sequence of instructions (organized into operation groups and batches) into the hasher and then returning the result. The prover provides operation batches non-deterministically by populating registers $h_0, ..., h_7$. Similarly to other blocks, the hasher is initialized using the hash chiplet at the start of the block, and we use the address of the first controller input row as the ID of the first operation batch in the block. As we absorb additional operation batches into the hasher (by executing `RESPAN`), the next batch starts at the next controller input row, so the batch address is incremented by $2$. We read the result from the controller output row corresponding to the final batch when the `END` operation is executed for the block. ### Chiplets bus constraints @@ -182,13 +182,13 @@ $$ $$ h_{respan} = -\alpha_0 + \alpha_1 \cdot L_{respan} + \alpha_2 \cdot (a' - 1) +\alpha_0 + \alpha_1 \cdot L_{respan} + \alpha_2 \cdot a' + \sum_{i=0}^7(\alpha_{4+i} \cdot h_i) $$ $$ h_{end} = -\alpha_0 + \alpha_1 \cdot L_{end} + \alpha_2 \cdot (a + 31) +\alpha_0 + \alpha_1 \cdot L_{end} + \alpha_2 \cdot (a + 1) + \sum_{i=0}^3(\alpha_{4+i} \cdot h_i) $$ @@ -520,7 +520,7 @@ When we are inside a *basic* block, values in block address columns (denoted as > sp \cdot (a' - a) = 0 \text{ | degree} = 2 > $$ -Notice that this constraint does not apply when we execute any of the control flow operations. For such operations, the prover sets the value of the $a$ column non-deterministically, except for the `RESPAN` operation. For the `RESPAN` operation the value in the $a$ column is incremented by $32$, which is enforced by a constraint described previously. +Notice that this constraint does not apply when we execute any of the control flow operations. For such operations, the prover sets the value of the $a$ column non-deterministically, except for the `RESPAN` operation. For the `RESPAN` operation the value in the $a$ column is incremented by $2$, which is enforced by a constraint described previously. Notice also that this constraint implies that when the next operation is the `END` operation, the value in the $a$ column must also be copied over to the next row. This is exactly the behavior we want to enforce so that when the `END` operation is executed, the block address is set to the address of the current span batch. diff --git a/docs/src/design/decoder/index.md b/docs/src/design/decoder/index.md index 5edd45ac4a..68e91d5e85 100644 --- a/docs/src/design/decoder/index.md +++ b/docs/src/design/decoder/index.md @@ -133,8 +133,8 @@ These registers have the following meanings: To compute hashes of program blocks, the decoder relies on the [hash chiplet](../chiplets/hasher.md). Specifically, the decoder needs to perform two types of hashing operations: -1. A simple 2-to-1 hash, where we provide a sequence of $8$ field elements, and get back $4$ field elements representing the result. Computing such a hash requires $32$ rows in the hash chiplet. -2. A sequential hash of $n$ elements. Computing such a hash requires multiple absorption steps, and at each step $8$ field elements are absorbed into the hasher. Thus, computing a sequential hash of $n$ elements requires $32 \cdot \lceil {n/8} \rceil$ rows in the hash chiplet. At the end, we also get $4$ field elements representing the result. +1. A simple 2-to-1 hash, where we provide a sequence of $8$ field elements and get back $4$ field elements representing the result. In the controller/permutation split hasher design, this is represented by one controller pair plus one packed 16-row permutation cycle for the corresponding input state. +2. A sequential hash of $n$ elements. This requires multiple absorption steps, and at each step $8$ field elements are absorbed into the hasher. At the controller level, each absorbed batch contributes one `(input, output)` controller pair, so the controller addresses for successive batches advance by $2$. To make hashing requests to the hash chiplet and to read the results from it, we will need to divide out relevant values from the [chiplets bus](../chiplets/index.md#chiplets-bus) column $b_{chip}$ as described below. @@ -154,7 +154,7 @@ where: To read the $4$-element result ($u_0, ..., u_3$), we need to divide $b_{chip}$ by the following value: $$ -\alpha_0 + \alpha_1 \cdot m_{hout} + \alpha_2 \cdot (r + 31) + \sum_{i=0}^3 (\alpha_{i+4} \cdot u_i) +\alpha_0 + \alpha_1 \cdot m_{hout} + \alpha_2 \cdot (r + 1) + \sum_{i=0}^3 (\alpha_{i+4} \cdot u_i) $$ where: @@ -172,7 +172,7 @@ $$ This also absorbs the first $8$ elements of the sequence into the hasher state. Then, to absorb the next sequence of $8$ elements (e.g., $v_8, ..., v_{15}$), we need to divide $b_{chip}$ by the following value: $$ -\alpha_0 + \alpha_1 \cdot m_{abp} + \alpha_2 \cdot (r + 31) + \sum_{i=0}^7 (\alpha_{i+4} \cdot v_{i + 8}) +\alpha_0 + \alpha_1 \cdot m_{abp} + \alpha_2 \cdot (r + 2) + \sum_{i=0}^7 (\alpha_{i+4} \cdot v_{i + 8}) $$ Where $m_{abp}$ is a label indicating absorption of more elements into the hasher state. Value of this label is computed based on hash chiplet selector flags according to the methodology described [here](../chiplets/hasher.md#multiset-check-constraints). @@ -180,10 +180,10 @@ Where $m_{abp}$ is a label indicating absorption of more elements into the hashe We can keep absorbing elements into the hasher in the similar manner until all elements have been absorbed. Then, to read the result (e.g., $u_0, ..., u_3$), we need to divide $b_{chip}$ by the following value: $$ -\alpha_0 + \alpha_1 \cdot m_{hout} + \alpha_2 \cdot (r + \lceil n / 8 \rceil \cdot 32 - 1) + \sum_{i=0}^3 (\alpha_{i+4} \cdot u_i) +\alpha_0 + \alpha_1 \cdot m_{hout} + \alpha_2 \cdot (r + 2 \cdot \lceil n / 8 \rceil - 1) + \sum_{i=0}^3 (\alpha_{i+4} \cdot u_i) $$ -Thus, for example, if $n = 14$, the result of the hash will be available at hasher row $r + 63$. +Thus, for example, if $n = 14$, the result of the hash is available at controller output row $r + 3$ (two absorbed batches). ### Control flow tables @@ -394,7 +394,7 @@ When the VM executes an `END` operation, it does the following: - in the above, the `x_next` variables denote the column `x` in the next row - else, we remove a row `(blk, prnt, f1, 0, 0, 0, 0, 0)` 2. Removes a tuple `(prnt, current_block_hash, nxt, f0)` from the block hash table, where $nxt=0$ if the next operation is either `END` or `REPEAT`, and $1$ otherwise. -3. Reads the hash result from the hash chiplet (as described [here](#program-block-hashing)) using `blk + 31` as row address in the auxiliary hashing table. +3. Reads the hash result from the hash chiplet (as described [here](#program-block-hashing)) using `blk + 1` as the controller output row address. 4. If $h_5 = 1$ (i.e., we are exiting a *loop* block), pops the value off the top of the stack and verifies that the value is $0$. 5. Verifies that `group_count` register is set to $0$. @@ -438,14 +438,14 @@ In the above diagram, `g0_op0` is the first operation of the new operation batch When the VM executes a `RESPAN` operation, it does the following: -1. Increments block address by $32$. +1. Increments block address by $2$. 2. Removes the tuple `(blk, prnt, 0, 0...)` from the block stack table. -3. Adds the tuple `(blk+32, prnt, 0, 0...)` to the block stack table. +3. Adds the tuple `(blk+2, prnt, 0, 0...)` to the block stack table. 4. Absorbs values in registers $h_0, ..., h_7$ into the hasher state of the hash chiplet (as described [here](#sequential-hash)). 5. Sets the `in_span` register to $1$. -6. Adds groups of the operation batch, as specified by op batch flags (see [here](#operation-batch-flags)) to the op group table using `blk+32` as batch ID. +6. Adds groups of the operation batch, as specified by op batch flags (see [here](#operation-batch-flags)) to the op group table using `blk+2` as batch ID. -The net result of the above is that we incremented the ID of the current block by $32$ and added the next set of operation groups to the op group table. +The net result of the above is that we incremented the ID of the current block by $2$ (the next controller input row) and added the next set of operation groups to the op group table. #### CALL operation @@ -650,9 +650,9 @@ First, after the `SPAN` operation is executed, the op group table will look as f Notice that while the same groups ($g_1, ..., g_7$) are added to the table, their positions now reflect the total number of groups in the *basic* block. -Second, executing a `RESPAN` operation increments hasher address by $32$. This is done because absorbing additional $8$ elements into the hasher state requires $32$ more rows in the auxiliary hasher table. +Second, executing a `RESPAN` operation increments the hasher controller address by $2$. This is done because each absorbed batch is represented by one controller pair `(input, output)`, so the next batch starts at the next controller input row. -Incrementing value of `addr` register actually changes the ID of the *basic* block (though, for a *basic* block, it may be more appropriate to view values in this column as IDs of individual operation batches). This means that we also need to update the block stack table. Specifically, we need to remove row `(blk, prnt, 0)` from it, and replace it with row `(blk + 32, prnt, 0)`. To perform this operation, the prover sets the value of $h_1` in the next row to `prnt`. +Incrementing value of `addr` register actually changes the ID of the *basic* block (though, for a *basic* block, it may be more appropriate to view values in this column as IDs of individual operation batches). This means that we also need to update the block stack table. Specifically, we need to remove row `(blk, prnt, 0)` from it, and replace it with row `(blk + 2, prnt, 0)`. To perform this operation, the prover sets the value of $h_1` in the next row to `prnt`. Executing a `RESPAN` operation also adds groups $g_9, g_{10}, g_{11}$ to the op group table, which now would look as follows: @@ -660,7 +660,7 @@ Executing a `RESPAN` operation also adds groups $g_9, g_{10}, g_{11}$ to the op Then, the execution of the second batch proceeds in a manner similar to the first batch: we remove operations from the current op group, execute them, and when the value of the op group reaches $0$, we start executing the next group in the batch. Thus, by the time we get to the `END` operation, the op group table should be empty. -When executing the `END` operation, the hash of the *basic* block will be read from hasher row at address `addr + 31`, which, in our example, will be equal to `blk + 63`. +When executing the `END` operation, the hash of the *basic* block will be read from the paired controller output row at address `addr + 1`, which, in our example, will be equal to `blk + 3` after one `RESPAN`. #### Handling immediate values diff --git a/docs/src/design/index.md b/docs/src/design/index.md index 81705a1364..f2745bcf98 100644 --- a/docs/src/design/index.md +++ b/docs/src/design/index.md @@ -40,7 +40,7 @@ Miden VM consists of several interconnected components, each providing a specifi The above components are connected via **buses**, which are implemented using [lookup arguments](./lookups/index.md). We also use [multiset check lookups](./lookups/multiset.md) internally within components to describe **virtual tables**. ## VM execution trace -The execution trace of Miden VM consists of $71$ main trace columns, $2$ buses, and $5$ virtual tables, as shown in the diagram below. +The execution trace of Miden VM consists of $72$ main trace columns and $8$ auxiliary columns (running products / LogUp accumulators), as shown in the diagram below. ![vm_trace.png](../img/design/vm_trace.png) diff --git a/docs/src/design/stack/crypto_ops.md b/docs/src/design/stack/crypto_ops.md index e8bdc1412b..0fae3d08d6 100644 --- a/docs/src/design/stack/crypto_ops.md +++ b/docs/src/design/stack/crypto_ops.md @@ -24,7 +24,7 @@ v_{input} = \alpha_0 + \alpha_1 \cdot op_{linhash} + \alpha_2 \cdot h_0 + \sum_{ $$ $$ -v_{output} = \alpha_0 + \alpha_1 \cdot op_{retstate} + \alpha_2 \cdot (h_0 + 31) + \sum_{j=0}^{11} (\alpha_{j+4} \cdot s_j') +v_{output} = \alpha_0 + \alpha_1 \cdot op_{retstate} + \alpha_2 \cdot (h_0 + 1) + \sum_{j=0}^{11} (\alpha_{j+4} \cdot s_j') $$ In the above, $op_{linhash}$ and $op_{retstate}$ are the unique [operation labels](../chiplets/index.md#operation-labels) for initiating a linear hash and reading the full state of the hasher respectively. Also note that the term for $\alpha_3$ is missing from the above expressions because for Poseidon2 permutation computation the index column is expected to be set to $0$. @@ -35,7 +35,7 @@ $$ b_{chip}' \cdot v_{input} \cdot v_{output} = b_{chip} \text{ | degree} = 3 $$ -The above constraint enforces that the specified input and output rows must be present in the trace of the hash chiplet, and that they must be exactly $31$ rows apart. +The above constraint enforces that the specified input and output controller rows must be present in the trace of the hash chiplet. In the controller/permutation split design these rows are consecutive, so their addresses differ by exactly $1$. The effect of this operation on the rest of the stack is: * **No change** starting from position $12$. @@ -62,7 +62,7 @@ v_{input} = \alpha_0 + \alpha_1 \cdot op_{mpver} + \alpha_2 \cdot h_0 + \alpha_3 $$ $$ -v_{output} = \alpha_0 + \alpha_1 \cdot op_{rethash} + \alpha_2 \cdot (h_0 + 32 \cdot s_4 - 1) + \sum_{j=0}^3\alpha_{j + 4} \cdot s_{6 + j} +v_{output} = \alpha_0 + \alpha_1 \cdot op_{rethash} + \alpha_2 \cdot (h_0 + 2 \cdot s_4 - 1) + \sum_{j=0}^3\alpha_{j + 4} \cdot s_{6 + j} $$ In the above, $op_{mpver}$ and $op_{rethash}$ are the unique [operation labels](../chiplets/index.md#operation-labels) for initiating a Merkle path verification computation and reading the hash result respectively. The sum expression for inputs computes the value of the leaf node, while the sum expression for the output computes the value of the tree root. @@ -73,7 +73,7 @@ $$ b_{chip}' \cdot v_{input} \cdot v_{output} = b_{chip} \text{ | degree} = 3 $$ -The above constraint enforces that the specified input and output rows must be present in the trace of the hash chiplet, and that they must be exactly $32 \cdot d - 1$ rows apart, where $d$ is the depth of the node. +The above constraint enforces that the specified input and output controller rows must be present in the trace of the hash chiplet, and that they must be exactly $2 \cdot d - 1$ rows apart, where $d$ is the depth of the node. Each Merkle level contributes one controller pair `(input, output)`. The effect of this operation on the rest of the stack is: * **No change** starting from position $0$. @@ -101,15 +101,15 @@ v_{inputold} = \alpha_0 + \alpha_1 \cdot op_{mruold} + \alpha_2 \cdot h_0 + \alp $$ $$ -v_{outputold} = \alpha_0 + \alpha_1 \cdot op_{rethash} + \alpha_2 \cdot (h_0 + 32 \cdot s_4 - 1) + \sum_{j=0}^3\alpha_{j + 4} \cdot s_{6 + j} +v_{outputold} = \alpha_0 + \alpha_1 \cdot op_{rethash} + \alpha_2 \cdot (h_0 + 2 \cdot s_4 - 1) + \sum_{j=0}^3\alpha_{j + 4} \cdot s_{6 + j} $$ $$ -v_{inputnew} = \alpha_0 + \alpha_1 \cdot op_{mrunew} + \alpha_2 \cdot (h_0 + 32 \cdot s_4) + \alpha_3 \cdot s_5 + \sum_{j=0}^3\alpha_{j + 4} \cdot s_{10 + j} +v_{inputnew} = \alpha_0 + \alpha_1 \cdot op_{mrunew} + \alpha_2 \cdot (h_0 + 2 \cdot s_4) + \alpha_3 \cdot s_5 + \sum_{j=0}^3\alpha_{j + 4} \cdot s_{10 + j} $$ $$ -v_{outputnew} = \alpha_0 + \alpha_1 \cdot op_{rethash} + \alpha_2 \cdot (h_0 + 2 \cdot 32 \cdot s_4 - 1) + \sum_{j=0}^3\alpha_{j + 4} \cdot s_{j}' +v_{outputnew} = \alpha_0 + \alpha_1 \cdot op_{rethash} + \alpha_2 \cdot (h_0 + 4 \cdot s_4 - 1) + \sum_{j=0}^3\alpha_{j + 4} \cdot s_{j}' $$ In the above, the first two expressions correspond to inputs and outputs for verifying the Merkle path between the old node value and the old tree root, while the last two expressions correspond to inputs and outputs for verifying the Merkle path between the new node value and the new tree root. The hash chiplet ensures the same set of sibling nodes are used in both of these computations. @@ -120,7 +120,7 @@ The $op_{mruold}$, $op_{mrunew}$, and $op_{rethash}$ are the unique [operation l > b_{chip}' \cdot v_{inputold} \cdot v_{outputold} \cdot v_{inputnew} \cdot v_{outputnew} = b_{chip} \text{ | degree} = 5 > $$ -The above constraint enforces that the specified input and output rows for both, the old and the new node/root combinations, must be present in the trace of the hash chiplet, and that they must be exactly $32 \cdot d - 1$ rows apart, where $d$ is the depth of the node. It also ensures that the computation for the old node/root combination is immediately followed by the computation for the new node/root combination. +The above constraint enforces that the specified input and output controller rows for both the old and the new node/root combinations must be present in the trace of the hash chiplet. The old-path output is $2 \cdot d - 1$ rows after the old-path input, the new-path input starts immediately after that at offset $2 \cdot d$, and the new-path output is $4 \cdot d - 1$ rows after the initial old-path input. It also ensures that the computation for the old node/root combination is immediately followed by the computation for the new node/root combination. The effect of this operation on the rest of the stack is: * **No change** for positions starting from $4$. @@ -434,7 +434,7 @@ $$ v_{\text{input}} = \alpha_0 + \alpha_1 \cdot op_{linhash} + \alpha_2 \cdot h_0 + \sum_{i=0}^{3} \alpha_{i+4} \cdot \mathsf{COMM}_i + \sum_{i=0}^{3} \alpha_{i+8} \cdot \mathsf{TAG}_i + \sum_{i=0}^{3} \alpha_{i+12} \cdot \mathsf{CAP}_{\text{prev},i}. $$ -Thirty-one rows later, the `op_retstate` response provides the permuted state `[R0, R1, CAP_{next}]` (with R0 on top). Denote the stack after the instruction by $s'_i$; the top twelve elements are `[R0, R1, CAP_NEXT]`. Thus +One controller row later, the `op_retstate` response provides the permuted state `[R0, R1, CAP_{next}]` (with R0 on top). Denote the stack after the instruction by $s'_i$; the top twelve elements are `[R0, R1, CAP_NEXT]`. Thus $$ \begin{aligned} @@ -448,7 +448,7 @@ $$ and the response message is $$ -v_{\text{output}} = \alpha_0 + \alpha_1 \cdot op_{retstate} + \alpha_2 \cdot (h_0 + 31) + \sum_{i=0}^{3} \alpha_{i+4} \cdot \mathsf{R}_0{}_i + \sum_{i=0}^{3} \alpha_{i+8} \cdot \mathsf{R}_1{}_i + \sum_{i=0}^{3} \alpha_{i+12} \cdot \mathsf{CAP}^{\text{next}}_i. +v_{\text{output}} = \alpha_0 + \alpha_1 \cdot op_{retstate} + \alpha_2 \cdot (h_0 + 1) + \sum_{i=0}^{3} \alpha_{i+4} \cdot \mathsf{R}_0{}_i + \sum_{i=0}^{3} \alpha_{i+8} \cdot \mathsf{R}_1{}_i + \sum_{i=0}^{3} \alpha_{i+12} \cdot \mathsf{CAP}^{\text{next}}_i. $$ Using the above values, we can describe the constraint for the chiplet bus column as follows: @@ -457,7 +457,7 @@ $$ b_{chip}' \cdot v_{input} \cdot v_{output} = b_{chip} $$ -The above constraint enforces that the specified input and output rows must be present in the trace of the hash chiplet, and that they must be exactly 31 rows apart. The Poseidon2 permutation outputs `[R0, R1, CAP]` (with R0 on top); on the stack, the VM stores these words as `[R0, R1, CAP]`. +The above constraint enforces that the specified input and output controller rows must be present in the trace of the hash chiplet. In the controller/permutation split design these two controller rows are consecutive, so their addresses differ by exactly 1. The Poseidon2 permutation outputs `[R0, R1, CAP]` (with R0 on top); on the stack, the VM stores these words as `[R0, R1, CAP]`. Given the similarity with the `HPERM` opcode which sends the same message, albeit from different variables in the trace, it should be possible to combine the bus constraint in a way that avoids increasing the degree of the overall bus expression. diff --git a/docs/src/design/stack/system_ops.md b/docs/src/design/stack/system_ops.md index 84e9c3de9e..141b164016 100644 --- a/docs/src/design/stack/system_ops.md +++ b/docs/src/design/stack/system_ops.md @@ -64,3 +64,5 @@ $$ The effect on the rest of the stack is: * **Right shift** starting from position $0$. + +**WARNING:** This is a best effort instruction, since given the same program, changes in NOOP padding (which do not change the program commitment) will change the number of rows in the trace (and hence the value of `clk` at various points in the program). Hence, the value returned by `CLK` should be treated as non-deterministic and attacker-controlled (up to the amount of padding allowed by the padding-related constraints). diff --git a/docs/src/user_docs/assembly/code_organization.md b/docs/src/user_docs/assembly/code_organization.md index 915d48e46f..50ca7b0932 100644 --- a/docs/src/user_docs/assembly/code_organization.md +++ b/docs/src/user_docs/assembly/code_organization.md @@ -384,6 +384,15 @@ end Note that nothing currently validates that a `u8` value passed as an instance of `Level` is actually one of those three constants, that is up to you. Instead, the `enum` syntax is intended to provide more semantic information for readers of the code, and to better express the relationship between the type and the constants in question. +Because enum variants are expanded into module-level constants, variant names must be unique across all enums (and constants) within the same module. For example, the following will produce a compile-time error because `OK` is defined by both enums: + +``` +enum Status : u8 { OK, ERR } +enum Health : u8 { OK, CRIT } # error: symbol conflict for `OK` +``` + +If you need similar variant names in different enums, consider placing each enum in its own module, or choosing distinct names for the variants. + #### Type signatures Procedure type signatures are expressed using familiar function type syntax, e.g.: diff --git a/docs/src/user_docs/assembly/cryptographic_operations.md b/docs/src/user_docs/assembly/cryptographic_operations.md index 2663e3601a..e587e5fa32 100644 --- a/docs/src/user_docs/assembly/cryptographic_operations.md +++ b/docs/src/user_docs/assembly/cryptographic_operations.md @@ -7,7 +7,7 @@ sidebar_position: 9 Miden assembly provides a set of instructions for performing common cryptographic operations. These instructions are listed in the table below. ### Hashing and Merkle trees -[Poseidon2](https://eprint.iacr.org/2023/323) is the native hash function of Miden VM. The parameters of the hash function were chosen to provide 128-bit security level against preimage and collision attacks. The function operates over a 12-element state (rate 8, capacity 4). Internally, a permutation is modeled as 31 step transitions, but the VM exposes it as a single-cycle `hperm` operation for efficient hashing. +[Poseidon2](https://eprint.iacr.org/2023/323) is the native hash function of Miden VM. The parameters of the hash function were chosen to provide 128-bit security level against preimage and collision attacks. The function operates over a 12-element state (rate 8, capacity 4). Internally, the hasher chiplet tracks the permutation as 31 Poseidon2 step transitions packed into a 16-row cycle, but the VM exposes it as a single-cycle `hperm` operation for efficient hashing. | Instruction | Stack_input | Stack_output | Notes | | -------------------------------- | ------------------ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -100,7 +100,7 @@ The following instructions are designed mainly for use in recursive verification | eval_circuit
- *(1 cycle)* | [ptr, n_read, n_eval, ...] | [ptr, n_read, n_eval, ...] | Evaluates an arithmetic circuit, and checks that its output is equal to zero. `ptr` specifies the memory address at which the circuit description is stored with the number of input extension field elements specified by `n_read` and the number of evaluation gates, encoded as base field elements, specified by `n_eval`. | | horner_eval_base
- *(1 cycle)* | [c7, c6, c5, c4, c3, c2, c1, c0, - , - , - , - , - , alpha_addr, acc1, acc0, ...] | [c7, c6, c5, c4, c3, c2, c1, c0, - , - , - , - , - , alpha_addr, acc1', acc0', ...] | Performs 8 steps of the Horner evaluation method to update the accumulator using evaluation point `alpha` read from memory at `alpha_addr` and `alpha_addr + 1`. Computes `acc' = (((((((acc * alpha + c0) * alpha + c1) * alpha + c2) * alpha + c3) * alpha + c4) * alpha + c5) * alpha + c6) * alpha + c7`. | | horner_eval_ext
- *(1 cycle)* | [c3_1, c3_0, c2_1, c2_0, c1_1, c1_0, c0_1, c0_0, - , - , - , - , - , alpha_addr, acc1, acc0, ...] | [c3_1, c3_0, c2_1, c2_0, c1_1, c1_0, c0_1, c0_0, - , - , - , - , - , alpha_addr, acc1', acc0', ...] | Performs 4 steps of the Horner evaluation method on a polynomial with coefficients over the quadratic extension field using evaluation point `alpha` read from memory at `alpha_addr` and `alpha_addr + 1`. Computes `acc' = (((acc * alpha + c0) * alpha + c1) * alpha + c2) * alpha + c3` where coefficients are extension field elements `c0 = (c0_1, c0_0)`, `c1 = (c1_1, c1_0)`, `c2 = (c2_1, c2_0)`, `c3 = (c3_1, c3_0)`. | -| log_precompile
- *(1 cycle)* | [COMM, TAG, ...] | [R1, R0, CAP_NEXT, ...] | Absorbs words `TAG` and `COMM` into the precompile sponge.
The hasher computes `[CAP_NEXT, R0, R1] = Poseidon2([CAP_PREV, TAG, COMM])` and updates the processor's precompile sponge capacity.
The top 3 stack words are replaced with `[R1, R0, CAP_NEXT]`, and callers typically drop them right away. | +| log_precompile
- *(1 cycle)* | [COMM, TAG, ...] | [R0, R1, CAP_NEXT, ...] | Absorbs words `TAG` and `COMM` into the precompile sponge.
The hasher computes `[R0, R1, CAP_NEXT] = Poseidon2([COMM, TAG, CAP_PREV])` and updates the processor's precompile sponge capacity.
The top 3 stack words are replaced with `[R0, R1, CAP_NEXT]`, and callers typically drop them right away. | ### FRI folding diff --git a/docs/src/user_docs/core_lib/math/u64.md b/docs/src/user_docs/core_lib/math/u64.md index 4b7ecc3c98..1e4643c3a9 100644 --- a/docs/src/user_docs/core_lib/math/u64.md +++ b/docs/src/user_docs/core_lib/math/u64.md @@ -55,7 +55,7 @@ Many of the procedures listed below (e.g., `overflowing_add`, `wrapping_add`, `l | shl | Performs left shift of one unsigned 64-bit integer. The input value to be shifted is assumed to be represented using 32-bit limbs, but this is not checked. The shift value n should be in the range [0, 64), otherwise it will result in an error. The stack transition looks as follows: [n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where `c = (a << n) mod 2^64`. This takes 21 cycles.| | shr | Performs right shift of one unsigned 64-bit integer. The input value to be shifted is assumed to be represented using 32-bit limbs, but this is not checked. The shift value n should be in the range [0, 64), otherwise it will result in an error. The stack transition looks as follows: [n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where c = a >> n. This takes 44 cycles. | | rotl | Performs left rotation of one unsigned 64-bit integer. The input value to be rotated is assumed to be represented using 32-bit limbs, but this is not checked. The rotation amount n should be in the range [0, 64), otherwise it will result in an error. The stack transition looks as follows: [n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where `c = a <<< n` (rotate left). This takes 35 cycles. | -| rotr | Performs right rotation of one unsigned 64-bit integer. The input value to be rotated is assumed to be represented using 32-bit limbs, but this is not checked. The rotation amount n should be in the range [0, 64), otherwise it will result in an error. The stack transition looks as follows: [n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where c = a >>> n (rotate right). This takes 44 cycles. | +| rotr | Performs right rotation of one unsigned 64-bit integer. The input value to be rotated is assumed to be represented using 32-bit limbs, but this is not checked. The rotation amount n should be in the range [0, 64), otherwise it will result in an error. The stack transition looks as follows: [n, a_lo, a_hi, ...] -> [c_lo, c_hi, ...], where c = a >>> n (rotate right). This takes 48 cycles. | | clz | Counts the number of leading zeros of one unsigned 64-bit integer. The input value is assumed to be represented using 32-bit limbs, but this is not checked. The stack transition looks as follows: [n_lo, n_hi, ...] -> [clz, ...], where clz is the number of leading zeros of value n. This takes 48 cycles. | | ctz | Counts the number of trailing zeros of one unsigned 64-bit integer. The input value is assumed to be represented using 32-bit limbs, but this is not checked. The stack transition looks as follows: [n_lo, n_hi, ...] -> [ctz, ...], where ctz is the number of trailing zeros of value n. This takes 41 cycles. | | clo | Counts the number of leading ones of one unsigned 64-bit integer. The input value is assumed to be represented using 32-bit limbs, but this is not checked. The stack transition looks as follows: [n_lo, n_hi, ...] -> [clo, ...], where clo is the number of leading ones of value n. This takes 47 cycles. | diff --git a/miden-vm/Cargo.toml b/miden-vm/Cargo.toml index b7b854c563..bcd403673c 100644 --- a/miden-vm/Cargo.toml +++ b/miden-vm/Cargo.toml @@ -89,14 +89,14 @@ tracing-forest = { version = "0.2", optional = true, features = ["ansi", "smallv [dev-dependencies] assert_cmd = { version = "2.1" } -bincode = { version = "1.3" } +bincode = { workspace = true } criterion = { workspace = true, features = ["async_tokio"] } escargot = { version = "0.5" } miden-processor = { workspace = true, features = ["testing"] } miden-utils-testing.workspace = true -num-bigint = { version = "0.4" } +num-bigint = { workspace = true } predicates = { version = "3.1" } -pretty_assertions = { version = "1.4" } +pretty_assertions = { workspace = true, features = ["std"] } tokio = { workspace = true, features = ["rt", "rt-multi-thread"] } -rand_chacha = { version = "0.9" } +rand_chacha = { workspace = true } walkdir = { version = "2.5" } diff --git a/miden-vm/README.md b/miden-vm/README.md index 8489d5dcb4..214f8882c5 100644 --- a/miden-vm/README.md +++ b/miden-vm/README.md @@ -36,14 +36,20 @@ Miden crate exposes several functions which can be used to execute programs, gen ### Executing programs -To execute a program on Miden VM, you can use `execute()` which takes the following arguments: +To execute a program on Miden VM, you can use `execute()`. The sync `execute_sync()` variant is +also available for sync callers. These functions take the following arguments: - `program: &Program` - a reference to a Miden program to be executed. - `stack_inputs: StackInputs` - a set of public inputs with which to execute the program. -- `host: Host` - an instance of a `Host` which can be used to supply non-deterministic inputs to the VM and receive messages from the VM. +- `advice_inputs: AdviceInputs` - the private inputs used to build the advice provider; use `AdviceInputs::default()` when no private inputs are needed. +- `host` - an instance of `Host` for `execute()` or `SyncHost` for `execute_sync()`, used to supply non-deterministic inputs to the VM and receive messages from the VM. - `options: ExecutionOptions` - a set of options for executing the specified program (e.g., max allowed number of cycles). -The function returns a `Result` which will contain the execution trace of the program if the execution was successful, or an error, if the execution failed. Internally, the VM then passes this execution trace to the prover to generate a proof of a correct execution of the program. +The function returns a `Result` which will contain the final stack +state and other execution outputs if the execution was successful, or an error if the execution +failed. If you need an execution trace, use `FastProcessor::execute_trace_inputs()` / +`FastProcessor::execute_trace_inputs_sync()` and pass the returned `TraceBuildInputs` bundle to +`trace::build_trace()`. For example: @@ -74,17 +80,22 @@ let mut host = DefaultHost::default(); let exec_options = ExecutionOptions::default(); // execute the program with no inputs -let trace = execute_sync(&program, stack_inputs, advice_inputs.clone(), &mut host, exec_options).unwrap(); +let output = + execute_sync(&program, stack_inputs, advice_inputs.clone(), &mut host, exec_options).unwrap(); ``` ### Proving program execution -To execute a program on Miden VM and generate a proof that the program was executed correctly, you can use the `prove()` function. This function takes the following arguments: +To execute a program on Miden VM and generate a proof that the program was executed correctly, you +can use the `prove_sync()` function. The async `prove()` variant is also available for async +callers. `prove_sync()` takes the following arguments: - `program: &Program` - a reference to a Miden program to be executed. - `stack_inputs: StackInputs` - a set of public inputs with which to execute the program. +- `advice_inputs: AdviceInputs` - the initial nondeterministic inputs available to the VM. - `host: Host` - an instance of a `Host` which can be used to supply non-deterministic inputs to the VM and receive messages from the VM. -- `options: ProvingOptions` - config parameters for proof generation. The default options target 96-bit security level. +- `execution_options: ExecutionOptions` - VM execution parameters such as cycle limits and trace fragmentation. +- `options: ProvingOptions` - proof-generation parameters. The default options target 96-bit security level. If the program is executed successfully, the function returns a tuple with 2 elements: @@ -101,7 +112,7 @@ use miden_vm::{ advice::AdviceInputs, assembly::DefaultSourceManager, field::PrimeField64, - Assembler, DefaultHost, ProvingOptions, Program, prove_sync, StackInputs + Assembler, DefaultHost, ExecutionOptions, ProvingOptions, Program, prove_sync, StackInputs }; // instantiate the assembler @@ -116,6 +127,7 @@ let (outputs, proof) = prove_sync( StackInputs::default(), // we won't provide any inputs AdviceInputs::default(), // we don't need any initial advice inputs &mut DefaultHost::default(), // we'll be using a default host + ExecutionOptions::default(), // we'll use default VM execution options ProvingOptions::default(), // we'll be using default options ) .unwrap(); @@ -217,6 +229,7 @@ let (outputs, proof) = miden_vm::prove_sync( stack_inputs, AdviceInputs::default(), // without initial advice inputs &mut host, + miden_vm::ExecutionOptions::default(), // use default VM execution options ProvingOptions::default(), // use default proving options ) .unwrap(); diff --git a/miden-vm/benches/build_trace.rs b/miden-vm/benches/build_trace.rs index f110750ef9..8f8c2f941f 100644 --- a/miden-vm/benches/build_trace.rs +++ b/miden-vm/benches/build_trace.rs @@ -3,12 +3,12 @@ use std::hint::black_box; use criterion::{BatchSize, Criterion, criterion_group, criterion_main}; use miden_core_lib::CoreLibrary; use miden_processor::{ExecutionOptions, FastProcessor, advice::AdviceInputs, trace}; -use miden_vm::{Assembler, DefaultHost, StackInputs, execute, internal::InputFile}; +use miden_vm::{Assembler, DefaultHost, StackInputs, internal::InputFile}; use tokio::runtime::Runtime; use walkdir::WalkDir; /// The size of each trace fragment (in rows) when executing programs for trace generation. -const TRACE_FRAGMENT_SIZE: usize = 4096; +const TRACE_FRAGMENT_SIZE: usize = 1024; /// Benchmark the execution of all the masm examples in the `masm-examples` directory. fn build_trace(c: &mut Criterion) { @@ -77,52 +77,9 @@ fn build_trace(c: &mut Criterion) { (host, program.clone(), processor) }, |(mut host, program, processor)| async move { - let (execution_output, trace_generation_context) = - processor.execute_for_trace(&program, &mut host).await.unwrap(); - - let trace = trace::build_trace( - execution_output, - trace_generation_context, - program.to_info(), - ) - .unwrap(); - black_box(trace); - }, - BatchSize::SmallInput, - ); - }); - - // LEGACY EXECUTE - // -------------------------------- - group.bench_function(format!("{file_stem}_legacy"), |bench| { - let mut assembler = Assembler::default(); - assembler - .link_dynamic_library(CoreLibrary::default()) - .expect("failed to load core library"); - - let program = assembler - .assemble_program(&source) - .expect("Failed to compile test source."); - - bench.to_async(Runtime::new().unwrap()).iter_batched( - || { - let host = DefaultHost::default() - .with_library(&CoreLibrary::default()) - .unwrap(); - let advice_inputs = advice_inputs.clone(); - - (host, stack_inputs, advice_inputs, program.clone()) - }, - |(mut host, stack_inputs, advice_inputs, program)| async move { - let trace = execute( - &program, - stack_inputs, - advice_inputs, - &mut host, - ExecutionOptions::default(), - ) - .await - .unwrap(); + let trace_inputs = + processor.execute_trace_inputs(&program, &mut host).await.unwrap(); + let trace = trace::build_trace(trace_inputs).unwrap(); black_box(trace); }, BatchSize::SmallInput, diff --git a/miden-vm/benches/program_execution_for_trace.rs b/miden-vm/benches/program_execution_for_trace.rs index 807a3e9991..dd46f0257c 100644 --- a/miden-vm/benches/program_execution_for_trace.rs +++ b/miden-vm/benches/program_execution_for_trace.rs @@ -74,7 +74,7 @@ fn program_execution_for_trace(c: &mut Criterion) { }, |(mut host, program, processor)| async move { let out = - processor.execute_for_trace(&program, &mut host).await.unwrap(); + processor.execute_trace_inputs(&program, &mut host).await.unwrap(); black_box(out); }, BatchSize::SmallInput, diff --git a/miden-vm/src/cli/prove.rs b/miden-vm/src/cli/prove.rs index b9f8b04f29..b4fea9c427 100644 --- a/miden-vm/src/cli/prove.rs +++ b/miden-vm/src/cli/prove.rs @@ -69,16 +69,18 @@ pub struct ProveCmd { } impl ProveCmd { - pub fn get_proof_options(&self) -> Result { - let exec_options = ExecutionOptions::new( + pub fn get_execution_options(&self) -> Result { + ExecutionOptions::new( Some(self.max_cycles), self.expected_cycles, ExecutionOptions::DEFAULT_CORE_TRACE_FRAGMENT_SIZE, self.trace, !self.release, ) - .map_err(|err| Report::msg(format!("{err}")))?; + .map_err(|err| Report::msg(format!("{err}"))) + } + pub fn get_proof_options(&self) -> Result { let hash_fn = HashFunction::try_from(self.hasher.as_str()) .map_err(|err| Report::msg(format!("{err}")))?; let proving_options = match self.security.as_str() { @@ -89,7 +91,7 @@ impl ProveCmd { ))); }, }; - Ok(proving_options.with_execution_options(exec_options)) + Ok(proving_options) } pub fn execute(&self) -> Result<(), Report> { println!("==============================================================================="); @@ -143,6 +145,7 @@ impl ProveCmd { let stack_inputs = input_data.parse_stack_inputs().map_err(Report::msg)?; let advice_inputs = input_data.parse_advice_inputs().map_err(Report::msg)?; + let execution_options = self.get_execution_options()?; let proving_options = self.get_proof_options()?; // execute program and generate proof @@ -151,6 +154,7 @@ impl ProveCmd { stack_inputs, advice_inputs, &mut host, + execution_options, proving_options, ) .wrap_err("Failed to prove program")?; diff --git a/miden-vm/src/cli/run.rs b/miden-vm/src/cli/run.rs index cd64156662..ba032d842d 100644 --- a/miden-vm/src/cli/run.rs +++ b/miden-vm/src/cli/run.rs @@ -156,12 +156,10 @@ fn run_masp_program(params: &RunCmd) -> Result<(ExecutionTrace, [u8; 32]), Repor .with_advice(advice_inputs) .with_options(exec_options); - let (execution_output, trace_generation_context) = processor - .execute_for_trace_sync(&program, &mut host) + let trace_inputs = processor + .execute_trace_inputs_sync(&program, &mut host) .wrap_err("Failed to execute program")?; - - let trace = build_trace(execution_output, trace_generation_context, program.to_info()) - .wrap_err("Failed to build trace")?; + let trace = build_trace(trace_inputs).wrap_err("Failed to build trace")?; Ok((trace, program_hash)) } @@ -225,12 +223,10 @@ fn run_masm_program(params: &RunCmd) -> Result<(ExecutionTrace, [u8; 32]), Repor .with_advice(advice_inputs) .with_options(exec_options); - let (execution_output, trace_generation_context) = processor - .execute_for_trace_sync(&program, &mut host) + let trace_inputs = processor + .execute_trace_inputs_sync(&program, &mut host) .wrap_err("Failed to execute program")?; - - let trace = build_trace(execution_output, trace_generation_context, program.to_info()) - .wrap_err("Failed to build trace")?; + let trace = build_trace(trace_inputs).wrap_err("Failed to build trace")?; Ok((trace, program_hash)) } diff --git a/miden-vm/src/lib.rs b/miden-vm/src/lib.rs index 7674db94b4..dad0e7c14c 100644 --- a/miden-vm/src/lib.rs +++ b/miden-vm/src/lib.rs @@ -13,13 +13,14 @@ pub use miden_core::proof::{ExecutionProof, HashFunction}; #[cfg(not(target_family = "wasm"))] pub use miden_processor::execute_sync; pub use miden_processor::{ - DefaultHost, ExecutionError, ExecutionOptions, Host, Kernel, Program, ProgramInfo, StackInputs, - ZERO, advice, crypto, execute, field, operation::Operation, serde, trace::ExecutionTrace, - utils, + BaseHost, DefaultHost, ExecutionError, ExecutionOptions, ExecutionOutput, FastProcessor, + FutureMaybeSend, Host, Kernel, Program, ProgramInfo, StackInputs, SyncHost, TraceBuildInputs, + TraceGenerationContext, ZERO, advice, crypto, execute, field, operation::Operation, serde, + trace, trace::ExecutionTrace, utils, }; +pub use miden_prover::{InputError, ProvingOptions, StackOutputs, TraceProvingInputs, Word, prove}; #[cfg(not(target_family = "wasm"))] -pub use miden_prover::prove_sync; -pub use miden_prover::{InputError, ProvingOptions, StackOutputs, Word, prove}; +pub use miden_prover::{prove_from_trace_sync, prove_sync}; pub use miden_verifier::VerificationError; // (private) exports diff --git a/miden-vm/tests/integration/flow_control/mod.rs b/miden-vm/tests/integration/flow_control/mod.rs index cd182a7674..5dff7a4628 100644 --- a/miden-vm/tests/integration/flow_control/mod.rs +++ b/miden-vm/tests/integration/flow_control/mod.rs @@ -2,9 +2,8 @@ use alloc::sync::Arc; use miden_assembly::{Assembler, PathBuf, Report, ast::ModuleKind}; use miden_core_lib::CoreLibrary; -use miden_debug_types::{SourceLanguage, SourceManager}; use miden_processor::{ExecutionError, Word, operation::OperationError}; -use miden_utils_testing::{StackInputs, Test, build_test, expect_exec_error_matches, push_inputs}; +use miden_utils_testing::{build_debug_test, build_test, expect_exec_error_matches, push_inputs}; use miden_vm::Module; // SIMPLE FLOW CONTROL TESTS @@ -240,14 +239,7 @@ fn simple_syscall() { syscall.foo end"; - // TODO: update and use macro? - let mut test = Test::new(&format!("test{}", line!()), program_source, false); - test.stack_inputs = StackInputs::try_from_ints([1, 2]).unwrap(); - test.kernel_source = Some(test.source_manager.load( - SourceLanguage::Masm, - format!("kernel{}", line!()).into(), - kernel_source.to_string(), - )); + let test = build_test!(program_source, &[1, 2]).with_kernel(kernel_source); test.expect_stack(&[3]); test.check_constraints(); @@ -273,16 +265,9 @@ fn simple_syscall_2() { syscall.bar end"; - // TODO: update and use macro? - let mut test = Test::new(&format!("test{}", line!()), program_source, false); // Stack [1, 2, 3, 2, 2] with 1 on top // foo(1+2=3), foo(3+3=6), bar(6*2=12), bar(12*2=24) => 24 - test.stack_inputs = StackInputs::try_from_ints([1, 2, 3, 2, 2]).unwrap(); - test.kernel_source = Some(test.source_manager.load( - SourceLanguage::Masm, - format!("kernel{}", line!()).into(), - kernel_source.to_string(), - )); + let test = build_test!(program_source, &[1, 2, 3, 2, 2]).with_kernel(kernel_source); test.expect_stack(&[24]); test.check_constraints(); @@ -354,12 +339,7 @@ fn call_in_syscall() { call.new_ctx end"; - let mut test = Test::new(&format!("test{}", line!()), program_source, false); - test.kernel_source = Some(test.source_manager.load( - SourceLanguage::Masm, - format!("kernel{}", line!()).into(), - kernel_source.to_string(), - )); + let test = build_test!(program_source).with_kernel(kernel_source); test.expect_stack(&[]); test.check_constraints(); @@ -393,13 +373,7 @@ fn root_context_separate_overflows() { drop swap.15 end"; - let mut test = Test::new(&format!("test{}", line!()), program_source, false); - test.stack_inputs = StackInputs::try_from_ints([100]).unwrap(); - test.kernel_source = Some(test.source_manager.load( - SourceLanguage::Masm, - format!("kernel{}", line!()).into(), - kernel_source.to_string(), - )); + let test = build_test!(program_source, &[100]).with_kernel(kernel_source); test.expect_stack(&[100]); test.check_constraints(); } @@ -447,10 +421,7 @@ fn simple_dyn_exec() { 3, ]; - let test = Test { - stack_inputs: StackInputs::try_from_ints(stack_init).unwrap(), - ..Test::new(&format!("test{}", line!()), program_source, true) - }; + let test = build_debug_test!(program_source).with_stack_inputs(stack_init); test.expect_stack(&[6]); @@ -481,16 +452,16 @@ fn dynexec_with_procref() { swap drop end"; - let mut test = build_test!(program_source, &[]); - test.libraries.push(CoreLibrary::default().library().clone()); - test.add_module( - "external::module", - "\ - pub proc func - u32wrapping_add.1 - end - ", - ); + let test = build_test!(program_source, &[]) + .with_library(CoreLibrary::default().library().clone()) + .with_module( + "external::module", + "\ + pub proc func + u32wrapping_add.1 + end + ", + ); test.expect_stack(&[4]); } @@ -540,12 +511,11 @@ fn simple_dyncall() { 3, ]; - let mut test = Test { - stack_inputs: StackInputs::try_from_ints(stack_init).unwrap(), - libraries: vec![CoreLibrary::default().into()], - ..Test::new(&format!("test{}", line!()), program_source, false) - }; - test.add_event_handlers(CoreLibrary::default().handlers()); + let core_lib = CoreLibrary::default(); + let test = build_test!(program_source) + .with_stack_inputs(stack_init) + .with_library(core_lib.library().clone()) + .with_event_handlers(core_lib.handlers()); test.expect_stack(&[6]); @@ -582,13 +552,7 @@ fn dyncall_with_syscall_and_caller() { movupw.3 dropw movupw.3 dropw end"; - // Set up the test with kernel - let mut test = Test::new(&format!("test{}", line!()), program_source, true); - test.kernel_source = Some(test.source_manager.load( - SourceLanguage::Masm, - format!("kernel{}", line!()).into(), - kernel_source.to_string(), - )); + let test = build_debug_test!(program_source).with_kernel(kernel_source); // Compile to get the hash of `bar` let (program, _kernel) = test.compile().unwrap(); @@ -663,9 +627,9 @@ fn procref() -> Result<(), Report> { end"; let core_lib = CoreLibrary::default(); - let mut test = build_test!(source, &[]); - test.libraries.push(core_lib.library().clone()); - test.add_event_handlers(core_lib.handlers()); + let test = build_test!(source, &[]) + .with_library(core_lib.library().clone()) + .with_event_handlers(core_lib.handlers()); // procref pushes element[0] on top // Word from procedure_digests stores elements in BE order (word[0] = high) diff --git a/miden-vm/tests/integration/operations/field_ops.rs b/miden-vm/tests/integration/operations/field_ops.rs index d30d9410b9..f78bbe1175 100644 --- a/miden-vm/tests/integration/operations/field_ops.rs +++ b/miden-vm/tests/integration/operations/field_ops.rs @@ -742,6 +742,7 @@ fn gte() { // ================================================================================================ proptest! { + #![proptest_config(ProptestConfig::with_cases(100))] #[test] fn add_proptest(a in any::(), b in any::()) { let asm_op = "add"; diff --git a/miden-vm/tests/integration/operations/fri_ops.rs b/miden-vm/tests/integration/operations/fri_ops.rs index 3b95380aa3..75671e07ca 100644 --- a/miden-vm/tests/integration/operations/fri_ops.rs +++ b/miden-vm/tests/integration/operations/fri_ops.rs @@ -10,15 +10,20 @@ fn fri_ext2fold4() { .iter() .map(|v| v.as_canonical_u64()) .collect::>(); - inputs[7] = 2; // domain segment must be < 4 - - // When domain segment is 2, query_values[2] = (v4, v5) must equal prev_value = (pe0, pe1). + // inputs[7] -> stack[9] = p (bit-reversed tree index). + // The instruction computes d_seg = p & 3 and f_pos = p >> 2. + // We want d_seg=2, f_pos=inputs[8], so p = 4*f_pos + 2. + // f_pos must fit in u32 to avoid overflow when computing p. + inputs[8] %= (u32::MAX as u64) >> 2; + inputs[7] = 4 * inputs[8] + 2; + + // When d_seg=2, query_values[2] = (v4, v5) must equal prev_value = (pe0, pe1). // After pushing 17 inputs: - // Position 4 = inputs[12] (v4), Position 5 = inputs[11] (v5) - // Position 12 = inputs[4] (pe0), Position 11 = inputs[5] (pe1) - // So we need inputs[12] = inputs[4] and inputs[11] = inputs[5]. - inputs[12] = inputs[4]; - inputs[11] = inputs[5]; + // v4 = inputs[12] (stack[4]), v5 = inputs[11] (stack[5]) + // pe0 = inputs[5] (stack[11]), pe1 = inputs[4] (stack[12]) + // So we need inputs[12] = inputs[5] (v4 = pe0) and inputs[11] = inputs[4] (v5 = pe1). + inputs[12] = inputs[5]; + inputs[11] = inputs[4]; let end_ptr = inputs[0]; let layer_ptr = inputs[1]; diff --git a/miden-vm/tests/integration/operations/io_ops/env_ops.rs b/miden-vm/tests/integration/operations/io_ops/env_ops.rs index 6a4ab29796..0cb581f679 100644 --- a/miden-vm/tests/integration/operations/io_ops/env_ops.rs +++ b/miden-vm/tests/integration/operations/io_ops/env_ops.rs @@ -6,8 +6,7 @@ use miden_core::{ }, operations::Operation, }; -use miden_debug_types::{SourceLanguage, SourceManager}; -use miden_utils_testing::{MIN_STACK_DEPTH, StackInputs, Test, Word, build_op_test, build_test}; +use miden_utils_testing::{MIN_STACK_DEPTH, Word, build_op_test, build_test}; use super::TRUNCATE_STACK_PROC; @@ -183,14 +182,7 @@ fn caller() { call.bar end"; - // TODO: update and use macro? - let mut test = Test::new(&format!("test{}", line!()), program_source, false); - test.stack_inputs = StackInputs::try_from_ints([1, 2, 3, 4, 5]).unwrap(); - test.kernel_source = Some(test.source_manager.load( - SourceLanguage::Masm, - format!("kernel{}", line!()).into(), - kernel_source.to_string(), - )); + let test = build_test!(program_source, &[1, 2, 3, 4, 5]).with_kernel(kernel_source); // top 4 elements should be overwritten with the hash of `bar` procedure, but the 5th // element should remain untouched (position 4 in input [1,2,3,4,5] is 5) diff --git a/miden-vm/tests/integration/operations/stack_ops.rs b/miden-vm/tests/integration/operations/stack_ops.rs index 47fa44aa6c..72d327b59e 100644 --- a/miden-vm/tests/integration/operations/stack_ops.rs +++ b/miden-vm/tests/integration/operations/stack_ops.rs @@ -433,6 +433,7 @@ fn cdropw() { } proptest! { + #![proptest_config(ProptestConfig::with_cases(100))] #[test] fn drop_proptest(test_values in prop::collection::vec(any::(), MIN_STACK_DEPTH)) { diff --git a/miden-vm/tests/integration/operations/sys_ops.rs b/miden-vm/tests/integration/operations/sys_ops.rs index 9b3df0f45b..ab9479565f 100644 --- a/miden-vm/tests/integration/operations/sys_ops.rs +++ b/miden-vm/tests/integration/operations/sys_ops.rs @@ -91,7 +91,7 @@ fn emit() { let event_id = event_name.to_event_id().as_felt(); let source = format!("push.{event_id} emit drop"); - let mut test = build_op_test!(&source, &[0, 0, 0, 0]); - test.add_event_handler(event_name, NoopEventHandler); + let test = + build_op_test!(&source, &[0, 0, 0, 0]).with_event_handler(event_name, NoopEventHandler); test.check_constraints(); } diff --git a/miden-vm/tests/integration/operations/u32_ops/arithmetic_ops.rs b/miden-vm/tests/integration/operations/u32_ops/arithmetic_ops.rs index 4c500b49e5..5749ce72bb 100644 --- a/miden-vm/tests/integration/operations/u32_ops/arithmetic_ops.rs +++ b/miden-vm/tests/integration/operations/u32_ops/arithmetic_ops.rs @@ -685,6 +685,7 @@ fn u32divmod_fail() { // U32 OPERATIONS TESTS - RANDOMIZED - ARITHMETIC OPERATIONS // ================================================================================================ proptest! { + #![proptest_config(ProptestConfig::with_cases(100))] #[test] fn u32unchecked_add_proptest(a in any::(), b in any::()) { let wrapping_asm_op = "u32wrapping_add"; diff --git a/miden-vm/tests/integration/prove_verify.rs b/miden-vm/tests/integration/prove_verify.rs index 464aaa06aa..813b1eb977 100644 --- a/miden-vm/tests/integration/prove_verify.rs +++ b/miden-vm/tests/integration/prove_verify.rs @@ -3,44 +3,108 @@ use alloc::sync::Arc; use miden_assembly::{Assembler, DefaultSourceManager}; -use miden_prover::{AdviceInputs, ProvingOptions, StackInputs, prove_sync}; +use miden_core::{precompile::PrecompileTranscriptState, proof::ExecutionProof}; +use miden_core_lib::CoreLibrary; +use miden_processor::ExecutionOptions; +use miden_prover::{ + AdviceInputs, ProgramInfo, ProvingOptions, PublicInputs, StackInputs, StackOutputs, prove_sync, +}; use miden_verifier::verify; use miden_vm::{DefaultHost, HashFunction}; -#[test] -fn test_blake3_256_prove_verify() { - // Compute many Fibonacci iterations to generate a trace >= 2048 rows - let source = " - begin - repeat.1000 - swap dup.1 add - end - end - "; - +fn assert_prove_verify( + source: &str, + hash_fn: HashFunction, + hash_name: &str, + print_stack_outputs: bool, + verify_recursively: bool, +) { let program = Assembler::default().assemble_program(source).unwrap(); let stack_inputs = StackInputs::try_from_ints([0, 1]).unwrap(); let advice_inputs = AdviceInputs::default(); let mut host = DefaultHost::default().with_source_manager(Arc::new(DefaultSourceManager::default())); + let options = ProvingOptions::with_96_bit_security(hash_fn); + + println!("Proving with {hash_name}..."); + let (stack_outputs, proof) = prove_sync( + &program, + stack_inputs, + advice_inputs, + &mut host, + ExecutionOptions::default(), + options, + ) + .expect("Proving failed"); - // Create proving options with Blake3_256 (96-bit security) - let options = ProvingOptions::with_96_bit_security(HashFunction::Blake3_256); + println!("Proof generated successfully!"); + if print_stack_outputs { + println!("Stack outputs: {:?}", stack_outputs); + } - println!("Proving with Blake3_256..."); - let (stack_outputs, proof) = - prove_sync(&program, stack_inputs, advice_inputs, &mut host, options) - .expect("Proving failed"); + if verify_recursively { + assert_recursive_verify( + program.to_info(), + stack_inputs, + stack_outputs, + PrecompileTranscriptState::default(), + &proof, + ); + } - println!("Proof generated successfully!"); println!("Verifying proof..."); - let security_level = verify(program.into(), stack_inputs, stack_outputs, proof).expect("Verification failed"); println!("Verification successful! Security level: {}", security_level); } +fn assert_recursive_verify( + program_info: ProgramInfo, + stack_inputs: StackInputs, + stack_outputs: StackOutputs, + pc_transcript_state: PrecompileTranscriptState, + proof: &ExecutionProof, +) { + assert_eq!(proof.hash_fn(), HashFunction::Poseidon2); + + let pub_inputs = + PublicInputs::new(program_info, stack_inputs, stack_outputs, pc_transcript_state); + let verifier_inputs = + recursive_verifier::generate_advice_inputs(proof.stark_proof(), pub_inputs); + + let source = " + use miden::core::sys::vm + begin + exec.vm::verify_proof + end + "; + + let mut test = crate::build_test!( + source, + &verifier_inputs.initial_stack, + &verifier_inputs.advice_stack, + verifier_inputs.store, + verifier_inputs.advice_map + ); + test.libraries.push(CoreLibrary::default().library().clone()); + test.execute().expect("recursive verifier execution failed"); +} + +#[test] +fn test_blake3_256_prove_verify() { + // Compute many Fibonacci iterations to generate a trace >= 2048 rows + let source = " + begin + repeat.1000 + swap dup.1 add + end + end + "; + + assert_prove_verify(source, HashFunction::Blake3_256, "Blake3_256", false, false); +} + #[test] fn test_keccak_prove_verify() { // Compute 150th Fibonacci number to generate a longer trace @@ -52,33 +116,7 @@ fn test_keccak_prove_verify() { end "; - // Compile the program - let program = Assembler::default().assemble_program(source).unwrap(); - - // Prepare inputs - start with 0 and 1 on the stack for Fibonacci - let stack_inputs = StackInputs::try_from_ints([0, 1]).unwrap(); - let advice_inputs = AdviceInputs::default(); - let mut host = - DefaultHost::default().with_source_manager(Arc::new(DefaultSourceManager::default())); - - // Create proving options with Keccak (96-bit security) - let options = ProvingOptions::with_96_bit_security(HashFunction::Keccak); - - // Prove the program - println!("Proving with Keccak..."); - let (stack_outputs, proof) = - prove_sync(&program, stack_inputs, advice_inputs, &mut host, options) - .expect("Proving failed"); - - println!("Proof generated successfully!"); - println!("Stack outputs: {:?}", stack_outputs); - - // Verify the proof - println!("Verifying proof..."); - let security_level = - verify(program.into(), stack_inputs, stack_outputs, proof).expect("Verification failed"); - - println!("Verification successful! Security level: {}", security_level); + assert_prove_verify(source, HashFunction::Keccak, "Keccak", true, false); } #[test] @@ -92,33 +130,7 @@ fn test_rpo_prove_verify() { end "; - // Compile the program - let program = Assembler::default().assemble_program(source).unwrap(); - - // Prepare inputs - start with 0 and 1 on the stack for Fibonacci - let stack_inputs = StackInputs::try_from_ints([0, 1]).unwrap(); - let advice_inputs = AdviceInputs::default(); - let mut host = - DefaultHost::default().with_source_manager(Arc::new(DefaultSourceManager::default())); - - // Create proving options with RPO (96-bit security) - let options = ProvingOptions::with_96_bit_security(HashFunction::Rpo256); - - // Prove the program - println!("Proving with RPO..."); - let (stack_outputs, proof) = - prove_sync(&program, stack_inputs, advice_inputs, &mut host, options) - .expect("Proving failed"); - - println!("Proof generated successfully!"); - println!("Stack outputs: {:?}", stack_outputs); - - // Verify the proof - println!("Verifying proof..."); - let security_level = - verify(program.into(), stack_inputs, stack_outputs, proof).expect("Verification failed"); - - println!("Verification successful! Security level: {}", security_level); + assert_prove_verify(source, HashFunction::Rpo256, "RPO", true, false); } #[test] @@ -132,28 +144,7 @@ fn test_poseidon2_prove_verify() { end "; - let program = Assembler::default().assemble_program(source).unwrap(); - let stack_inputs = StackInputs::try_from_ints([0, 1]).unwrap(); - let advice_inputs = AdviceInputs::default(); - let mut host = - DefaultHost::default().with_source_manager(Arc::new(DefaultSourceManager::default())); - - // Create proving options with Poseidon2 (96-bit security) - let options = ProvingOptions::with_96_bit_security(HashFunction::Poseidon2); - - println!("Proving with Poseidon2..."); - let (stack_outputs, proof) = - prove_sync(&program, stack_inputs, advice_inputs, &mut host, options) - .expect("Proving failed"); - - println!("Proof generated successfully!"); - println!("Stack outputs: {:?}", stack_outputs); - - println!("Verifying proof..."); - let security_level = - verify(program.into(), stack_inputs, stack_outputs, proof).expect("Verification failed"); - - println!("Verification successful! Security level: {}", security_level); + assert_prove_verify(source, HashFunction::Poseidon2, "Poseidon2", true, true); } /// Test end-to-end proving and verification with RPX @@ -168,28 +159,297 @@ fn test_rpx_prove_verify() { end "; - let program = Assembler::default().assemble_program(source).unwrap(); - let stack_inputs = StackInputs::try_from_ints([0, 1]).unwrap(); - let advice_inputs = AdviceInputs::default(); - let mut host = - DefaultHost::default().with_source_manager(Arc::new(DefaultSourceManager::default())); + assert_prove_verify(source, HashFunction::Rpx256, "RPX", true, false); +} - // Create proving options with RPX (96-bit security) - let options = ProvingOptions::with_96_bit_security(HashFunction::Rpx256); +mod recursive_verifier { + use alloc::vec::Vec; - println!("Proving with RPX..."); - let (stack_outputs, proof) = - prove_sync(&program, stack_inputs, advice_inputs, &mut host, options) - .expect("Proving failed"); + use miden_core::{ + Felt, WORD_SIZE, Word, + field::{BasedVectorSpace, QuadFelt}, + }; + use miden_crypto::stark::{ + StarkConfig, + air::AirInstance, + challenger::CanObserve, + fri::PcsTranscript, + lmcs::{BatchProof, Lmcs}, + proof::StarkTranscript, + }; + use miden_prover::{ProcessorAir, PublicInputs, config}; + use miden_utils_testing::crypto::{MerklePath, MerkleStore, PartialMerkleTree}; + + type Challenge = QuadFelt; + type P2Config = config::Poseidon2Config; + type P2Lmcs = >::Lmcs; + + pub struct VerifierInputs { + pub initial_stack: Vec, + pub advice_stack: Vec, + pub store: MerkleStore, + pub advice_map: Vec<(Word, Vec)>, + } - println!("Proof generated successfully!"); - println!("Stack outputs: {:?}", stack_outputs); + pub fn generate_advice_inputs(proof_bytes: &[u8], pub_inputs: PublicInputs) -> VerifierInputs { + let params = config::pcs_params(); + let config = config::poseidon2_config(params); + let (log_trace_height, transcript_data): (u8, _) = + bincode::deserialize(proof_bytes).expect("failed to deserialize proof bytes"); + let log_trace_height = log_trace_height as usize; + + let (public_values, kernel_felts) = pub_inputs.to_air_inputs(); + let mut challenger = config.challenger(); + config::observe_protocol_params(&mut challenger, log_trace_height as u64); + challenger.observe_slice(&public_values); + let var_len_public_inputs: &[&[Felt]] = &[&kernel_felts]; + config::observe_var_len_public_inputs(&mut challenger, var_len_public_inputs, &[WORD_SIZE]); - println!("Verifying proof..."); - let security_level = - verify(program.into(), stack_inputs, stack_outputs, proof).expect("Verification failed"); + let air = ProcessorAir; + let instance = AirInstance { + log_trace_height: log_trace_height as u8, + public_values: &public_values, + var_len_public_inputs, + }; - println!("Verification successful! Security level: {}", security_level); + let (stark, _digest) = + StarkTranscript::from_proof(&config, &[(&air, instance)], &transcript_data, challenger) + .expect("failed to replay verifier transcript"); + + let kernel_digests: Vec = kernel_felts + .chunks_exact(4) + .map(|chunk| Word::new([chunk[0], chunk[1], chunk[2], chunk[3]])) + .collect(); + + build_advice(&config, &stark, log_trace_height, pub_inputs, &kernel_digests) + } + + fn build_advice( + config: &P2Config, + stark: &StarkTranscript, + log_trace_height: usize, + pub_inputs: PublicInputs, + kernel_digests: &[Word], + ) -> VerifierInputs { + let pcs = &stark.pcs_transcript; + let mut advice_stack = Vec::new(); + + let params = config::pcs_params(); + advice_stack.push(params.num_queries() as u64); + advice_stack.push(params.query_pow_bits() as u64); + advice_stack.push(config::DEEP_POW_BITS as u64); + advice_stack.push(config::FOLDING_POW_BITS as u64); + + advice_stack.extend_from_slice(&build_fixed_len_inputs(&pub_inputs)); + advice_stack.push(kernel_digests.len() as u64); + advice_stack.extend_from_slice(&build_kernel_digest_advice(kernel_digests)); + + let alpha = stark.randomness[0]; + let beta = stark.randomness[1]; + let beta_coeffs: &[Felt] = beta.as_basis_coefficients_slice(); + let alpha_coeffs: &[Felt] = alpha.as_basis_coefficients_slice(); + advice_stack.extend_from_slice(&[ + beta_coeffs[0].as_canonical_u64(), + beta_coeffs[1].as_canonical_u64(), + alpha_coeffs[0].as_canonical_u64(), + alpha_coeffs[1].as_canonical_u64(), + ]); + + advice_stack.extend_from_slice(&commitment_to_u64s(stark.main_commit)); + advice_stack.extend_from_slice(&commitment_to_u64s(stark.aux_commit)); + + if let Some(aux_values) = stark.all_aux_values.first() { + advice_stack.extend_from_slice(&challenges_to_u64s(aux_values)); + } + + advice_stack.extend_from_slice(&commitment_to_u64s(stark.quotient_commit)); + + let deep_alpha = pcs.deep_transcript.challenge_columns; + let deep_coeffs: &[Felt] = deep_alpha.as_basis_coefficients_slice(); + advice_stack.extend_from_slice(&[ + deep_coeffs[1].as_canonical_u64(), + deep_coeffs[0].as_canonical_u64(), + ]); + + append_ood_evaluations(&mut advice_stack, pcs); + advice_stack.push(pcs.deep_transcript.pow_witness.as_canonical_u64()); + + for round in &pcs.fri_transcript.rounds { + advice_stack.extend_from_slice(&commitment_to_u64s(round.commitment)); + advice_stack.push(round.pow_witness.as_canonical_u64()); + } + + let final_poly = &pcs.fri_transcript.final_poly; + let remainder_base: Vec = QuadFelt::flatten_to_base(final_poly.to_vec()); + advice_stack.extend(remainder_base.iter().map(|felt| felt.as_canonical_u64())); + advice_stack.push(pcs.query_pow_witness.as_canonical_u64()); + + let (store, advice_map) = build_merkle_data(config, stark, log_trace_height); + VerifierInputs { + initial_stack: vec![log_trace_height as u64], + advice_stack, + store, + advice_map, + } + } + + fn append_ood_evaluations(advice_stack: &mut Vec, pcs: &PcsTranscript) + where + L: Lmcs, + { + let evals = &pcs.deep_transcript.evals; + let mut local_values = Vec::new(); + let mut next_values = Vec::new(); + + for group in evals { + for matrix in group { + let width = matrix.width; + let values = matrix.values.as_slice(); + local_values.extend_from_slice(&values[..width]); + if values.len() > width { + next_values.extend_from_slice(&values[width..2 * width]); + } + } + } + + advice_stack.extend_from_slice(&challenges_to_u64s(&local_values)); + advice_stack.extend_from_slice(&challenges_to_u64s(&next_values)); + } + + fn build_merkle_data( + config: &P2Config, + stark: &StarkTranscript, + log_trace_height: usize, + ) -> (MerkleStore, Vec<(Word, Vec)>) { + let pcs = &stark.pcs_transcript; + let lmcs = config.lmcs(); + let log_blowup = config::pcs_params().log_blowup() as usize; + let log_lde_height = log_trace_height + log_blowup; + + let mut partial_trees = Vec::new(); + let mut advice_map = Vec::new(); + + for batch_proof in &pcs.deep_openings { + let (trees, entries) = + batch_proof_to_merkle(lmcs, batch_proof, log_lde_height, &pcs.tree_indices); + partial_trees.extend(trees); + advice_map.extend(entries); + } + + let log_arity = config::LOG_FOLDING_ARITY as usize; + for (round_idx, batch_proof) in pcs.fri_openings.iter().enumerate() { + let log_folded = log_arity * (round_idx + 1); + let round_indices: Vec = + pcs.tree_indices.iter().map(|&index| index >> log_folded).collect(); + let fri_log_height = log_lde_height - log_folded; + let (trees, entries) = + batch_proof_to_merkle(lmcs, batch_proof, fri_log_height, &round_indices); + partial_trees.extend(trees); + advice_map.extend(entries); + } + + let mut store = MerkleStore::new(); + for tree in &partial_trees { + store.extend(tree.inner_nodes()); + } + + (store, advice_map) + } + + fn batch_proof_to_merkle( + lmcs: &L, + batch_proof: &L::BatchProof, + log_height: usize, + query_indices: &[usize], + ) -> (Vec, Vec<(Word, Vec)>) + where + L: Lmcs, + L::Commitment: Copy + Into<[Felt; 4]> + PartialEq, + L::BatchProof: AsLmcsBatchProof, + { + let batch = batch_proof.as_batch_proof(); + let widths = infer_widths(batch); + let single_proofs = batch + .single_proofs(lmcs, &widths, log_height as u8) + .expect("failed to reconstruct Merkle paths"); + + let mut paths = Vec::new(); + let mut advice_entries = Vec::new(); + + for &index in query_indices { + let proof = single_proofs.get(&index).expect("missing opening for query index"); + let leaf_data = proof.rows.as_slice().to_vec(); + let leaf_hash = lmcs.hash(proof.rows.iter_rows()); + let leaf_word = Word::new(leaf_hash.into()); + let merkle_path = MerklePath::new( + proof + .siblings + .iter() + .map(|commitment| Word::new((*commitment).into())) + .collect(), + ); + + paths.push((index as u64, leaf_word, merkle_path)); + advice_entries.push((leaf_word, leaf_data)); + } + + let tree = + PartialMerkleTree::with_paths(paths).expect("failed to build partial Merkle tree"); + (vec![tree], advice_entries) + } + + trait AsLmcsBatchProof { + fn as_batch_proof(&self) -> &BatchProof; + } + + impl AsLmcsBatchProof for BatchProof { + fn as_batch_proof(&self) -> &BatchProof { + self + } + } + + fn infer_widths(batch: &BatchProof) -> Vec { + batch + .openings + .values() + .next() + .map(|opening| opening.rows.iter_rows().map(|row| row.len()).collect()) + .unwrap_or_default() + } + + fn build_kernel_digest_advice(kernel_digests: &[Word]) -> Vec { + let mut result = Vec::with_capacity(kernel_digests.len() * 8); + for digest in kernel_digests { + let mut padded: Vec = + digest.as_elements().iter().map(|felt| felt.as_canonical_u64()).collect(); + padded.resize(8, 0); + padded.reverse(); + result.extend_from_slice(&padded); + } + result + } + + fn build_fixed_len_inputs(pub_inputs: &PublicInputs) -> Vec { + let mut felts = Vec::::new(); + felts.extend_from_slice(pub_inputs.program_info().program_hash().as_elements()); + felts.extend_from_slice(pub_inputs.stack_inputs().as_ref()); + felts.extend_from_slice(pub_inputs.stack_outputs().as_ref()); + felts.extend_from_slice(pub_inputs.pc_transcript_state().as_ref()); + + let mut fixed_len: Vec = felts.iter().map(|felt| felt.as_canonical_u64()).collect(); + fixed_len.resize(fixed_len.len().next_multiple_of(8), 0); + fixed_len + } + + fn commitment_to_u64s>(commitment: C) -> Vec { + let felts: [Felt; 4] = commitment.into(); + felts.iter().map(|felt| felt.as_canonical_u64()).collect() + } + + fn challenges_to_u64s(challenges: &[Challenge]) -> Vec { + let base: Vec = QuadFelt::flatten_to_base(challenges.to_vec()); + base.iter().map(|felt| felt.as_canonical_u64()).collect() + } } // ================================================================================================ @@ -197,23 +457,55 @@ fn test_rpx_prove_verify() { // ================================================================================================ mod fast_parallel { - use alloc::sync::Arc; + use alloc::{sync::Arc, vec::Vec}; use miden_assembly::{Assembler, DefaultSourceManager}; use miden_core::{ - Felt, + Felt, Word, + events::{EventId, EventName}, + precompile::{ + PrecompileCommitment, PrecompileError, PrecompileRequest, PrecompileTranscript, + PrecompileVerifier, PrecompileVerifierRegistry, + }, proof::{ExecutionProof, HashFunction}, }; + use miden_core_lib::CoreLibrary; use miden_processor::{ - ExecutionOptions, FastProcessor, StackInputs, advice::AdviceInputs, trace::build_trace, + DefaultHost, ExecutionOptions, FastProcessor, ProcessorState, StackInputs, StackOutputs, + advice::{AdviceInputs, AdviceMutation}, + event::{EventError, EventHandler}, + trace::build_trace, }; - use miden_prover::{config, prove_stark}; - use miden_verifier::verify; - use miden_vm::DefaultHost; + use miden_prover::{ + ProvingOptions, TraceProvingInputs, config, prove_from_trace_sync, prove_stark, + }; + use miden_verifier::{verify, verify_with_precompiles}; + use miden_vm::{Program, TraceBuildInputs}; /// Default fragment size for parallel trace generation const FRAGMENT_SIZE: usize = 1024; + fn parallel_execution_options() -> ExecutionOptions { + ExecutionOptions::default() + .with_core_trace_fragment_size(FRAGMENT_SIZE) + .unwrap() + } + + fn execute_parallel_trace_inputs( + program: &Program, + stack_inputs: StackInputs, + advice_inputs: AdviceInputs, + host: &mut DefaultHost, + ) -> TraceBuildInputs { + FastProcessor::new_with_options(stack_inputs, advice_inputs, parallel_execution_options()) + .execute_trace_inputs_sync(program, host) + .expect("Fast processor execution failed") + } + + fn default_source_manager_host() -> DefaultHost { + DefaultHost::default().with_source_manager(Arc::new(DefaultSourceManager::default())) + } + /// Test that proves and verifies using the fast processor + parallel trace generation path. /// This verifies the complete code path works end-to-end. /// @@ -234,22 +526,14 @@ mod fast_parallel { let program = Assembler::default().assemble_program(source).unwrap(); let stack_inputs = StackInputs::try_from_ints([0, 1]).unwrap(); let advice_inputs = AdviceInputs::default(); - let mut host = - DefaultHost::default().with_source_manager(Arc::new(DefaultSourceManager::default())); + let mut host = default_source_manager_host(); + let trace_inputs = + execute_parallel_trace_inputs(&program, stack_inputs, advice_inputs.clone(), &mut host); - let options = ExecutionOptions::default() - .with_core_trace_fragment_size(FRAGMENT_SIZE) - .unwrap(); - let fast_processor = - FastProcessor::new_with_options(stack_inputs, advice_inputs.clone(), options); - let (execution_output, trace_context) = fast_processor - .execute_for_trace_sync(&program, &mut host) - .expect("Fast processor execution failed"); - - let fast_stack_outputs = execution_output.stack; + let fast_stack_outputs = *trace_inputs.stack_outputs(); // Build trace using parallel trace generation - let trace = build_trace(execution_output, trace_context, program.to_info()).unwrap(); + let trace = build_trace(trace_inputs).unwrap(); // Convert trace to row-major format for proving let trace_matrix = trace.to_row_major_matrix(); @@ -279,4 +563,288 @@ mod fast_parallel { verify(program.into(), stack_inputs, fast_stack_outputs, proof) .expect("Verification failed"); } + + #[test] + fn test_prove_from_trace_sync() { + let source = " + begin + repeat.128 + swap dup.1 add + end + end + "; + + let program = Assembler::default().assemble_program(source).unwrap(); + let stack_inputs = StackInputs::try_from_ints([0, 1]).unwrap(); + let advice_inputs = AdviceInputs::default(); + let mut host = default_source_manager_host(); + let trace_inputs = + execute_parallel_trace_inputs(&program, stack_inputs, advice_inputs, &mut host); + + let (stack_outputs, proof) = prove_from_trace_sync(TraceProvingInputs::new( + trace_inputs, + ProvingOptions::with_96_bit_security(HashFunction::Blake3_256), + )) + .expect("prove_from_trace_sync failed"); + + verify(program.into(), stack_inputs, stack_outputs, proof).expect("Verification failed"); + } + + #[test] + fn test_prove_from_trace_sync_preserves_precompile_requests() { + let LoggedPrecompileProofFixture { + program, + stack_inputs, + stack_outputs, + proof, + verifier_registry, + expected_transcript, + } = prove_logged_precompile_fixture(HashFunction::Blake3_256); + + let (_, pc_transcript_digest) = verify_with_precompiles( + program.into(), + stack_inputs, + stack_outputs, + proof, + &verifier_registry, + ) + .expect("proof verification with precompiles failed"); + assert_eq!(expected_transcript.finalize(), pc_transcript_digest); + } + + #[test] + fn test_poseidon2_recursive_verify_with_precompile_requests() { + let LoggedPrecompileProofFixture { + program, + stack_inputs, + stack_outputs, + proof, + verifier_registry, + expected_transcript, + } = prove_logged_precompile_fixture(HashFunction::Poseidon2); + + super::assert_recursive_verify( + program.to_info(), + stack_inputs, + stack_outputs, + expected_transcript.state(), + &proof, + ); + + verify_with_precompiles( + program.into(), + stack_inputs, + stack_outputs, + proof, + &verifier_registry, + ) + .expect("proof verification with precompiles failed"); + } + + fn prove_logged_precompile_fixture(hash_fn: HashFunction) -> LoggedPrecompileProofFixture { + const NUM_ITERATIONS: usize = 256; + let fixtures = logged_precompile_fixtures(NUM_ITERATIONS); + + let request_snippets = fixtures + .iter() + .map(LoggedPrecompileFixture::source_snippet) + .collect::>() + .join("\n"); + + let source = format!( + " + use miden::core::sys + + begin + {request_snippets} + end + " + ); + + let program = Assembler::default() + .with_dynamic_library(CoreLibrary::default()) + .expect("failed to load core library") + .assemble_program(source) + .expect("failed to assemble log_precompile fixture"); + let stack_inputs = StackInputs::default(); + let advice_inputs = AdviceInputs::default(); + let mut host = DefaultHost::default(); + let core_lib = CoreLibrary::default(); + host.load_library(&core_lib).expect("failed to load core library into host"); + for fixture in &fixtures { + host.register_handler( + fixture.event_name.clone(), + Arc::new(DummyLogPrecompileHandler::new(fixture)), + ) + .expect("failed to register dummy handler"); + } + + let trace_inputs = + execute_parallel_trace_inputs(&program, stack_inputs, advice_inputs, &mut host); + assert!( + trace_inputs.trace_generation_context().core_trace_contexts.len() > 1, + "expected precompile fixture to span multiple core-trace fragments" + ); + + let (stack_outputs, proof) = prove_from_trace_sync(TraceProvingInputs::new( + trace_inputs, + ProvingOptions::with_96_bit_security(hash_fn), + )) + .expect("prove_from_trace_sync failed"); + + let expected_requests = + fixtures.iter().map(LoggedPrecompileFixture::request).collect::>(); + + assert_eq!(proof.precompile_requests(), expected_requests.as_slice()); + + let verifier_registry = + fixtures.iter().fold(PrecompileVerifierRegistry::new(), |registry, fixture| { + registry.with_verifier( + &fixture.event_name, + Arc::new(DummyLogPrecompileVerifier::new(fixture)), + ) + }); + let transcript = verifier_registry + .requests_transcript(proof.precompile_requests()) + .expect("failed to recompute deferred commitment"); + let mut expected_transcript = PrecompileTranscript::new(); + for fixture in &fixtures { + expected_transcript.record(fixture.commitment); + } + assert_eq!(transcript.finalize(), expected_transcript.finalize()); + + LoggedPrecompileProofFixture { + program, + stack_inputs, + stack_outputs, + proof, + verifier_registry, + expected_transcript, + } + } + + struct LoggedPrecompileProofFixture { + program: Program, + stack_inputs: StackInputs, + stack_outputs: StackOutputs, + proof: ExecutionProof, + verifier_registry: PrecompileVerifierRegistry, + expected_transcript: PrecompileTranscript, + } + + fn logged_precompile_fixtures(num_iterations: usize) -> Vec { + (0..num_iterations) + .flat_map(|iteration| { + (0..3) + .map(move |slot| LoggedPrecompileFixture::for_iteration(iteration as u8, slot)) + }) + .collect() + } + + #[derive(Clone)] + struct LoggedPrecompileFixture { + event_name: EventName, + calldata: Vec, + commitment: PrecompileCommitment, + } + + impl LoggedPrecompileFixture { + fn new(event_name: EventName, calldata: [u8; 4], tag: Word, comm_calldata: Word) -> Self { + Self { + event_name, + calldata: calldata.into(), + commitment: PrecompileCommitment::new(tag, comm_calldata), + } + } + + fn for_iteration(iteration: u8, slot: u8) -> Self { + let event_name = + EventName::from_string(format!("test::sys::log_precompile_{iteration}_{slot}")); + let iteration = u64::from(iteration); + let slot = u64::from(slot); + let event_id = EventId::from_name(event_name.as_str()); + + Self::new( + event_name, + [ + iteration as u8, + slot as u8, + (iteration + slot) as u8, + ((iteration * 3) + slot + 1) as u8, + ], + Word::from([ + event_id.as_felt(), + Felt::new(iteration + 1), + Felt::new(slot + 1), + Felt::new((iteration * 3) + slot + 7), + ]), + Word::from([ + Felt::new((iteration * 5) + slot + 11), + Felt::new((iteration * 7) + slot + 13), + Felt::new((iteration * 11) + slot + 17), + Felt::new((iteration * 13) + slot + 19), + ]), + ) + } + + fn event_id(&self) -> EventId { + self.commitment.event_id() + } + + fn request(&self) -> PrecompileRequest { + PrecompileRequest::new(self.event_id(), self.calldata.clone()) + } + + fn source_snippet(&self) -> String { + format!( + "emit.event(\"{event_name}\")\n\ + push.{tag} push.{comm}\n\ + exec.sys::log_precompile_request", + event_name = self.event_name, + tag = self.commitment.tag(), + comm = self.commitment.comm_calldata(), + ) + } + } + + #[derive(Clone)] + struct DummyLogPrecompileHandler { + event_id: EventId, + calldata: Vec, + } + + impl DummyLogPrecompileHandler { + fn new(fixture: &LoggedPrecompileFixture) -> Self { + Self { + event_id: fixture.event_id(), + calldata: fixture.calldata.clone(), + } + } + } + + impl EventHandler for DummyLogPrecompileHandler { + fn on_event(&self, _process: &ProcessorState) -> Result, EventError> { + Ok(vec![AdviceMutation::extend_precompile_requests([PrecompileRequest::new( + self.event_id, + self.calldata.clone(), + )])]) + } + } + + #[derive(Clone)] + struct DummyLogPrecompileVerifier { + commitment: PrecompileCommitment, + } + + impl DummyLogPrecompileVerifier { + fn new(fixture: &LoggedPrecompileFixture) -> Self { + Self { commitment: fixture.commitment } + } + } + + impl PrecompileVerifier for DummyLogPrecompileVerifier { + fn verify(&self, _calldata: &[u8]) -> Result { + Ok(self.commitment) + } + } } diff --git a/processor/Cargo.toml b/processor/Cargo.toml index 062874dfda..c6ccb46b6c 100644 --- a/processor/Cargo.toml +++ b/processor/Cargo.toml @@ -19,7 +19,7 @@ bench = false doctest = false [features] -concurrent = ["std"] +concurrent = ["std", "miden-air/concurrent"] default = ["std"] std = [ "miden-core/std", @@ -46,19 +46,11 @@ rayon = { version = "1.10", default-features = false } tracing.workspace = true thiserror.workspace = true -# Platform-specific tokio dependencies -# On non-wasm targets, enable rt-multi-thread for better performance -[target.'cfg(not(target_family = "wasm"))'.dependencies] -tokio = { workspace = true, features = ["rt", "rt-multi-thread"] } - -# On wasm32, only basic tokio features are supported -[target.'cfg(target_family = "wasm")'.dependencies] -tokio = { workspace = true, features = ["rt", "macros"] } - [dev-dependencies] miden-assembly = { workspace = true, features = ["testing"] } miden-utils-testing.workspace = true insta.workspace = true -pretty_assertions = { version = "1.4" } +pretty_assertions = { workspace = true, features = ["std"] } proptest.workspace = true -rstest = { version = "0.26" } +rstest = { workspace = true } +tokio = { workspace = true, features = ["macros", "rt"] } diff --git a/processor/README.md b/processor/README.md index 54ac8c979c..995eda806c 100644 --- a/processor/README.md +++ b/processor/README.md @@ -5,7 +5,8 @@ This crate contains an implementation of Miden VM processor. The purpose of the The processor provides multiple APIs depending on your use case: ### High-level API -The `execute()` function provides a convenient interface that executes a program and generates a complete execution trace: +The `execute()` function provides a convenient interface that executes a program and returns the +resulting `ExecutionOutput`: * `program: &Program` - a reference to a Miden program to be executed. * `stack_inputs: StackInputs` - a set of public inputs with which to execute the program. @@ -13,14 +14,20 @@ The `execute()` function provides a convenient interface that executes a program * `host: &mut impl Host` - an instance of a host which can be used to supply non-deterministic inputs to the VM and receive messages from the VM. * `options: ExecutionOptions` - a set of options for executing the specified program (e.g., max allowed number of cycles). -The (async) function returns a `Result` which will contain the execution trace of the program if the execution was successful, or an error if the execution failed. +The (async) function returns a `Result` which will contain the +final stack state, advice provider, memory, and precompile transcript if the execution was +successful, or an error if the execution failed. + +If you also need an `ExecutionTrace`, use `FastProcessor::execute_trace_inputs()` / +`FastProcessor::execute_trace_inputs_sync()` and then pass the returned `TraceBuildInputs` bundle +to `build_trace()`. ### Low-level API For more control over execution and trace generation, you can use `FastProcessor` directly: * `FastProcessor::execute()` - Executes a program without any trace generation overhead. Returns `ExecutionOutput` containing the final stack state and other execution results. -* `FastProcessor::execute_for_trace()` - Executes a program while collecting metadata for trace generation. Returns both `ExecutionOutput` and `TraceGenerationContext`. -* `build_trace()` - Takes the `ExecutionOutput` and `TraceGenerationContext` from `execute_for_trace()` and constructs the full execution trace. When the `concurrent` feature is enabled, trace building is parallelized. +* `FastProcessor::execute_trace_inputs()` / `FastProcessor::execute_trace_inputs_sync()` - Executes a program while collecting the execution metadata required for trace generation. Returns a `TraceBuildInputs` bundle. +* `build_trace()` - Takes the `TraceBuildInputs` bundle from `execute_trace_inputs*()` and constructs the full execution trace. When the `concurrent` feature is enabled, trace building is parallelized. ## Processor components The processor is separated into two main components: **execution** and **trace generation**. @@ -29,10 +36,10 @@ The processor is separated into two main components: **execution** and **trace g The `FastProcessor` is designed for fast program execution with minimal overhead. It can operate in two modes: * **Pure execution** via `FastProcessor::execute()`: Executes a program without generating any trace-related metadata. This mode is optimized for maximum performance when proof generation is not required. -* **Execution for trace generation** via `FastProcessor::execute_for_trace()`: Executes a program while collecting metadata required for subsequent trace generation. This metadata is encapsulated in a `TraceGenerationContext` that is passed to the `build_trace()` function. +* **Execution for trace generation** via `FastProcessor::execute_trace_inputs()` / `FastProcessor::execute_trace_inputs_sync()`: Executes a program while collecting the metadata required for subsequent trace generation. This metadata is bundled with the execution output into `TraceBuildInputs`, which is then passed to `build_trace()`. ### Trace generation with `build_trace()` -After execution with `FastProcessor::execute_for_trace()`, the `build_trace()` function uses the returned `TraceGenerationContext` to construct the full execution trace. When the `concurrent` feature is enabled, trace generation is parallelized for improved performance. +After execution with `FastProcessor::execute_trace_inputs*()`, the `build_trace()` function uses the returned `TraceBuildInputs` bundle to construct the full execution trace. When the `concurrent` feature is enabled, trace generation is parallelized for improved performance. The trace consists of several sections: * The decoder, which tracks instruction decoding and control flow. diff --git a/processor/src/errors.rs b/processor/src/errors.rs index 37c5f6fa67..f473f5bac1 100644 --- a/processor/src/errors.rs +++ b/processor/src/errors.rs @@ -8,7 +8,7 @@ use miden_debug_types::{SourceFile, SourceSpan}; use miden_utils_diagnostics::{Diagnostic, miette}; use crate::{ - ContextId, DebugError, Felt, Host, TraceError, Word, + BaseHost, ContextId, DebugError, Felt, TraceError, Word, advice::AdviceError, event::{EventError, EventId, EventName}, fast::SystemEventError, @@ -294,6 +294,21 @@ pub enum OperationError { err_code: Felt, err_msg: Option>, }, + #[error( + "u32 assertion failed with error {}: invalid values: {invalid_values:?}", + match err_msg { + Some(msg) => format!("message: {msg}"), + None => format!("code: {err_code}"), + } + )] + #[diagnostic(help( + "u32assert2 requires both stack values to be valid 32-bit unsigned integers" + ))] + U32AssertionFailed { + err_code: Felt, + err_msg: Option>, + invalid_values: Vec, + }, #[error("FRI operation failed: {0}")] FriError(String), #[error( @@ -347,7 +362,7 @@ impl OperationError { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, ) -> ExecutionError { let (label, source_file) = get_label_and_source_file(None, mast_forest, node_id, host); ExecutionError::OperationError { label, source_file, err: self } @@ -378,7 +393,7 @@ fn get_label_and_source_file( op_idx: Option, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, ) -> (SourceSpan, Option>) { mast_forest .get_assembly_op(node_id, op_idx) @@ -397,7 +412,7 @@ pub fn advice_error_with_context( err: AdviceError, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, ) -> ExecutionError { let (label, source_file) = get_label_and_source_file(None, mast_forest, node_id, host); ExecutionError::AdviceError { label, source_file, err } @@ -411,7 +426,7 @@ pub fn event_error_with_context( error: EventError, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, event_id: EventId, event_name: Option, ) -> ExecutionError { @@ -430,7 +445,7 @@ pub fn procedure_not_found_with_context( root_digest: Word, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, ) -> ExecutionError { let (label, source_file) = get_label_and_source_file(None, mast_forest, node_id, host); ExecutionError::ProcedureNotFound { label, source_file, root_digest } @@ -453,7 +468,7 @@ pub trait MapExecErr { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, ) -> Result; } @@ -466,7 +481,7 @@ pub trait MapExecErrWithOpIdx { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, op_idx: usize, ) -> Result; } @@ -486,7 +501,7 @@ impl MapExecErr for Result { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, ) -> Result { match self { Ok(v) => Ok(v), @@ -505,7 +520,7 @@ impl MapExecErrWithOpIdx for Result { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, op_idx: usize, ) -> Result { match self { @@ -540,7 +555,7 @@ impl MapExecErr for Result { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, ) -> Result { match self { Ok(v) => Ok(v), @@ -570,7 +585,7 @@ impl MapExecErr for Result { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, ) -> Result { match self { Ok(v) => Ok(v), @@ -589,7 +604,7 @@ impl MapExecErrWithOpIdx for Result { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, op_idx: usize, ) -> Result { match self { @@ -610,7 +625,7 @@ impl MapExecErr for Result { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, ) -> Result { match self { Ok(v) => Ok(v), @@ -639,7 +654,7 @@ impl MapExecErrWithOpIdx for Result { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, op_idx: usize, ) -> Result { match self { @@ -670,7 +685,7 @@ impl MapExecErrWithOpIdx for Result { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, op_idx: usize, ) -> Result { match self { @@ -699,7 +714,7 @@ impl MapExecErrWithOpIdx for Result { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, op_idx: usize, ) -> Result { match self { @@ -727,7 +742,7 @@ impl MapExecErrWithOpIdx for Result { self, mast_forest: &MastForest, node_id: MastNodeId, - host: &impl Host, + host: &impl BaseHost, op_idx: usize, ) -> Result { match self { diff --git a/processor/src/execution/basic_block.rs b/processor/src/execution/basic_block.rs index b432538003..e8e19c1fe8 100644 --- a/processor/src/execution/basic_block.rs +++ b/processor/src/execution/basic_block.rs @@ -2,7 +2,7 @@ use alloc::sync::Arc; use core::ops::ControlFlow; use crate::{ - BreakReason, Host, Stopper, + BaseHost, BreakReason, Stopper, continuation_stack::{Continuation, ContinuationStack}, execution::{ ExecutionState, InternalBreakReason, execute_op, finalize_clock_cycle_with_continuation, @@ -27,7 +27,7 @@ pub(super) fn execute_basic_block_node_from_start( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { @@ -85,7 +85,7 @@ pub(super) fn execute_basic_block_node_from_op_idx( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { @@ -127,7 +127,7 @@ pub(super) fn execute_basic_block_node_from_batch( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { @@ -200,7 +200,7 @@ pub(super) fn finish_basic_block( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { @@ -248,7 +248,7 @@ fn execute_op_batch( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { diff --git a/processor/src/execution/call.rs b/processor/src/execution/call.rs index cce0f39f58..004f96fe0b 100644 --- a/processor/src/execution/call.rs +++ b/processor/src/execution/call.rs @@ -4,7 +4,7 @@ use core::ops::ControlFlow; use miden_core::{FMP_ADDR, FMP_INIT_VALUE}; use crate::{ - BreakReason, ContextId, Host, MapExecErr, Stopper, + BaseHost, BreakReason, ContextId, MapExecErr, Stopper, continuation_stack::Continuation, execution::{ ExecutionState, finalize_clock_cycle, finalize_clock_cycle_with_continuation, @@ -29,7 +29,7 @@ pub(super) fn start_call_node( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { @@ -110,7 +110,7 @@ pub(super) fn finish_call_node( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { diff --git a/processor/src/execution/dyn.rs b/processor/src/execution/dyn.rs index 1bf21daea3..85f2462b53 100644 --- a/processor/src/execution/dyn.rs +++ b/processor/src/execution/dyn.rs @@ -4,7 +4,7 @@ use core::ops::ControlFlow; use miden_core::{FMP_ADDR, FMP_INIT_VALUE}; use crate::{ - BreakReason, ContextId, Host, MapExecErr, Stopper, + BaseHost, BreakReason, ContextId, MapExecErr, Stopper, continuation_stack::{Continuation, ContinuationStack}, execution::{ ExecutionState, InternalBreakReason, finalize_clock_cycle, @@ -27,7 +27,7 @@ pub(super) fn start_dyn_node( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { @@ -182,7 +182,7 @@ pub(super) fn finish_dyn_node( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { diff --git a/processor/src/execution/external.rs b/processor/src/execution/external.rs index a41db94986..0935150e6a 100644 --- a/processor/src/execution/external.rs +++ b/processor/src/execution/external.rs @@ -2,7 +2,7 @@ use alloc::sync::Arc; use core::ops::ControlFlow; use crate::{ - BreakReason, Host, + BaseHost, BreakReason, continuation_stack::ContinuationStack, execution::InternalBreakReason, mast::{MastForest, MastNodeExt, MastNodeId}, @@ -20,7 +20,7 @@ pub(super) fn execute_external_node( processor: &mut impl Processor, external_node_id: MastNodeId, current_forest: &mut Arc, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow { // Execute decorators that should be executed before entering the node processor @@ -46,7 +46,7 @@ pub fn finish_load_mast_forest_from_external( external_node_id: MastNodeId, current_forest: &mut Arc, continuation_stack: &mut ContinuationStack, - host: &mut impl Host, + host: &mut impl BaseHost, tracer: &mut impl Tracer, ) -> ControlFlow { let external_node = current_forest[external_node_id].unwrap_external(); diff --git a/processor/src/execution/join.rs b/processor/src/execution/join.rs index eb0783a696..46a5cd0934 100644 --- a/processor/src/execution/join.rs +++ b/processor/src/execution/join.rs @@ -2,7 +2,7 @@ use alloc::sync::Arc; use core::ops::ControlFlow; use crate::{ - BreakReason, Host, Stopper, + BaseHost, BreakReason, Stopper, continuation_stack::Continuation, execution::{ExecutionState, finalize_clock_cycle, finalize_clock_cycle_with_continuation}, mast::{JoinNode, MastForest, MastNodeId}, @@ -23,7 +23,7 @@ pub(super) fn start_join_node( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { @@ -62,7 +62,7 @@ pub(super) fn finish_join_node( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { diff --git a/processor/src/execution/loop.rs b/processor/src/execution/loop.rs index 77d3a49493..b4e5eba389 100644 --- a/processor/src/execution/loop.rs +++ b/processor/src/execution/loop.rs @@ -2,7 +2,7 @@ use alloc::sync::Arc; use core::ops::ControlFlow; use crate::{ - BreakReason, Host, MapExecErr, ONE, Stopper, ZERO, + BaseHost, BreakReason, MapExecErr, ONE, Stopper, ZERO, continuation_stack::Continuation, execution::{ExecutionState, finalize_clock_cycle, finalize_clock_cycle_with_continuation}, mast::{LoopNode, MastForest, MastNodeId}, @@ -24,7 +24,7 @@ pub(super) fn start_loop_node( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { @@ -53,8 +53,12 @@ where // execute the loop body as long as the condition is true if condition == ONE { - // Push the loop to check condition again after body - // executes + // Push the loop to check condition again after body executes. + // + // WARNING: if we eventually push another continuation in between the `FinishLoop` and the + // `StartNode` continuations, then the logic in `ExecutionTracer::start_clock_cycle()` that + // computes the value for the `is_loop_body` flag will be incorrect and needs to be + // adjusted. state.continuation_stack.push_finish_loop_entered(current_node_id); state.continuation_stack.push_start_node(loop_node.body()); @@ -110,7 +114,7 @@ pub(super) fn finish_loop_node( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { diff --git a/processor/src/execution/mod.rs b/processor/src/execution/mod.rs index 12c57d87d6..c998322110 100644 --- a/processor/src/execution/mod.rs +++ b/processor/src/execution/mod.rs @@ -2,7 +2,7 @@ use alloc::sync::Arc; use core::ops::ControlFlow; use crate::{ - BreakReason, ContextId, Host, Kernel, Stopper, Word, + BaseHost, BreakReason, ContextId, Kernel, Stopper, Word, continuation_stack::{Continuation, ContinuationStack}, mast::{MastForest, MastNode, MastNodeId}, processor::{Processor, SystemInterface}, @@ -58,9 +58,9 @@ pub(crate) struct ExecutionState<'a, P, H, S, T> { /// # Tracing /// /// Different processor implementations will need to record different pieces of information as the -/// the program is executed. For example, the [`crate::FastProcessor::execute_for_trace`] -/// execution mode needs to build a [`crate::fast::execution_tracer::TraceGenerationContext`] which -/// records information necessary to build the trace at each clock cycle, while the +/// the program is executed. For example, the [`crate::FastProcessor::execute_trace_inputs`] +/// execution mode needs to build a [`crate::TraceGenerationContext`] which records information +/// necessary to build the trace at each clock cycle, while the /// [`crate::parallel::core_trace_fragment::CoreTraceFragmentFiller`] needs to build the trace /// essentially by recording the processor state at each clock cycle. For this purpose, the /// [`Self::execute_impl`] method takes in [`Tracer`] argument that abstracts away the "information @@ -101,7 +101,7 @@ pub(crate) struct ExecutionState<'a, P, H, S, T> { /// // Handle user-initiated break (e.g., propagate break reason) /// }, /// InternalBreakReason::Emit { basic_block_node_id, op_idx, continuation } => { -/// // Handle Emit operation (e.g., call `Host::on_event`) +/// // Handle Emit operation (e.g., call `SyncHost::on_event`) /// self.op_emit(...); /// /// // As per `InternalBreakReason::Emit` documentation, we call `finish_emit_op_execution` @@ -132,7 +132,7 @@ pub(crate) fn execute_impl( continuation_stack: &mut ContinuationStack, current_forest: &mut Arc, kernel: &Kernel, - host: &mut impl Host, + host: &mut impl BaseHost, tracer: &mut T, stopper: &S, ) -> ControlFlow diff --git a/processor/src/execution/operations/crypto_ops/tests.rs b/processor/src/execution/operations/crypto_ops/tests.rs index 6489d2101d..3274a83900 100644 --- a/processor/src/execution/operations/crypto_ops/tests.rs +++ b/processor/src/execution/operations/crypto_ops/tests.rs @@ -6,7 +6,7 @@ use miden_core::{ crypto::merkle::{MerkleStore, MerkleTree, NodeIndex}, field::{BasedVectorSpace, QuadFelt}, mast::MastForest, - program::{MIN_STACK_DEPTH, StackInputs}, + program::StackInputs, }; use proptest::prelude::*; @@ -807,18 +807,3 @@ fn test_op_mrupdate_merge_subtree() { fn init_node(value: u64) -> Word { [Felt::new(value), ZERO, ZERO, ZERO].into() } - -/// Builds an expected stack state from the given values. -/// -/// The values are provided in "stack order" (top of stack first), and the result is a Vec -/// that can be compared with `processor.stack_top()`, where the top of the stack is at the -/// **last** index. -#[allow(dead_code)] -fn build_expected(values: &[u64]) -> Vec { - let mut expected = vec![ZERO; MIN_STACK_DEPTH]; - for (i, &value) in values.iter().enumerate() { - // In the result, top of stack is at index 15, second at 14, etc. - expected[15 - i] = Felt::new(value); - } - expected -} diff --git a/processor/src/execution/operations/fri_ops/mod.rs b/processor/src/execution/operations/fri_ops/mod.rs index acfdac46ca..fe60d3b8a3 100644 --- a/processor/src/execution/operations/fri_ops/mod.rs +++ b/processor/src/execution/operations/fri_ops/mod.rs @@ -23,14 +23,19 @@ mod tests; /// - Checks that the previous folding was done correctly. /// - Shifts the stack to the left to move an item from the overflow table to stack position 15. /// +/// Bit-reversal handling: +/// - Query values exist on the stack in bit-reversed order. +/// - p on the stack is a bit-reversed tree index. The instruction internally computes d_seg = p & 3 +/// (bit-reversed coset index) for the consistency check and tau factor. f_pos is provided +/// separately on the stack and the AIR constrains f_pos = p >> 2 via p = 4*f_pos + d_seg. +/// /// Stack transition for this operation looks as follows: /// /// Input: -/// [v0, v1, v2, v3, v4, v5, v6, v7, f_pos, d_seg, poe, pe1, pe0, a1, a0, cptr, ...] +/// [v0, v1, v2, v3, v4, v5, v6, v7, f_pos, p, poe, pe0, pe1, a0, a1, cptr, ...] /// /// Output: -/// [t1, t0, s1, s0, df3, df2, df1, df0, poe^2, f_tau, cptr+2, poe^4, f_pos, ne1, ne0, eptr, -/// ...] +/// [t0, t1, s0, s1, df3, df2, df1, df0, poe^2, f_tau, cptr+8, poe^4, f_pos, ne0, ne1, eptr, ...] /// /// In the above, eptr is moved from the stack overflow table and is expected to be the address /// of the final FRI layer. @@ -49,9 +54,12 @@ where { // --- read all relevant variables from the stack --------------------- let query_values = get_query_values(processor); - let folded_pos = processor.stack().get(8); - // the segment identifier of the position in the source domain - let domain_segment = processor.stack().get(9).as_canonical_u64(); + // Reorder from bit-reversed to natural for fold4. + let query_values_reordered = reorder_bitrev4(query_values); + // p is the bit-reversed tree index; compute f_pos and d_seg from it + let p = processor.stack().get(9).as_canonical_u64(); + let domain_segment = p & 3; + let folded_pos = Felt::new(p >> 2); // the power of the domain generator which can be used to determine current domain value x let poe = processor.stack().get(10); if poe.is_zero() { @@ -59,14 +67,14 @@ where } // the result of the previous layer folding let prev_value = { - let pe1 = processor.stack().get(11); - let pe0 = processor.stack().get(12); + let pe0 = processor.stack().get(11); + let pe1 = processor.stack().get(12); QuadFelt::from_basis_coefficients_fn(|i: usize| [pe0, pe1][i]) }; // the verifier challenge for the current layer let alpha = { - let a1 = processor.stack().get(13); - let a0 = processor.stack().get(14); + let a0 = processor.stack().get(13); + let a1 = processor.stack().get(14); QuadFelt::from_basis_coefficients_fn(|i: usize| [a0, a1][i]) }; // the memory address of the current layer @@ -79,26 +87,37 @@ where ))); } + // Consistency check: query_values[d_seg] == prev_value. + // Both query_values and d_seg are bit-reversed, so indexing works out correctly. let d_seg = domain_segment as usize; if query_values[d_seg] != prev_value { return Err(OperationError::FriError(format!( - "degree-respecting projection is inconsistent: expected {} but was {}", - prev_value, query_values[d_seg] + "degree-respecting projection is inconsistent at d_seg={d_seg} poe={} fpos={}: expected {} but was {}; all values: [0]={} [1]={} [2]={} [3]={}", + poe.as_canonical_u64(), + folded_pos.as_canonical_u64(), + prev_value, + query_values[d_seg], + query_values[0], + query_values[1], + query_values[2], + query_values[3] ))); } // --- fold query values ---------------------------------------------- - let f_tau = get_tau_factor(d_seg); + // Bit-reverse d_seg to get natural coset index for tau factor and domain segment flags. + let d_seg_rev = bit_reverse_segment(d_seg); + let f_tau = get_tau_factor(d_seg_rev); let x = poe * f_tau; let x_inv = x.inverse(); let (ev, es) = compute_evaluation_points(alpha, x_inv); - let (folded_value, tmp0, tmp1) = fold4(query_values, ev, es); + let (folded_value, tmp0, tmp1) = fold4(query_values_reordered, ev, es); // --- write the relevant values into the next state of the stack ----- let tmp0 = tmp0.as_basis_coefficients_slice(); let tmp1 = tmp1.as_basis_coefficients_slice(); - let ds = get_domain_segment_flags(d_seg); + let ds = get_domain_segment_flags(d_seg_rev); let folded_value = folded_value.as_basis_coefficients_slice(); let poe2 = poe * poe; @@ -106,18 +125,18 @@ where processor.stack_mut().decrement_size()?; - processor.stack_mut().set(0, tmp0[1]); - processor.stack_mut().set(1, tmp0[0]); - processor.stack_mut().set(2, tmp1[1]); - processor.stack_mut().set(3, tmp1[0]); + processor.stack_mut().set(0, tmp0[0]); + processor.stack_mut().set(1, tmp0[1]); + processor.stack_mut().set(2, tmp1[0]); + processor.stack_mut().set(3, tmp1[1]); processor.stack_mut().set_word(4, &ds.into()); processor.stack_mut().set(8, poe2); processor.stack_mut().set(9, f_tau); processor.stack_mut().set(10, layer_ptr + EIGHT); processor.stack_mut().set(11, poe4); processor.stack_mut().set(12, folded_pos); - processor.stack_mut().set(13, folded_value[1]); - processor.stack_mut().set(14, folded_value[0]); + processor.stack_mut().set(13, folded_value[0]); + processor.stack_mut().set(14, folded_value[1]); Ok(OperationHelperRegisters::FriExt2Fold4 { ev, es, x, x_inv }) } @@ -145,6 +164,24 @@ fn get_query_values(processor: &mut P) -> [QuadFelt; 4] { ] } +/// Bit-reverses a 2-bit segment index: 0->0, 1->2, 2->1, 3->3. +#[inline(always)] +fn bit_reverse_segment(domain_segment: usize) -> usize { + match domain_segment { + 0 => 0, + 1 => 2, + 2 => 1, + 3 => 3, + _ => panic!("invalid domain segment {domain_segment}"), + } +} + +/// Reorders 4 evals from bit-reversed order to natural order. +#[inline(always)] +fn reorder_bitrev4(values: [QuadFelt; 4]) -> [QuadFelt; 4] { + [values[0], values[2], values[1], values[3]] +} + // HELPER FUNCTIONS // ================================================================================================ diff --git a/processor/src/execution/operations/fri_ops/tests.rs b/processor/src/execution/operations/fri_ops/tests.rs index 0e37a921e0..304a5e9e29 100644 --- a/processor/src/execution/operations/fri_ops/tests.rs +++ b/processor/src/execution/operations/fri_ops/tests.rs @@ -6,9 +6,9 @@ use miden_core::{ use proptest::prelude::*; use super::{ - super::stack_ops::op_push, EIGHT, TAU_INV, TAU2_INV, TAU3_INV, TWO_INV, + super::stack_ops::op_push, EIGHT, TAU_INV, TAU2_INV, TAU3_INV, TWO_INV, bit_reverse_segment, compute_evaluation_points, fold4 as fri_fold4, get_domain_segment_flags, get_tau_factor, - op_fri_ext2fold4, + op_fri_ext2fold4, reorder_bitrev4, }; use crate::{ fast::FastProcessor, @@ -18,10 +18,6 @@ use crate::{ // FRI FOLDING TESTS // -------------------------------------------------------------------------------------------- -// NOTE: The `test_fold4` proptest that compared our fold4 implementation against Winterfell's -// FRI folding has been removed as we've migrated from Winterfell to Plonky3. -// The test_op_fri_ext2fold4 proptest below still validates the fold4 implementation. - /// Tests that the pre-computed FRI constants are correct. #[test] fn test_constants() { @@ -53,8 +49,8 @@ proptest! { v2_1 in any::(), v3_0 in any::(), v3_1 in any::(), - // Folded position - f_pos in any::(), + // Tree position (f_pos, must fit in u32 to avoid overflow when computing p = f_pos*4+d_seg) + f_pos in 0u64..=(u32::MAX as u64 >> 2), // Domain segment (0-3) d_seg in 0u64..4, // Power of domain generator (must be non-zero to avoid InvalidFriDomainGenerator) @@ -81,15 +77,16 @@ proptest! { let alpha = QuadFelt::new([Felt::new(alpha_0), Felt::new(alpha_1)]); let poe = Felt::new(poe); - let f_pos = Felt::new(f_pos); - let d_seg_felt = Felt::new(d_seg); + let f_pos_felt = Felt::new(f_pos); + // p = f_pos * 4 + d_seg + let p = Felt::new(f_pos * 4 + d_seg); let layer_ptr = Felt::new(layer_ptr); let end_ptr = Felt::new(end_ptr); // Build the stack inputs (only 16 elements for initial stack) // The operation expects the following layout after pushing v0 (17 elements): - // [v0, v1, v2, v3, v4, v5, v6, v7, f_pos, d_seg, poe, pe1, pe0, a1, a0, cptr, end_ptr] - // ^0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 overflow + // [v0, v1, v2, v3, v4, v5, v6, v7, f_pos, p, poe, pe0, pe1, a0, a1, cptr, end_ptr] + // ^0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 overflow let stack_inputs = [ query_values[0].as_basis_coefficients_slice()[1], // position 0 -> 1 (v1) after push query_values[1].as_basis_coefficients_slice()[0], // position 1 -> 2 (v2) @@ -98,13 +95,13 @@ proptest! { query_values[2].as_basis_coefficients_slice()[1], // position 4 -> 5 (v5) query_values[3].as_basis_coefficients_slice()[0], // position 5 -> 6 (v6) query_values[3].as_basis_coefficients_slice()[1], // position 6 -> 7 (v7) - f_pos, // position 7 -> 8 - d_seg_felt, // position 8 -> 9 + f_pos_felt, // position 7 -> 8 + p, // position 8 -> 9 poe, // position 9 -> 10 - prev_value_base[1], // position 10 -> 11 (pe1) - prev_value_base[0], // position 11 -> 12 (pe0) - Felt::new(alpha_1), // position 12 -> 13 (a1) - Felt::new(alpha_0), // position 13 -> 14 (a0) + prev_value_base[0], // position 10 -> 11 (pe0) + prev_value_base[1], // position 11 -> 12 (pe1) + Felt::new(alpha_0), // position 12 -> 13 (a0) + Felt::new(alpha_1), // position 13 -> 14 (a1) layer_ptr, // position 14 -> 15 after push (cptr) end_ptr, // position 15 (will be pushed to overflow) ]; @@ -112,7 +109,7 @@ proptest! { let mut processor = FastProcessor::new(StackInputs::new(&stack_inputs).unwrap()); // Push v0 to the top of the stack - // This shifts everything down by one position, moving end_ptr to overflow + // This shifts everything down by one position, moving end_ptr to overflow portion of the stack let v0 = query_values[0].as_basis_coefficients_slice()[0]; op_push(&mut processor, v0).unwrap(); processor.system_mut().increment_clock(); @@ -123,16 +120,18 @@ proptest! { processor.system_mut().increment_clock(); // Compute expected values - let f_tau = get_tau_factor(d_seg as usize); + let d_seg_rev = bit_reverse_segment(d_seg as usize); + let f_tau = get_tau_factor(d_seg_rev); let x = poe * f_tau; let x_inv = x.inverse(); let (ev, es) = compute_evaluation_points(alpha, x_inv); - let (folded_value, tmp0, tmp1) = fri_fold4(query_values, ev, es); + let query_values_reordered = reorder_bitrev4(query_values); + let (folded_value, tmp0, tmp1) = fri_fold4(query_values_reordered, ev, es); let tmp0_base: &[Felt] = tmp0.as_basis_coefficients_slice(); let tmp1_base: &[Felt] = tmp1.as_basis_coefficients_slice(); - let ds = get_domain_segment_flags(d_seg as usize); + let ds = get_domain_segment_flags(d_seg_rev); let folded_value_base: &[Felt] = folded_value.as_basis_coefficients_slice(); let poe2 = poe.square(); let poe4 = poe2.square(); @@ -141,10 +140,10 @@ proptest! { let stack = processor.stack_top(); // Check temp values (tmp0, tmp1) - prop_assert_eq!(stack[15], tmp0_base[1], "tmp0[1] at position 0"); - prop_assert_eq!(stack[14], tmp0_base[0], "tmp0[0] at position 1"); - prop_assert_eq!(stack[13], tmp1_base[1], "tmp1[1] at position 2"); - prop_assert_eq!(stack[12], tmp1_base[0], "tmp1[0] at position 3"); + prop_assert_eq!(stack[15], tmp0_base[0], "tmp0[0] at position 0"); + prop_assert_eq!(stack[14], tmp0_base[1], "tmp0[1] at position 1"); + prop_assert_eq!(stack[13], tmp1_base[0], "tmp1[0] at position 2"); + prop_assert_eq!(stack[12], tmp1_base[1], "tmp1[1] at position 3"); // Check domain segment flags: ds[0] at position 4, ds[3] at position 7 prop_assert_eq!(stack[11], ds[0], "ds[0] at position 4"); @@ -157,11 +156,11 @@ proptest! { prop_assert_eq!(stack[6], f_tau, "f_tau at position 9"); prop_assert_eq!(stack[5], layer_ptr + EIGHT, "layer_ptr+8 at position 10"); prop_assert_eq!(stack[4], poe4, "poe^4 at position 11"); - prop_assert_eq!(stack[3], f_pos, "f_pos at position 12"); + prop_assert_eq!(stack[3], f_pos_felt, "f_pos at position 12"); // Check folded value - prop_assert_eq!(stack[2], folded_value_base[1], "folded_value[1] at position 13"); - prop_assert_eq!(stack[1], folded_value_base[0], "folded_value[0] at position 14"); + prop_assert_eq!(stack[2], folded_value_base[0], "folded_value[0] at position 13"); + prop_assert_eq!(stack[1], folded_value_base[1], "folded_value[1] at position 14"); // Check end ptr (should be moved from overflow table) prop_assert_eq!(stack[0], end_ptr, "end_ptr at position 15"); diff --git a/processor/src/execution/operations/mod.rs b/processor/src/execution/operations/mod.rs index 48682f468a..11a6a7b94a 100644 --- a/processor/src/execution/operations/mod.rs +++ b/processor/src/execution/operations/mod.rs @@ -1,5 +1,5 @@ use crate::{ - ExecutionError, Felt, Host, + BaseHost, ExecutionError, Felt, errors::MapExecErrWithOpIdx, mast::{MastForest, MastNodeId}, operation::Operation, @@ -45,7 +45,7 @@ pub(crate) fn execute_op( op_idx: usize, current_forest: &MastForest, node_id: MastNodeId, - host: &mut impl Host, + host: &mut impl BaseHost, tracer: &mut T, ) -> Result where @@ -165,8 +165,10 @@ where host, op_idx, )?, - Operation::U32assert2(err_code) => u32_ops::op_u32assert2(processor, *err_code, tracer) - .map_exec_err_with_op_idx(current_forest, node_id, host, op_idx)?, + Operation::U32assert2(err_code) => { + u32_ops::op_u32assert2(processor, *err_code, tracer, current_forest) + .map_exec_err_with_op_idx(current_forest, node_id, host, op_idx)? + }, // ----- stack manipulation ----------------------------------------------------------- Operation::Pad => stack_ops::op_pad(processor)?, diff --git a/processor/src/execution/operations/u32_ops/mod.rs b/processor/src/execution/operations/u32_ops/mod.rs index e1756eef47..69c930ebc1 100644 --- a/processor/src/execution/operations/u32_ops/mod.rs +++ b/processor/src/execution/operations/u32_ops/mod.rs @@ -4,6 +4,7 @@ use paste::paste; use crate::{ ExecutionError, Felt, ZERO, + mast::MastForest, operation::OperationError, processor::{Processor, StackInterface, SystemInterface}, tracer::{OperationHelperRegisters, Tracer}, @@ -300,10 +301,39 @@ where #[inline(always)] pub(super) fn op_u32assert2( processor: &mut P, - _err_code: Felt, + err_code: Felt, tracer: &mut T, + program: &MastForest, ) -> Result { - let (first, second) = require_u32_operands!(processor, [0, 1]); + let first = processor.stack().get(0); + let second = processor.stack().get(1); + + let first_invalid = first.as_canonical_u64() > U32_MAX; + let second_invalid = second.as_canonical_u64() > U32_MAX; + + if first_invalid || second_invalid { + let mut invalid_values = Vec::with_capacity(2); + if first_invalid { + invalid_values.push(first); + } + if second_invalid { + invalid_values.push(second); + } + + if err_code != ZERO { + // A custom error code was provided: surface it as a U32AssertionFailed so + // callers get both the error context *and* the offending values for + // richer diagnostics (addresses bobbinth's review suggestion). + let err_msg = program.resolve_error_message(err_code); + return Err(OperationError::U32AssertionFailed { err_code, err_msg, invalid_values }); + } + + // No custom error code: report the specific out-of-range values so + // the diagnostic layer can name them (matches historical behaviour and + // what u32assert / u32not / u32assertw expect when they internally + // lower to U32assert2(ZERO)). + return Err(OperationError::NotU32Values { values: invalid_values }); + } tracer.record_u32_range_checks(processor.system().clock(), first, second); diff --git a/processor/src/execution/operations/u32_ops/tests.rs b/processor/src/execution/operations/u32_ops/tests.rs index c365b7b16c..df5bc04373 100644 --- a/processor/src/execution/operations/u32_ops/tests.rs +++ b/processor/src/execution/operations/u32_ops/tests.rs @@ -1,5 +1,6 @@ -use alloc::vec::Vec; +use alloc::{sync::Arc, vec::Vec}; +use miden_assembly::{Assembler, DefaultSourceManager}; use miden_core::{ Felt, ZERO, mast::{MastForest, MastNodeId}, @@ -15,7 +16,7 @@ use crate::{ DefaultHost, ExecutionError, execution::operations::execute_op, fast::{FastProcessor, NoopTracer}, - operation::Operation, + operation::{Operation, OperationError}, }; // CASTING OPERATIONS @@ -68,46 +69,231 @@ proptest! { ]).unwrap()); let mut tracer = NoopTracer; - let _ = op_u32assert2(&mut processor, ZERO, &mut tracer).unwrap(); + let _ = op_u32assert2(&mut processor, ZERO, &mut tracer, &MastForest::default()).unwrap(); let expected = build_expected(&[a as u64, b as u64, c as u64, d as u64]); prop_assert_eq!(expected, processor.stack_top()); } } #[test] -fn test_op_u32assert2_both_invalid() { - // Stack: [invalid1, invalid2] with invalid1 at top - both > u32::MAX +fn test_op_u32assert2_both_invalid_with_err_code() { + // Both values > u32::MAX with a custom err_code: must return U32AssertionFailed + // carrying the err_code AND the offending values (per bobbinth's review). let mut processor = FastProcessor::new( StackInputs::new(&[Felt::new(4294967296u64), Felt::new(4294967297u64)]).unwrap(), ); let mut tracer = NoopTracer; + let err_code = Felt::from_u32(123u32); + + let err = + op_u32assert2(&mut processor, err_code, &mut tracer, &MastForest::default()).unwrap_err(); + assert!( + matches!( + err, + OperationError::U32AssertionFailed { + err_code: c, + ref invalid_values, + .. + } if c == err_code && invalid_values.len() == 2 + ), + "expected U32AssertionFailed with err_code 123 and 2 invalid values, got: {err:?}" + ); +} - let result = op_u32assert2(&mut processor, Felt::from_u32(123u32), &mut tracer); - assert!(result.is_err()); +#[test] +fn test_op_u32assert2_both_invalid_no_err_code() { + // Both values > u32::MAX with err_code=0: must return NotU32Values with both values + let invalid1 = 4294967296u64; // 2^32 + let invalid2 = 4294967297u64; // 2^32 + 1 + let mut processor = + FastProcessor::new(StackInputs::new(&[Felt::new(invalid1), Felt::new(invalid2)]).unwrap()); + let mut tracer = NoopTracer; + + let err = op_u32assert2(&mut processor, ZERO, &mut tracer, &MastForest::default()).unwrap_err(); + assert!( + matches!(err, OperationError::NotU32Values { ref values } if values.len() == 2), + "expected NotU32Values with 2 invalid values" + ); } #[test] fn test_op_u32assert2_second_invalid() { - // Stack: [valid, invalid] with valid at top - second value > u32::MAX + // Stack: [valid, invalid] with valid at top - second value > u32::MAX, no err_code let mut processor = FastProcessor::new( StackInputs::new(&[Felt::new(1000u64), Felt::new(4294967297u64)]).unwrap(), ); let mut tracer = NoopTracer; - let result = op_u32assert2(&mut processor, Felt::from_u32(456u32), &mut tracer); - assert!(result.is_err()); + let err = op_u32assert2(&mut processor, ZERO, &mut tracer, &MastForest::default()).unwrap_err(); + assert!( + matches!(err, OperationError::NotU32Values { .. }), + "expected NotU32Values when err_code is zero" + ); } #[test] fn test_op_u32assert2_first_invalid() { - // Stack: [invalid, valid] with invalid at top - first value > u32::MAX + // Stack: [invalid, valid] with invalid at top - first value > u32::MAX, no err_code let mut processor = FastProcessor::new( StackInputs::new(&[Felt::new(4294967296u64), Felt::new(2000u64)]).unwrap(), ); let mut tracer = NoopTracer; - let result = op_u32assert2(&mut processor, Felt::from_u32(789), &mut tracer); - assert!(result.is_err()); + let err = op_u32assert2(&mut processor, ZERO, &mut tracer, &MastForest::default()).unwrap_err(); + assert!( + matches!(err, OperationError::NotU32Values { .. }), + "expected NotU32Values when err_code is zero" + ); +} + +#[test] +fn test_op_u32assert2_err_code_propagates_on_invalid() { + // err_code and the offending value must appear in U32AssertionFailed + let mut processor = + FastProcessor::new(StackInputs::new(&[Felt::new(4294967296u64), Felt::new(1u64)]).unwrap()); + let mut tracer = NoopTracer; + let err_code = Felt::from_u32(42); + + let err = + op_u32assert2(&mut processor, err_code, &mut tracer, &MastForest::default()).unwrap_err(); + assert!( + matches!( + err, + OperationError::U32AssertionFailed { + err_code: c, + ref invalid_values, + .. + } if c == err_code && invalid_values.len() == 1 + ), + "expected U32AssertionFailed with err_code 42 and 1 invalid value, got: {err:?}" + ); +} + +#[test] +fn test_op_u32assert2_valid_inputs_succeed_with_nonzero_err_code() { + // A non-zero err_code must NOT cause an error when both values are valid u32s + let mut processor = FastProcessor::new( + StackInputs::new(&[Felt::new(1u64), Felt::new(2u64), Felt::new(3u64), Felt::new(4u64)]) + .unwrap(), + ); + let mut tracer = NoopTracer; + + let result = + op_u32assert2(&mut processor, Felt::from_u32(99), &mut tracer, &MastForest::default()); + assert!(result.is_ok(), "valid u32 inputs must succeed regardless of err_code"); +} + +// ASSEMBLED PROGRAM TESTS +// -------------------------------------------------------------------------------------------- +// +// These tests use the full assembler + FastProcessor::execute_sync pipeline to verify that +// error messages stored in the MastForest are correctly resolved and surfaced through the +// execute_op dispatch layer (addresses huitseeker's review request). + +#[test] +fn test_op_u32assert2_assembled_err_msg_lookup() { + // Compile a program whose MastForest stores "value exceeded u32 range" as an error + // string keyed to the err_code emitted by `u32assert2.err=...`. + // Push 2^32 (invalid) and 1 (valid) so the assertion fails on the first element. + let source_manager = Arc::new(DefaultSourceManager::default()); + let program = Assembler::new(source_manager) + .assemble_program( + r#"begin push.4294967296 push.1 u32assert2.err="value exceeded u32 range" end"#, + ) + .expect("program should assemble"); + + let mut host = DefaultHost::default(); + let processor = FastProcessor::new(StackInputs::default()); + let exec_err = processor + .execute_sync(&program, &mut host) + .expect_err("expected u32 assertion failure"); + + // Unwrap the OperationError from the ExecutionError wrapper. + let op_err = match exec_err { + ExecutionError::OperationError { err, .. } => err, + other => panic!("expected OperationError, got {other:?}"), + }; + + // The resolved message must be present, confirming that resolve_error_message + // correctly looks up the string from the assembled MastForest. + match op_err { + OperationError::U32AssertionFailed { err_msg, ref invalid_values, .. } => { + assert_eq!( + err_msg.as_deref(), + Some("value exceeded u32 range"), + "err_msg should be resolved from the MastForest, got {err_msg:?}" + ); + assert!(!invalid_values.is_empty(), "at least one invalid value should be reported"); + }, + other => panic!("expected U32AssertionFailed, got {other:?}"), + } +} + +#[test] +fn test_u32assert_err_wrapper_assembled() { + // `u32assert.err=...` lowers to [Pad, U32assert2(err_code), Drop]. + // Push a value > u32::MAX so the assertion fires; verify the resolved + // error message makes it through the full execute_sync pipeline. + let source_manager = Arc::new(DefaultSourceManager::default()); + let program = Assembler::new(source_manager) + .assemble_program(r#"begin push.4294967296 u32assert.err="value must fit in u32" end"#) + .expect("program should assemble"); + + let mut host = DefaultHost::default(); + let exec_err = FastProcessor::new(StackInputs::default()) + .execute_sync(&program, &mut host) + .expect_err("expected u32 assertion failure"); + + let op_err = match exec_err { + ExecutionError::OperationError { err, .. } => err, + other => panic!("expected OperationError, got {other:?}"), + }; + match op_err { + OperationError::U32AssertionFailed { err_msg, ref invalid_values, .. } => { + assert_eq!( + err_msg.as_deref(), + Some("value must fit in u32"), + "err_msg should be resolved from MastForest, got {err_msg:?}" + ); + assert!(!invalid_values.is_empty(), "at least one invalid value expected"); + }, + other => panic!("expected U32AssertionFailed, got {other:?}"), + } +} + +#[test] +fn test_u32assertw_err_wrapper_assembled() { + // `u32assertw.err=...` lowers to two U32assert2(err_code) ops via `u32assertw`. + // Push a word where the third element exceeds u32::MAX; verify the error message + // is resolved end-to-end through execute_sync. + let source_manager = Arc::new(DefaultSourceManager::default()); + // Stack (top->bottom): 1 2 2^32 4 — element at position 2 is out of range + let program = Assembler::new(source_manager) + .assemble_program( + r#"begin push.4 push.4294967296 push.2 push.1 u32assertw.err="word contains non-u32 element" end"#, + ) + .expect("program should assemble"); + + let mut host = DefaultHost::default(); + let exec_err = FastProcessor::new(StackInputs::default()) + .execute_sync(&program, &mut host) + .expect_err("expected u32 assertion failure"); + + let op_err = match exec_err { + ExecutionError::OperationError { err, .. } => err, + other => panic!("expected OperationError, got {other:?}"), + }; + match op_err { + OperationError::U32AssertionFailed { err_msg, ref invalid_values, .. } => { + assert_eq!( + err_msg.as_deref(), + Some("word contains non-u32 element"), + "err_msg should be resolved from MastForest, got {err_msg:?}" + ); + assert!(!invalid_values.is_empty(), "at least one invalid value expected"); + }, + other => panic!("expected U32AssertionFailed, got {other:?}"), + } } // ARITHMETIC OPERATIONS diff --git a/processor/src/execution/split.rs b/processor/src/execution/split.rs index e65afa977a..dde86a06ff 100644 --- a/processor/src/execution/split.rs +++ b/processor/src/execution/split.rs @@ -2,7 +2,7 @@ use alloc::sync::Arc; use core::ops::ControlFlow; use crate::{ - BreakReason, Host, MapExecErr, ONE, Stopper, ZERO, + BaseHost, BreakReason, MapExecErr, ONE, Stopper, ZERO, continuation_stack::Continuation, execution::{ExecutionState, finalize_clock_cycle, finalize_clock_cycle_with_continuation}, mast::{MastForest, MastNodeId, SplitNode}, @@ -24,7 +24,7 @@ pub(super) fn start_split_node( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { @@ -85,7 +85,7 @@ pub(super) fn finish_split_node( ) -> ControlFlow where P: Processor, - H: Host, + H: BaseHost, S: Stopper, T: Tracer, { diff --git a/processor/src/fast/basic_block/mod.rs b/processor/src/fast/basic_block/mod.rs index 3f334501f9..ea4467d9db 100644 --- a/processor/src/fast/basic_block/mod.rs +++ b/processor/src/fast/basic_block/mod.rs @@ -1,4 +1,4 @@ -use alloc::sync::Arc; +use alloc::{sync::Arc, vec::Vec}; use core::ops::ControlFlow; use miden_core::{ @@ -7,8 +7,10 @@ use miden_core::{ }; use crate::{ - Host, + BaseHost, Host, SyncHost, + advice::AdviceMutation, errors::{MapExecErrWithOpIdx, advice_error_with_context, event_error_with_context}, + event::EventError, fast::{BreakReason, FastProcessor}, }; @@ -17,6 +19,61 @@ pub use sys_event_handlers::SystemEventError; use sys_event_handlers::handle_system_event; impl FastProcessor { + #[inline(always)] + fn handle_system_event( + &mut self, + system_event: SystemEvent, + current_forest: &MastForest, + node_id: MastNodeId, + host: &impl BaseHost, + op_idx: usize, + ) -> ControlFlow { + match handle_system_event(self, system_event).map_exec_err_with_op_idx( + current_forest, + node_id, + host, + op_idx, + ) { + Ok(()) => ControlFlow::Continue(()), + Err(err) => ControlFlow::Break(BreakReason::Err(err)), + } + } + + #[inline(always)] + fn apply_host_event_mutations( + &mut self, + current_forest: &MastForest, + node_id: MastNodeId, + host: &impl BaseHost, + event_id: EventId, + mutations: Result, EventError>, + ) -> ControlFlow { + let mutations = match mutations { + Ok(mutations) => mutations, + Err(err) => { + let event_name = host.resolve_event(event_id).cloned(); + return ControlFlow::Break(BreakReason::Err(event_error_with_context( + err, + current_forest, + node_id, + host, + event_id, + event_name, + ))); + }, + }; + + match self.advice.apply_mutations(mutations) { + Ok(()) => ControlFlow::Continue(()), + Err(err) => ControlFlow::Break(BreakReason::Err(advice_error_with_context( + err, + current_forest, + node_id, + host, + ))), + } + } + /// Executes any decorator in a basic block that is to be executed after all operations in the /// block. This only differs from [`Self::execute_after_exit_decorators`] in that these /// decorators are stored in the basic block node itself. @@ -26,7 +83,7 @@ impl FastProcessor { basic_block_node: &BasicBlockNode, node_id: MastNodeId, current_forest: &Arc, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow { if self.should_execute_decorators() { #[cfg(test)] @@ -41,6 +98,26 @@ impl FastProcessor { ControlFlow::Continue(()) } + #[inline(always)] + pub(super) fn op_emit_sync( + &mut self, + host: &mut impl SyncHost, + current_forest: &MastForest, + node_id: MastNodeId, + op_idx: usize, + ) -> ControlFlow { + let event_id = EventId::from_felt(self.stack_get(0)); + + // If it's a system event, handle it directly. Otherwise, forward it to the host. + if let Some(system_event) = SystemEvent::from_event_id(event_id) { + return self.handle_system_event(system_event, current_forest, node_id, host, op_idx); + } + + let processor_state = self.state(); + let mutations = host.on_event(&processor_state); + self.apply_host_event_mutations(current_forest, node_id, host, event_id, mutations) + } + #[inline(always)] pub(super) async fn op_emit( &mut self, @@ -51,41 +128,12 @@ impl FastProcessor { ) -> ControlFlow { let event_id = EventId::from_felt(self.stack_get(0)); - // If it's a system event, handle it directly. Otherwise, forward it to the host. if let Some(system_event) = SystemEvent::from_event_id(event_id) { - if let Err(err) = handle_system_event(self, system_event).map_exec_err_with_op_idx( - current_forest, - node_id, - host, - op_idx, - ) { - return ControlFlow::Break(BreakReason::Err(err)); - } - } else { - let processor_state = self.state(); - let mutations = match host.on_event(&processor_state).await { - Ok(m) => m, - Err(err) => { - let event_name = host.resolve_event(event_id).cloned(); - return ControlFlow::Break(BreakReason::Err(event_error_with_context( - err, - current_forest, - node_id, - host, - event_id, - event_name, - ))); - }, - }; - if let Err(err) = self.advice.apply_mutations(mutations) { - return ControlFlow::Break(BreakReason::Err(advice_error_with_context( - err, - current_forest, - node_id, - host, - ))); - } + return self.handle_system_event(system_event, current_forest, node_id, host, op_idx); } - ControlFlow::Continue(()) + + let processor_state = self.state(); + let mutations = host.on_event(&processor_state).await; + self.apply_host_event_mutations(current_forest, node_id, host, event_id, mutations) } } diff --git a/processor/src/fast/execution_api.rs b/processor/src/fast/execution_api.rs new file mode 100644 index 0000000000..e6687acaae --- /dev/null +++ b/processor/src/fast/execution_api.rs @@ -0,0 +1,614 @@ +use alloc::{sync::Arc, vec::Vec}; +use core::ops::ControlFlow; + +use miden_core::{ + Word, + mast::{MastForest, MastNodeId}, + program::{Kernel, MIN_STACK_DEPTH, Program, StackOutputs}, +}; +use tracing::instrument; + +use super::{ + FastProcessor, NoopTracer, + external::maybe_use_caller_error_context, + step::{BreakReason, NeverStopper, ResumeContext, StepStopper}, +}; +use crate::{ + ExecutionError, ExecutionOutput, Host, Stopper, SyncHost, TraceBuildInputs, + continuation_stack::ContinuationStack, + errors::{MapExecErr, MapExecErrNoCtx, OperationError}, + execution::{ + InternalBreakReason, execute_impl, finish_emit_op_execution, + finish_load_mast_forest_from_dyn_start, finish_load_mast_forest_from_external, + }, + trace::execution_tracer::ExecutionTracer, + tracer::Tracer, +}; + +impl FastProcessor { + // EXECUTE + // ------------------------------------------------------------------------------------------- + + /// Executes the given program synchronously and returns the execution output. + pub fn execute_sync( + self, + program: &Program, + host: &mut impl SyncHost, + ) -> Result { + self.execute_with_tracer_sync(program, host, &mut NoopTracer) + } + + /// Async variant of [`Self::execute_sync`] for hosts that need async callbacks. + #[inline(always)] + pub async fn execute( + self, + program: &Program, + host: &mut impl Host, + ) -> Result { + self.execute_with_tracer(program, host, &mut NoopTracer).await + } + + /// Executes the given program synchronously and returns the bundled trace inputs required by + /// [`crate::trace::build_trace`]. + /// + /// # Example + /// ``` + /// use miden_assembly::Assembler; + /// use miden_processor::{DefaultHost, FastProcessor, StackInputs}; + /// + /// let program = Assembler::default().assemble_program("begin push.1 drop end").unwrap(); + /// let mut host = DefaultHost::default(); + /// + /// let trace_inputs = FastProcessor::new(StackInputs::default()) + /// .execute_trace_inputs_sync(&program, &mut host) + /// .unwrap(); + /// let trace = miden_processor::trace::build_trace(trace_inputs).unwrap(); + /// + /// assert_eq!(*trace.program_hash(), program.hash()); + /// ``` + #[instrument(name = "execute_trace_inputs_sync", skip_all)] + pub fn execute_trace_inputs_sync( + self, + program: &Program, + host: &mut impl SyncHost, + ) -> Result { + let mut tracer = ExecutionTracer::new(self.options.core_trace_fragment_size()); + let execution_output = self.execute_with_tracer_sync(program, host, &mut tracer)?; + Ok(Self::trace_build_inputs_from_parts(program, execution_output, tracer)) + } + + /// Async variant of [`Self::execute_trace_inputs_sync`] for async hosts. + #[inline(always)] + #[instrument(name = "execute_trace_inputs", skip_all)] + pub async fn execute_trace_inputs( + self, + program: &Program, + host: &mut impl Host, + ) -> Result { + let mut tracer = ExecutionTracer::new(self.options.core_trace_fragment_size()); + let execution_output = self.execute_with_tracer(program, host, &mut tracer).await?; + Ok(Self::trace_build_inputs_from_parts(program, execution_output, tracer)) + } + + /// Executes the given program with the provided tracer using an async host. + pub async fn execute_with_tracer( + mut self, + program: &Program, + host: &mut impl Host, + tracer: &mut T, + ) -> Result + where + T: Tracer, + { + let mut continuation_stack = ContinuationStack::new(program); + let mut current_forest = program.mast_forest().clone(); + + self.advice.extend_map(current_forest.advice_map()).map_exec_err_no_ctx()?; + let flow = self + .execute_impl_async( + &mut continuation_stack, + &mut current_forest, + program.kernel(), + host, + tracer, + &NeverStopper, + ) + .await; + Self::execution_result_from_flow(flow, self) + } + + /// Executes the given program with the provided tracer using a sync host. + pub fn execute_with_tracer_sync( + mut self, + program: &Program, + host: &mut impl SyncHost, + tracer: &mut T, + ) -> Result + where + T: Tracer, + { + let mut continuation_stack = ContinuationStack::new(program); + let mut current_forest = program.mast_forest().clone(); + + self.advice.extend_map(current_forest.advice_map()).map_exec_err_no_ctx()?; + let flow = self.execute_impl( + &mut continuation_stack, + &mut current_forest, + program.kernel(), + host, + tracer, + &NeverStopper, + ); + Self::execution_result_from_flow(flow, self) + } + + /// Executes a single clock cycle synchronously. + pub fn step_sync( + &mut self, + host: &mut impl SyncHost, + resume_ctx: ResumeContext, + ) -> Result, ExecutionError> { + let ResumeContext { + mut current_forest, + mut continuation_stack, + kernel, + } = resume_ctx; + + let flow = self.execute_impl( + &mut continuation_stack, + &mut current_forest, + &kernel, + host, + &mut NoopTracer, + &StepStopper, + ); + Self::resume_context_from_flow(flow, continuation_stack, current_forest, kernel) + } + + /// Async variant of [`Self::step_sync`]. + #[inline(always)] + pub async fn step( + &mut self, + host: &mut impl Host, + resume_ctx: ResumeContext, + ) -> Result, ExecutionError> { + let ResumeContext { + mut current_forest, + mut continuation_stack, + kernel, + } = resume_ctx; + + let flow = self + .execute_impl_async( + &mut continuation_stack, + &mut current_forest, + &kernel, + host, + &mut NoopTracer, + &StepStopper, + ) + .await; + Self::resume_context_from_flow(flow, continuation_stack, current_forest, kernel) + } + + /// Pairs execution output with the trace inputs captured by the tracer. + #[inline(always)] + fn trace_build_inputs_from_parts( + program: &Program, + execution_output: ExecutionOutput, + tracer: ExecutionTracer, + ) -> TraceBuildInputs { + TraceBuildInputs::from_execution( + program, + execution_output, + tracer.into_trace_generation_context(), + ) + } + + /// Converts a step-wise execution result into the next resume context, if execution stopped. + #[inline(always)] + fn resume_context_from_flow( + flow: ControlFlow, + mut continuation_stack: ContinuationStack, + current_forest: Arc, + kernel: Kernel, + ) -> Result, ExecutionError> { + match flow { + ControlFlow::Continue(_) => Ok(None), + ControlFlow::Break(break_reason) => match break_reason { + BreakReason::Err(err) => Err(err), + BreakReason::Stopped(maybe_continuation) => { + if let Some(continuation) = maybe_continuation { + continuation_stack.push_continuation(continuation); + } + + Ok(Some(ResumeContext { + current_forest, + continuation_stack, + kernel, + })) + }, + }, + } + } + + /// Materializes the current stack as public outputs without consuming the processor. + #[inline(always)] + fn current_stack_outputs(&self) -> StackOutputs { + StackOutputs::new( + &self.stack[self.stack_bot_idx..self.stack_top_idx] + .iter() + .rev() + .copied() + .collect::>(), + ) + .unwrap() + } + + /// Executes the given program with the provided tracer and returns the stack outputs. + /// + /// This function takes a `&mut self` (compared to `self` for the public sync execution + /// methods) so that the processor state may be accessed after execution. Reusing the same + /// processor for a second program is incorrect. This is mainly meant to be used in tests. + fn execute_impl( + &mut self, + continuation_stack: &mut ContinuationStack, + current_forest: &mut Arc, + kernel: &Kernel, + host: &mut impl SyncHost, + tracer: &mut T, + stopper: &S, + ) -> ControlFlow + where + S: Stopper, + T: Tracer, + { + while let ControlFlow::Break(internal_break_reason) = + execute_impl(self, continuation_stack, current_forest, kernel, host, tracer, stopper) + { + match internal_break_reason { + InternalBreakReason::User(break_reason) => return ControlFlow::Break(break_reason), + InternalBreakReason::Emit { + basic_block_node_id, + op_idx, + continuation, + } => { + self.op_emit_sync(host, current_forest, basic_block_node_id, op_idx)?; + + finish_emit_op_execution( + continuation, + self, + continuation_stack, + current_forest, + tracer, + stopper, + )?; + }, + InternalBreakReason::LoadMastForestFromDyn { dyn_node_id, callee_hash } => { + let (root_id, new_forest) = match self.load_mast_forest_sync( + callee_hash, + host, + current_forest, + dyn_node_id, + ) { + Ok(result) => result, + Err(err) => return ControlFlow::Break(BreakReason::Err(err)), + }; + + finish_load_mast_forest_from_dyn_start( + root_id, + new_forest, + self, + current_forest, + continuation_stack, + tracer, + stopper, + )?; + }, + InternalBreakReason::LoadMastForestFromExternal { + external_node_id, + procedure_hash, + } => { + let (root_id, new_forest) = match self.load_mast_forest_sync( + procedure_hash, + host, + current_forest, + external_node_id, + ) { + Ok(result) => result, + Err(err) => { + let maybe_enriched_err = maybe_use_caller_error_context( + err, + current_forest, + continuation_stack, + host, + ); + + return ControlFlow::Break(BreakReason::Err(maybe_enriched_err)); + }, + }; + + finish_load_mast_forest_from_external( + root_id, + new_forest, + external_node_id, + current_forest, + continuation_stack, + host, + tracer, + )?; + }, + } + } + + match StackOutputs::new( + &self.stack[self.stack_bot_idx..self.stack_top_idx] + .iter() + .rev() + .copied() + .collect::>(), + ) { + Ok(stack_outputs) => ControlFlow::Continue(stack_outputs), + Err(_) => ControlFlow::Break(BreakReason::Err(ExecutionError::OutputStackOverflow( + self.stack_top_idx - self.stack_bot_idx - MIN_STACK_DEPTH, + ))), + } + } + + async fn execute_impl_async( + &mut self, + continuation_stack: &mut ContinuationStack, + current_forest: &mut Arc, + kernel: &Kernel, + host: &mut impl Host, + tracer: &mut T, + stopper: &S, + ) -> ControlFlow + where + S: Stopper, + T: Tracer, + { + while let ControlFlow::Break(internal_break_reason) = + execute_impl(self, continuation_stack, current_forest, kernel, host, tracer, stopper) + { + match internal_break_reason { + InternalBreakReason::User(break_reason) => return ControlFlow::Break(break_reason), + InternalBreakReason::Emit { + basic_block_node_id, + op_idx, + continuation, + } => { + self.op_emit(host, current_forest, basic_block_node_id, op_idx).await?; + + finish_emit_op_execution( + continuation, + self, + continuation_stack, + current_forest, + tracer, + stopper, + )?; + }, + InternalBreakReason::LoadMastForestFromDyn { dyn_node_id, callee_hash } => { + let (root_id, new_forest) = match self + .load_mast_forest(callee_hash, host, current_forest, dyn_node_id) + .await + { + Ok(result) => result, + Err(err) => return ControlFlow::Break(BreakReason::Err(err)), + }; + + finish_load_mast_forest_from_dyn_start( + root_id, + new_forest, + self, + current_forest, + continuation_stack, + tracer, + stopper, + )?; + }, + InternalBreakReason::LoadMastForestFromExternal { + external_node_id, + procedure_hash, + } => { + let (root_id, new_forest) = match self + .load_mast_forest(procedure_hash, host, current_forest, external_node_id) + .await + { + Ok(result) => result, + Err(err) => { + let maybe_enriched_err = maybe_use_caller_error_context( + err, + current_forest, + continuation_stack, + host, + ); + + return ControlFlow::Break(BreakReason::Err(maybe_enriched_err)); + }, + }; + + finish_load_mast_forest_from_external( + root_id, + new_forest, + external_node_id, + current_forest, + continuation_stack, + host, + tracer, + )?; + }, + } + } + + match StackOutputs::new( + &self.stack[self.stack_bot_idx..self.stack_top_idx] + .iter() + .rev() + .copied() + .collect::>(), + ) { + Ok(stack_outputs) => ControlFlow::Continue(stack_outputs), + Err(_) => ControlFlow::Break(BreakReason::Err(ExecutionError::OutputStackOverflow( + self.stack_top_idx - self.stack_bot_idx - MIN_STACK_DEPTH, + ))), + } + } + + // HELPERS + // ------------------------------------------------------------------------------------------ + + fn load_mast_forest_sync( + &mut self, + node_digest: Word, + host: &mut impl SyncHost, + current_forest: &MastForest, + node_id: MastNodeId, + ) -> Result<(MastNodeId, Arc), ExecutionError> { + let mast_forest = host.get_mast_forest(&node_digest).ok_or_else(|| { + crate::errors::procedure_not_found_with_context( + node_digest, + current_forest, + node_id, + host, + ) + })?; + + let root_id = mast_forest.find_procedure_root(node_digest).ok_or_else(|| { + Err::<(), _>(OperationError::MalformedMastForestInHost { root_digest: node_digest }) + .map_exec_err(current_forest, node_id, host) + .unwrap_err() + })?; + + self.advice.extend_map(mast_forest.advice_map()).map_exec_err( + current_forest, + node_id, + host, + )?; + + Ok((root_id, mast_forest)) + } + + async fn load_mast_forest( + &mut self, + node_digest: Word, + host: &mut impl Host, + current_forest: &MastForest, + node_id: MastNodeId, + ) -> Result<(MastNodeId, Arc), ExecutionError> { + let mast_forest = if let Some(mast_forest) = host.get_mast_forest(&node_digest).await { + mast_forest + } else { + return Err(crate::errors::procedure_not_found_with_context( + node_digest, + current_forest, + node_id, + host, + )); + }; + + let root_id = mast_forest.find_procedure_root(node_digest).ok_or_else(|| { + Err::<(), _>(OperationError::MalformedMastForestInHost { root_digest: node_digest }) + .map_exec_err(current_forest, node_id, host) + .unwrap_err() + })?; + + self.advice.extend_map(mast_forest.advice_map()).map_exec_err( + current_forest, + node_id, + host, + )?; + + Ok((root_id, mast_forest)) + } + + /// Executes the given program synchronously one step at a time. + pub fn execute_by_step_sync( + mut self, + program: &Program, + host: &mut impl SyncHost, + ) -> Result { + let mut current_resume_ctx = self.get_initial_resume_context(program).unwrap(); + + loop { + match self.step_sync(host, current_resume_ctx)? { + Some(next_resume_ctx) => { + current_resume_ctx = next_resume_ctx; + }, + None => break Ok(self.current_stack_outputs()), + } + } + } + + /// Async variant of [`Self::execute_by_step_sync`]. + #[inline(always)] + pub async fn execute_by_step( + mut self, + program: &Program, + host: &mut impl Host, + ) -> Result { + let mut current_resume_ctx = self.get_initial_resume_context(program).unwrap(); + let mut processor = self; + + loop { + match processor.step(host, current_resume_ctx).await? { + Some(next_resume_ctx) => { + current_resume_ctx = next_resume_ctx; + }, + None => break Ok(processor.current_stack_outputs()), + } + } + } + + /// Similar to [`Self::execute_sync`], but allows mutable access to the processor. + /// + /// This is mainly meant to be used in tests. + #[cfg(any(test, feature = "testing"))] + pub fn execute_mut_sync( + &mut self, + program: &Program, + host: &mut impl SyncHost, + ) -> Result { + let mut continuation_stack = ContinuationStack::new(program); + let mut current_forest = program.mast_forest().clone(); + + self.advice.extend_map(current_forest.advice_map()).map_exec_err_no_ctx()?; + + let flow = self.execute_impl( + &mut continuation_stack, + &mut current_forest, + program.kernel(), + host, + &mut NoopTracer, + &NeverStopper, + ); + Self::stack_result_from_flow(flow) + } + + /// Async variant of [`Self::execute_mut_sync`]. + #[cfg(any(test, feature = "testing"))] + #[inline(always)] + pub async fn execute_mut( + &mut self, + program: &Program, + host: &mut impl Host, + ) -> Result { + let mut continuation_stack = ContinuationStack::new(program); + let mut current_forest = program.mast_forest().clone(); + + self.advice.extend_map(current_forest.advice_map()).map_exec_err_no_ctx()?; + + let flow = self + .execute_impl_async( + &mut continuation_stack, + &mut current_forest, + program.kernel(), + host, + &mut NoopTracer, + &NeverStopper, + ) + .await; + Self::stack_result_from_flow(flow) + } +} diff --git a/processor/src/fast/external.rs b/processor/src/fast/external.rs index 7324a71f4c..5f07482c8f 100644 --- a/processor/src/fast/external.rs +++ b/processor/src/fast/external.rs @@ -1,7 +1,7 @@ use miden_core::mast::MastForest; use crate::{ - ExecutionError, Host, + BaseHost, ExecutionError, continuation_stack::{Continuation, ContinuationStack}, errors::{OperationError, procedure_not_found_with_context}, }; @@ -35,7 +35,7 @@ pub(super) fn maybe_use_caller_error_context( original_err: ExecutionError, current_forest: &MastForest, continuation_stack: &ContinuationStack, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ExecutionError { // We only care about procedure-not-found errors or malformed MAST forest errors. let root_digest = match &original_err { diff --git a/processor/src/fast/mod.rs b/processor/src/fast/mod.rs index e86db5584c..0f9556ea3f 100644 --- a/processor/src/fast/mod.rs +++ b/processor/src/fast/mod.rs @@ -11,36 +11,29 @@ use miden_core::{ mast::{MastForest, MastNodeExt, MastNodeId}, operations::Decorator, precompile::PrecompileTranscript, - program::{Kernel, MIN_STACK_DEPTH, Program, StackInputs, StackOutputs}, + program::{MIN_STACK_DEPTH, Program, StackInputs, StackOutputs}, utils::range, }; -use tracing::instrument; use crate::{ - AdviceInputs, AdviceProvider, ContextId, ExecutionError, ExecutionOptions, Host, - ProcessorState, Stopper, + AdviceInputs, AdviceProvider, BaseHost, ContextId, ExecutionError, ExecutionOptions, + ProcessorState, continuation_stack::{Continuation, ContinuationStack}, - errors::{MapExecErr, MapExecErrNoCtx, OperationError}, - execution::{ - InternalBreakReason, execute_impl, finish_emit_op_execution, - finish_load_mast_forest_from_dyn_start, finish_load_mast_forest_from_external, - }, - trace::execution_tracer::{ExecutionTracer, TraceGenerationContext}, + errors::MapExecErrNoCtx, tracer::{OperationHelperRegisters, Tracer}, }; mod basic_block; mod call_and_dyn; +mod execution_api; mod external; mod memory; mod operation; mod step; pub use basic_block::SystemEventError; -use external::maybe_use_caller_error_context; pub use memory::Memory; pub use step::{BreakReason, ResumeContext}; -use step::{NeverStopper, StepStopper}; #[cfg(test)] mod tests; @@ -144,6 +137,53 @@ pub struct FastProcessor { } impl FastProcessor { + /// Packages the processor state after successful execution into a public result type. + #[inline(always)] + fn into_execution_output(self, stack: StackOutputs) -> ExecutionOutput { + ExecutionOutput { + stack, + advice: self.advice, + memory: self.memory, + final_precompile_transcript: self.pc_transcript, + } + } + + /// Converts the terminal result of a full execution run into [`ExecutionOutput`]. + #[inline(always)] + fn execution_result_from_flow( + flow: ControlFlow, + processor: Self, + ) -> Result { + match flow { + ControlFlow::Continue(stack_outputs) => { + Ok(processor.into_execution_output(stack_outputs)) + }, + ControlFlow::Break(break_reason) => match break_reason { + BreakReason::Err(err) => Err(err), + BreakReason::Stopped(_) => { + unreachable!("Execution never stops prematurely with NeverStopper") + }, + }, + } + } + + /// Converts a testing-only execution result into stack outputs. + #[cfg(any(test, feature = "testing"))] + #[inline(always)] + fn stack_result_from_flow( + flow: ControlFlow, + ) -> Result { + match flow { + ControlFlow::Continue(stack_outputs) => Ok(stack_outputs), + ControlFlow::Break(break_reason) => match break_reason { + BreakReason::Err(err) => Err(err), + BreakReason::Stopped(_) => { + unreachable!("Execution never stops prematurely with NeverStopper") + }, + }, + } + } + // CONSTRUCTORS // ---------------------------------------------------------------------------------------------- @@ -235,7 +275,7 @@ impl FastProcessor { } } - /// Returns the resume context to be used with the first call to `step()`. + /// Returns the resume context to be used with the first call to `step_sync()`. pub fn get_initial_resume_context( &mut self, program: &Program, @@ -454,231 +494,6 @@ impl FastProcessor { self.stack_write(idx2, a); } - // EXECUTE - // ------------------------------------------------------------------------------------------- - - /// Executes the given program and returns the stack outputs as well as the advice provider. - pub async fn execute( - self, - program: &Program, - host: &mut impl Host, - ) -> Result { - self.execute_with_tracer(program, host, &mut NoopTracer).await - } - - /// Executes the given program and returns the stack outputs, the advice provider, and - /// context necessary to build the trace. - #[instrument(name = "execute_for_trace", skip_all)] - pub async fn execute_for_trace( - self, - program: &Program, - host: &mut impl Host, - ) -> Result<(ExecutionOutput, TraceGenerationContext), ExecutionError> { - let mut tracer = ExecutionTracer::new(self.options.core_trace_fragment_size()); - let execution_output = self.execute_with_tracer(program, host, &mut tracer).await?; - - let context = tracer.into_trace_generation_context(); - - Ok((execution_output, context)) - } - - /// Executes the given program with the provided tracer and returns the stack outputs, and the - /// advice provider. - pub async fn execute_with_tracer( - mut self, - program: &Program, - host: &mut impl Host, - tracer: &mut T, - ) -> Result - where - T: Tracer, - { - let mut continuation_stack = ContinuationStack::new(program); - let mut current_forest = program.mast_forest().clone(); - - // Merge the program's advice map into the advice provider - self.advice.extend_map(current_forest.advice_map()).map_exec_err_no_ctx()?; - - match self - .execute_impl( - &mut continuation_stack, - &mut current_forest, - program.kernel(), - host, - tracer, - &NeverStopper, - ) - .await - { - ControlFlow::Continue(stack_outputs) => Ok(ExecutionOutput { - stack: stack_outputs, - advice: self.advice, - memory: self.memory, - final_pc_transcript: self.pc_transcript, - }), - ControlFlow::Break(break_reason) => match break_reason { - BreakReason::Err(err) => Err(err), - BreakReason::Stopped(_) => { - unreachable!("Execution never stops prematurely with NeverStopper") - }, - }, - } - } - - /// Executes a single clock cycle - pub async fn step( - &mut self, - host: &mut impl Host, - resume_ctx: ResumeContext, - ) -> Result, ExecutionError> { - let ResumeContext { - mut current_forest, - mut continuation_stack, - kernel, - } = resume_ctx; - - match self - .execute_impl( - &mut continuation_stack, - &mut current_forest, - &kernel, - host, - &mut NoopTracer, - &StepStopper, - ) - .await - { - ControlFlow::Continue(_) => Ok(None), - ControlFlow::Break(break_reason) => match break_reason { - BreakReason::Err(err) => Err(err), - BreakReason::Stopped(maybe_continuation) => { - if let Some(continuation) = maybe_continuation { - continuation_stack.push_continuation(continuation); - } - - Ok(Some(ResumeContext { - current_forest, - continuation_stack, - kernel, - })) - }, - }, - } - } - - /// Executes the given program with the provided tracer and returns the stack outputs. - /// - /// This function takes a `&mut self` (compared to `self` for the public execute functions) so - /// that the processor state may be accessed after execution. It is incorrect to execute a - /// second program using the same processor. This is mainly meant to be used in tests. - async fn execute_impl( - &mut self, - continuation_stack: &mut ContinuationStack, - current_forest: &mut Arc, - kernel: &Kernel, - host: &mut impl Host, - tracer: &mut T, - stopper: &S, - ) -> ControlFlow - where - S: Stopper, - T: Tracer, - { - while let ControlFlow::Break(internal_break_reason) = - execute_impl(self, continuation_stack, current_forest, kernel, host, tracer, stopper) - { - match internal_break_reason { - InternalBreakReason::User(break_reason) => return ControlFlow::Break(break_reason), - InternalBreakReason::Emit { - basic_block_node_id, - op_idx, - continuation, - } => { - self.op_emit(host, current_forest, basic_block_node_id, op_idx).await?; - - // Call `finish_emit_op_execution()`, as per the sans-IO contract. - finish_emit_op_execution( - continuation, - self, - continuation_stack, - current_forest, - tracer, - stopper, - )?; - }, - InternalBreakReason::LoadMastForestFromDyn { dyn_node_id, callee_hash } => { - // load mast forest asynchronously - let (root_id, new_forest) = match self - .load_mast_forest(callee_hash, host, current_forest, dyn_node_id) - .await - { - Ok(result) => result, - Err(err) => return ControlFlow::Break(BreakReason::Err(err)), - }; - - // Finish loading the MAST forest from the Dyn node, as per the sans-IO - // contract. - finish_load_mast_forest_from_dyn_start( - root_id, - new_forest, - self, - current_forest, - continuation_stack, - tracer, - stopper, - )?; - }, - InternalBreakReason::LoadMastForestFromExternal { - external_node_id, - procedure_hash, - } => { - // load mast forest asynchronously - let (root_id, new_forest) = match self - .load_mast_forest(procedure_hash, host, current_forest, external_node_id) - .await - { - Ok(result) => result, - Err(err) => { - let maybe_enriched_err = maybe_use_caller_error_context( - err, - current_forest, - continuation_stack, - host, - ); - - return ControlFlow::Break(BreakReason::Err(maybe_enriched_err)); - }, - }; - - // Finish loading the MAST forest from the External node, as per the sans-IO - // contract. - finish_load_mast_forest_from_external( - root_id, - new_forest, - external_node_id, - current_forest, - continuation_stack, - host, - tracer, - )?; - }, - } - } - - match StackOutputs::new( - &self.stack[self.stack_bot_idx..self.stack_top_idx] - .iter() - .rev() - .copied() - .collect::>(), - ) { - Ok(stack_outputs) => ControlFlow::Continue(stack_outputs), - Err(_) => ControlFlow::Break(BreakReason::Err(ExecutionError::OutputStackOverflow( - self.stack_top_idx - self.stack_bot_idx - MIN_STACK_DEPTH, - ))), - } - } - // DECORATOR EXECUTORS // -------------------------------------------------------------------------------------------- @@ -687,7 +502,7 @@ impl FastProcessor { &self, node_id: MastNodeId, current_forest: &MastForest, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow { if !self.should_execute_decorators() { return ControlFlow::Continue(()); @@ -712,7 +527,7 @@ impl FastProcessor { &self, node_id: MastNodeId, current_forest: &MastForest, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow { if !self.in_debug_mode() { return ControlFlow::Continue(()); @@ -736,7 +551,7 @@ impl FastProcessor { fn execute_decorator( &self, decorator: &Decorator, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow { match decorator { Decorator::Debug(options) => { @@ -764,47 +579,6 @@ impl FastProcessor { ControlFlow::Continue(()) } - // HELPERS - // ---------------------------------------------------------------------------------------------- - - async fn load_mast_forest( - &mut self, - node_digest: Word, - host: &mut impl Host, - current_forest: &MastForest, - node_id: MastNodeId, - ) -> Result<(MastNodeId, Arc), ExecutionError> { - let mast_forest = host.get_mast_forest(&node_digest).await.ok_or_else(|| { - crate::errors::procedure_not_found_with_context( - node_digest, - current_forest, - node_id, - host, - ) - })?; - - // We limit the parts of the program that can be called externally to procedure - // roots, even though MAST doesn't have that restriction. - let root_id = mast_forest.find_procedure_root(node_digest).ok_or_else(|| { - Err::<(), _>(OperationError::MalformedMastForestInHost { root_digest: node_digest }) - .map_exec_err(current_forest, node_id, host) - .unwrap_err() - })?; - - // Merge the advice map of this forest into the advice provider. - // Note that the map may be merged multiple times if a different procedure from the same - // forest is called. - // For now, only compiled libraries contain non-empty advice maps, so for most cases, - // this call will be cheap. - self.advice.extend_map(mast_forest.advice_map()).map_exec_err( - current_forest, - node_id, - host, - )?; - - Ok((root_id, mast_forest)) - } - /// Increments the stack top pointer by 1. /// /// The bottom of the stack is never affected by this operation. @@ -854,186 +628,6 @@ impl FastProcessor { self.stack_bot_idx = new_stack_bot_idx; self.stack_top_idx = new_stack_top_idx; } - - // SYNC WRAPPERS - // ---------------------------------------------------------------------------------------------- - - /// Convenience sync wrapper to [Self::step]. - pub fn step_sync( - &mut self, - host: &mut impl Host, - resume_ctx: ResumeContext, - ) -> Result, ExecutionError> { - // Create a new Tokio runtime and block on the async execution - let rt = tokio::runtime::Builder::new_current_thread().build().unwrap(); - - let execution_output = rt.block_on(self.step(host, resume_ctx))?; - - Ok(execution_output) - } - - /// Executes the given program step by step (calling [`Self::step`] repeatedly) and returns the - /// stack outputs. - pub fn execute_by_step_sync( - mut self, - program: &Program, - host: &mut impl Host, - ) -> Result { - // Create a new Tokio runtime and block on the async execution - let rt = tokio::runtime::Builder::new_current_thread().build().unwrap(); - let mut current_resume_ctx = self.get_initial_resume_context(program).unwrap(); - - rt.block_on(async { - loop { - match self.step(host, current_resume_ctx).await { - Ok(maybe_resume_ctx) => match maybe_resume_ctx { - Some(next_resume_ctx) => { - current_resume_ctx = next_resume_ctx; - }, - None => { - // End of program was reached - break Ok(StackOutputs::new( - &self.stack[self.stack_bot_idx..self.stack_top_idx] - .iter() - .rev() - .copied() - .collect::>(), - ) - .unwrap()); - }, - }, - Err(err) => { - break Err(err); - }, - } - } - }) - } - - /// Convenience sync wrapper to [Self::execute]. - /// - /// This method is only available on non-wasm32 targets. On wasm32, use the - /// async `execute()` method directly since wasm32 runs in the browser's event loop. - /// - /// # Panics - /// Panics if called from within an existing Tokio runtime. Use the async `execute()` - /// method instead in async contexts. - #[cfg(not(target_family = "wasm"))] - pub fn execute_sync( - self, - program: &Program, - host: &mut impl Host, - ) -> Result { - match tokio::runtime::Handle::try_current() { - Ok(_handle) => { - // We're already inside a Tokio runtime - this is not supported - // because we cannot safely create a nested runtime or move the - // non-Send host reference to another thread - panic!( - "Cannot call execute_sync from within a Tokio runtime. \ - Use the async execute() method instead." - ) - }, - Err(_) => { - // No runtime exists - create one and use it - let rt = tokio::runtime::Builder::new_current_thread().build().unwrap(); - rt.block_on(self.execute(program, host)) - }, - } - } - - /// Convenience sync wrapper to [Self::execute_for_trace]. - /// - /// This method is only available on non-wasm32 targets. On wasm32, use the - /// async `execute_for_trace()` method directly since wasm32 runs in the browser's event loop. - /// - /// # Panics - /// Panics if called from within an existing Tokio runtime. Use the async `execute_for_trace()` - /// method instead in async contexts. - #[cfg(not(target_family = "wasm"))] - #[instrument(name = "execute_for_trace_sync", skip_all)] - pub fn execute_for_trace_sync( - self, - program: &Program, - host: &mut impl Host, - ) -> Result<(ExecutionOutput, TraceGenerationContext), ExecutionError> { - match tokio::runtime::Handle::try_current() { - Ok(_handle) => { - // We're already inside a Tokio runtime - this is not supported - // because we cannot safely create a nested runtime or move the - // non-Send host reference to another thread - panic!( - "Cannot call execute_for_trace_sync from within a Tokio runtime. \ - Use the async execute_for_trace() method instead." - ) - }, - Err(_) => { - // No runtime exists - create one and use it - let rt = tokio::runtime::Builder::new_current_thread().build().unwrap(); - rt.block_on(self.execute_for_trace(program, host)) - }, - } - } - - /// Similar to [Self::execute_sync], but allows mutable access to the processor. - /// - /// This method is only available on non-wasm32 targets for testing. On wasm32, use - /// async execution methods directly since wasm32 runs in the browser's event loop. - /// - /// # Panics - /// Panics if called from within an existing Tokio runtime. Use async execution - /// methods instead in async contexts. - #[cfg(all(any(test, feature = "testing"), not(target_family = "wasm")))] - pub fn execute_sync_mut( - &mut self, - program: &Program, - host: &mut impl Host, - ) -> Result { - let mut continuation_stack = ContinuationStack::new(program); - let mut current_forest = program.mast_forest().clone(); - - // Merge the program's advice map into the advice provider - self.advice.extend_map(current_forest.advice_map()).map_exec_err_no_ctx()?; - - let execute_fut = async { - match self - .execute_impl( - &mut continuation_stack, - &mut current_forest, - program.kernel(), - host, - &mut NoopTracer, - &NeverStopper, - ) - .await - { - ControlFlow::Continue(stack_outputs) => Ok(stack_outputs), - ControlFlow::Break(break_reason) => match break_reason { - BreakReason::Err(err) => Err(err), - BreakReason::Stopped(_) => { - unreachable!("Execution never stops prematurely with NeverStopper") - }, - }, - } - }; - - match tokio::runtime::Handle::try_current() { - Ok(_handle) => { - // We're already inside a Tokio runtime - this is not supported - // because we cannot safely create a nested runtime or move the - // non-Send host reference to another thread - panic!( - "Cannot call execute_sync_mut from within a Tokio runtime. \ - Use async execution methods instead." - ) - }, - Err(_) => { - // No runtime exists - create one and use it - let rt = tokio::runtime::Builder::new_current_thread().build().unwrap(); - rt.block_on(execute_fut) - }, - } - } } // EXECUTION OUTPUT @@ -1046,7 +640,7 @@ pub struct ExecutionOutput { pub stack: StackOutputs, pub advice: AdviceProvider, pub memory: Memory, - pub final_pc_transcript: PrecompileTranscript, + pub final_precompile_transcript: PrecompileTranscript, } // EXECUTION CONTEXT INFO diff --git a/processor/src/fast/operation.rs b/processor/src/fast/operation.rs index c2d9ba0f9f..3e08f1b742 100644 --- a/processor/src/fast/operation.rs +++ b/processor/src/fast/operation.rs @@ -14,7 +14,7 @@ use miden_core::{ use super::step::BreakReason; use crate::{ - AdviceProvider, ContextId, ExecutionError, Host, + AdviceProvider, BaseHost, ContextId, ExecutionError, errors::OperationError, fast::{FastProcessor, STACK_BUFFER_SIZE, memory::Memory}, processor::{HasherInterface, Processor, StackInterface, SystemInterface}, @@ -92,7 +92,7 @@ impl Processor for FastProcessor { &self, node_id: MastNodeId, current_forest: &MastForest, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow { self.execute_before_enter_decorators(node_id, current_forest, host) } @@ -102,7 +102,7 @@ impl Processor for FastProcessor { &self, node_id: MastNodeId, current_forest: &MastForest, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow { self.execute_after_exit_decorators(node_id, current_forest, host) } @@ -113,7 +113,7 @@ impl Processor for FastProcessor { node_id: MastNodeId, op_idx_in_block: usize, current_forest: &MastForest, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow { if self.should_execute_decorators() { #[cfg(test)] @@ -133,7 +133,7 @@ impl Processor for FastProcessor { basic_block_node: &BasicBlockNode, node_id: MastNodeId, current_forest: &Arc, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow { self.execute_end_of_block_decorators(basic_block_node, node_id, current_forest, host) } diff --git a/processor/src/fast/tests/memory.rs b/processor/src/fast/tests/memory.rs index 707d623e3b..b34f44f156 100644 --- a/processor/src/fast/tests/memory.rs +++ b/processor/src/fast/tests/memory.rs @@ -51,7 +51,7 @@ fn test_mloadw_success() { processor.memory.write_word(ctx, addr, dummy_clk, word_at_addr.into()).unwrap(); let program = simple_program_with_ops(vec![Operation::MLoadW]); - let stack_outputs = processor.execute_sync_mut(&program, &mut host).unwrap(); + let stack_outputs = processor.execute_mut_sync(&program, &mut host).unwrap(); // Memory word[i] maps to stack position i (word[0] at top) assert_eq!( @@ -66,7 +66,7 @@ fn test_mloadw_success() { processor.memory.write_word(ctx, addr, dummy_clk, word_at_addr.into()).unwrap(); let program = simple_program_with_ops(vec![Operation::MLoadW]); - let stack_outputs = processor.execute_sync_mut(&program, &mut host).unwrap(); + let stack_outputs = processor.execute_mut_sync(&program, &mut host).unwrap(); assert_eq!(stack_outputs.get_num_elements(16), &vec![ZERO; 16]); } @@ -94,7 +94,7 @@ fn test_mstorew_success() { .unwrap(), ); let program = simple_program_with_ops(vec![Operation::MStoreW]); - processor.execute_sync_mut(&program, &mut host).unwrap(); + processor.execute_mut_sync(&program, &mut host).unwrap(); // Ensure that the memory was correctly modified assert_eq!(processor.memory.read_word(ctx, addr, clk).unwrap(), word_to_store); @@ -115,7 +115,7 @@ fn test_mstore_success(#[case] addr: u32, #[case] value_to_store: u32) { let mut processor = FastProcessor::new(StackInputs::new(&[Felt::from_u32(addr), value_to_store]).unwrap()); let program = simple_program_with_ops(vec![Operation::MStore]); - processor.execute_sync_mut(&program, &mut host).unwrap(); + processor.execute_mut_sync(&program, &mut host).unwrap(); // Ensure that the memory was correctly modified let word_addr = addr - (addr % WORD_SIZE as u32); @@ -144,7 +144,7 @@ fn test_mload_success(#[case] addr_to_access: u32) { .unwrap(); let program = simple_program_with_ops(vec![Operation::MLoad]); - let stack_outputs = processor.execute_sync_mut(&program, &mut host).unwrap(); + let stack_outputs = processor.execute_mut_sync(&program, &mut host).unwrap(); // Ensure that Operation::MLoad correctly reads the value on the stack assert_eq!( @@ -180,7 +180,7 @@ fn test_mstream() { .unwrap(); let program = simple_program_with_ops(vec![Operation::MStream]); - let stack_outputs = processor.execute_sync_mut(&program, &mut host).unwrap(); + let stack_outputs = processor.execute_mut_sync(&program, &mut host).unwrap(); // Word at addr 40 goes to positions 0-3, word at addr 44 goes to positions 4-7 // word[0] at lowest position (top of stack) diff --git a/processor/src/fast/tests/mod.rs b/processor/src/fast/tests/mod.rs index b3bd3e8ec2..6cce8f8fa6 100644 --- a/processor/src/fast/tests/mod.rs +++ b/processor/src/fast/tests/mod.rs @@ -357,10 +357,11 @@ fn test_frie2f4() { // --- build stack inputs --------------------------------------------- // FastProcessor::new expects inputs in natural order: first element goes to top. // After Push(42), the stack layout becomes: - // [v0, v1, v2, v3, v4, v5, v6, v7, f_pos, d_seg, poe, pe1, pe0, a1, a0, cptr, ...] - // ^0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + // [v0, v1, v2, v3, v4, v5, v6, v7, f_pos, p, poe, pe0, pe1, a0, a1, cptr, ...] + // ^0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // - // With d_seg=2, query_values[2] = (v4, v5) must equal prev_value = (pe0, pe1). + // p is the bit-reversed tree index; the instruction computes d_seg = p & 3. + // With p=38 (d_seg=2, f_pos=9), query_values[2] = (v4, v5) must equal prev_value = (pe0, pe1). let previous_value: [Felt; 2] = [Felt::from_u32(10), Felt::from_u32(11)]; let stack_inputs = StackInputs::new(&[ Felt::from_u32(16), // pos 0 -> pos 1 (v1) after push @@ -371,12 +372,12 @@ fn test_frie2f4() { Felt::from_u32(11), // pos 5 -> pos 6 (v6) after push Felt::from_u32(10), // pos 6 -> pos 7 (v7) after push Felt::from_u32(9), // pos 7 -> pos 8 (f_pos) after push - Felt::from_u32(2), // pos 8 -> pos 9 (d_seg=2) after push + Felt::from_u32(38), // pos 8 -> pos 9 (p=4*9+2=38, d_seg=2) after push Felt::from_u32(7), // pos 9 -> pos 10 (poe) after push - previous_value[1], // pos 10 -> pos 11 (pe1) after push - previous_value[0], // pos 11 -> pos 12 (pe0) after push - Felt::from_u32(3), // pos 12 -> pos 13 (a1) after push - Felt::from_u32(2), // pos 13 -> pos 14 (a0) after push + previous_value[0], // pos 10 -> pos 11 (pe0) after push + previous_value[1], // pos 11 -> pos 12 (pe1) after push + Felt::from_u32(2), // pos 12 -> pos 13 (a0) after push + Felt::from_u32(3), // pos 13 -> pos 14 (a1) after push Felt::from_u32(1), // pos 14 -> pos 15 (cptr) after push Felt::from_u32(0), // pos 15 -> overflow after push ]) @@ -472,7 +473,7 @@ fn test_call_node_preserves_stack_overflow_table() { ); // Execute the program - let result = processor.execute_sync_mut(&program, &mut host).unwrap(); + let result = processor.execute_mut_sync(&program, &mut host).unwrap(); assert_eq!( result.get_num_elements(16), diff --git a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_12_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_12_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap index 3f0e973429..cf5c234054 100644 --- a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_12_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap +++ b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_12_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap @@ -17,7 +17,7 @@ Err( }, source_file: None, err: FriError( - "domain segment value cannot exceed 3, but was 10", + "degree-respecting projection is inconsistent at d_seg=2 poe=11 fpos=2: expected 0 but was 5 + 6 X; all values: [0]=1 + 2 X [1]=3 + 4 X [2]=5 + 6 X [3]=7 + 8 X", ), }, ) diff --git a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_13_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_13_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap index 3f0e973429..198ad8de80 100644 --- a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_13_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap +++ b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_13_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap @@ -17,7 +17,7 @@ Err( }, source_file: None, err: FriError( - "domain segment value cannot exceed 3, but was 10", + "degree-respecting projection is inconsistent at d_seg=2 poe=11 fpos=2: expected 12 but was 5 + 6 X; all values: [0]=1 + 2 X [1]=3 + 4 X [2]=5 + 6 X [3]=7 + 8 X", ), }, ) diff --git a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_14_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_14_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap index 3f0e973429..59cc8fbb58 100644 --- a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_14_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap +++ b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_14_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap @@ -17,7 +17,7 @@ Err( }, source_file: None, err: FriError( - "domain segment value cannot exceed 3, but was 10", + "degree-respecting projection is inconsistent at d_seg=2 poe=11 fpos=2: expected 12 + 13 X but was 5 + 6 X; all values: [0]=1 + 2 X [1]=3 + 4 X [2]=5 + 6 X [3]=7 + 8 X", ), }, ) diff --git a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_15_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_15_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap index 3f0e973429..59cc8fbb58 100644 --- a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_15_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap +++ b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_15_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap @@ -17,7 +17,7 @@ Err( }, source_file: None, err: FriError( - "domain segment value cannot exceed 3, but was 10", + "degree-respecting projection is inconsistent at d_seg=2 poe=11 fpos=2: expected 12 + 13 X but was 5 + 6 X; all values: [0]=1 + 2 X [1]=3 + 4 X [2]=5 + 6 X [3]=7 + 8 X", ), }, ) diff --git a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_16_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_16_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap index 3f0e973429..59cc8fbb58 100644 --- a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_16_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap +++ b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_16_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap @@ -17,7 +17,7 @@ Err( }, source_file: None, err: FriError( - "domain segment value cannot exceed 3, but was 10", + "degree-respecting projection is inconsistent at d_seg=2 poe=11 fpos=2: expected 12 + 13 X but was 5 + 6 X; all values: [0]=1 + 2 X [1]=3 + 4 X [2]=5 + 6 X [3]=7 + 8 X", ), }, ) diff --git a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_17_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_17_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap index 3f0e973429..59cc8fbb58 100644 --- a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_17_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap +++ b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__all_ops__fast__tests__all_ops__test_basic_block__stack_inputs_17_vec__Felt__from_u32_1__Felt__from_u32_2__Felt__from_u32_3__Felt___operations_66_vec__Operation__FriE2F4_.snap @@ -17,7 +17,7 @@ Err( }, source_file: None, err: FriError( - "domain segment value cannot exceed 3, but was 10", + "degree-respecting projection is inconsistent at d_seg=2 poe=11 fpos=2: expected 12 + 13 X but was 5 + 6 X; all values: [0]=1 + 2 X [1]=3 + 4 X [2]=5 + 6 X [3]=7 + 8 X", ), }, ) diff --git a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__frie2f4.snap b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__frie2f4.snap index 6cfb2abbb5..d08d2c19a5 100644 --- a/processor/src/fast/tests/snapshots/miden_processor__fast__tests__frie2f4.snap +++ b/processor/src/fast/tests/snapshots/miden_processor__fast__tests__frie2f4.snap @@ -1,24 +1,25 @@ --- source: processor/src/fast/tests/mod.rs +assertion_line: 393 expression: stack_outputs --- StackOutputs { elements: [ - 17129119493027828304, - 17129119493027828312, - 7906149565430122801, - 10542846303798146793, - 0, + 6590052996059796070, + 10542705566309791467, + 15811494916641072287, + 7905747458320536148, 0, 1, 0, + 0, 49, - 18446744069414584320, + 18446462594437873665, 9, 2401, 9, - 15112046832839714565, - 3656396054197128425, + 14492051010740125224, + 6668243544126892022, 0, ], } diff --git a/processor/src/host/advice/mod.rs b/processor/src/host/advice/mod.rs index 217039a063..66e1983196 100644 --- a/processor/src/host/advice/mod.rs +++ b/processor/src/host/advice/mod.rs @@ -9,6 +9,8 @@ use miden_core::{ crypto::merkle::{InnerNodeInfo, MerklePath, MerkleStore, NodeIndex}, precompile::PrecompileRequest, }; +#[cfg(test)] +use miden_core::{crypto::hash::Blake3_256, serde::Serializable}; mod errors; pub use errors::AdviceError; @@ -46,7 +48,7 @@ const MAX_ADVICE_STACK_SIZE: usize = 1 << 17; /// or, /// - used to produce a STARK proof using a precompile VM, which can be verified in the epilog of /// the program. -#[derive(Debug, Clone, Default)] +#[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct AdviceProvider { stack: VecDeque, map: AdviceMap, @@ -56,6 +58,7 @@ pub struct AdviceProvider { impl AdviceProvider { #[cfg(test)] + #[expect(dead_code)] pub(crate) fn merkle_store(&self) -> &MerkleStore { &self.store } @@ -86,6 +89,44 @@ impl AdviceProvider { Ok(()) } + /// Returns a stable fingerprint of the advice state. + /// + /// The fingerprint is insensitive to advice-map insertion order and Merkle-store insertion + /// order, but it still reflects advice-stack order and precompile-request order. + #[cfg(test)] + #[must_use] + pub(crate) fn fingerprint(&self) -> [u8; 32] { + let stack = self.stack.iter().copied().collect::>().to_bytes(); + let map = self.map.to_bytes(); + let mut store_nodes = self + .store + .inner_nodes() + .map(|info| (info.value, info.left, info.right)) + .collect::>(); + store_nodes.sort_unstable_by(|lhs, rhs| { + lhs.0 + .cmp(&rhs.0) + .then_with(|| lhs.1.cmp(&rhs.1)) + .then_with(|| lhs.2.cmp(&rhs.2)) + }); + let store = store_nodes + .into_iter() + .flat_map(|(value, left, right)| [value, left, right]) + .collect::>() + .to_bytes(); + let precompile_requests = self.pc_requests.to_bytes(); + Blake3_256::hash_iter( + [ + stack.as_slice(), + map.as_slice(), + store.as_slice(), + precompile_requests.as_slice(), + ] + .into_iter(), + ) + .into() + } + // ADVICE STACK // -------------------------------------------------------------------------------------------- @@ -509,3 +550,40 @@ impl AdviceProviderInterface for AdviceProvider { self.update_merkle_node(root, depth, index, value).map(|(path, _)| Some(path)) } } + +#[cfg(test)] +mod tests { + use super::AdviceProvider; + use crate::{ + AdviceInputs, Felt, Word, + crypto::merkle::{MerkleStore, MerkleTree}, + }; + + fn make_leaf(seed: u64) -> Word { + [Felt::new(seed), Felt::new(seed + 1), Felt::new(seed + 2), Felt::new(seed + 3)].into() + } + + #[test] + fn fingerprint_is_stable_across_merkle_store_insertion_order() { + let tree_a = + MerkleTree::new([make_leaf(1), make_leaf(5), make_leaf(9), make_leaf(13)]).unwrap(); + let tree_b = + MerkleTree::new([make_leaf(17), make_leaf(21), make_leaf(25), make_leaf(29)]).unwrap(); + + let mut store_a = MerkleStore::default(); + store_a.extend(tree_a.inner_nodes()); + store_a.extend(tree_b.inner_nodes()); + + let mut store_b = MerkleStore::default(); + store_b.extend(tree_b.inner_nodes()); + store_b.extend(tree_a.inner_nodes()); + + assert_eq!(store_a, store_b); + + let provider_a = AdviceProvider::from(AdviceInputs::default().with_merkle_store(store_a)); + let provider_b = AdviceProvider::from(AdviceInputs::default().with_merkle_store(store_b)); + + assert_eq!(provider_a, provider_b); + assert_eq!(provider_a.fingerprint(), provider_b.fingerprint()); + } +} diff --git a/processor/src/host/default.rs b/processor/src/host/default.rs index e0f9b919d8..5ff9103922 100644 --- a/processor/src/host/default.rs +++ b/processor/src/host/default.rs @@ -9,19 +9,18 @@ use miden_core::{ use miden_debug_types::{DefaultSourceManager, Location, SourceFile, SourceManager, SourceSpan}; use super::{ - FutureMaybeSend, debug::DefaultDebugHandler, handlers::{EventError, EventHandler, EventHandlerRegistry}, }; use crate::{ - DebugError, DebugHandler, ExecutionError, Host, MastForestStore, MemMastForestStore, - ProcessorState, TraceError, advice::AdviceMutation, + BaseHost, DebugError, DebugHandler, ExecutionError, MastForestStore, MemMastForestStore, + ProcessorState, SyncHost, TraceError, advice::AdviceMutation, }; // DEFAULT HOST IMPLEMENTATION // ================================================================================================ -/// A default Host implementation that provides the essential functionality required by the VM. +/// A default SyncHost implementation that provides the essential functionality required by the VM. #[derive(Debug)] pub struct DefaultHost< D: DebugHandler = DefaultDebugHandler, @@ -125,7 +124,7 @@ where } } -impl Host for DefaultHost +impl BaseHost for DefaultHost where D: DebugHandler, S: SourceManager, @@ -139,34 +138,6 @@ where (span, maybe_file) } - fn get_mast_forest(&self, node_digest: &Word) -> impl FutureMaybeSend>> { - let result = self.store.get(node_digest); - async move { result } - } - - fn on_event( - &mut self, - process: &ProcessorState<'_>, - ) -> impl FutureMaybeSend, EventError>> { - let event_id = EventId::from_felt(process.get_stack_item(0)); - let result = match self.event_handlers.handle_event(event_id, process) { - Ok(Some(mutations)) => { - // the event was handled by the registered event handlers; just return - Ok(mutations) - }, - Ok(None) => { - // EventError is a `Box` so we can define the error anonymously. - #[derive(Debug, thiserror::Error)] - #[error("no event handler registered")] - struct UnhandledEvent; - - Err(UnhandledEvent.into()) - }, - Err(e) => Err(e), - }; - async move { result } - } - fn on_debug( &mut self, process: &ProcessorState, @@ -184,13 +155,41 @@ where } } +impl SyncHost for DefaultHost +where + D: DebugHandler, + S: SourceManager, +{ + fn get_mast_forest(&self, node_digest: &Word) -> Option> { + self.store.get(node_digest) + } + + fn on_event( + &mut self, + process: &ProcessorState<'_>, + ) -> Result, EventError> { + let event_id = EventId::from_felt(process.get_stack_item(0)); + match self.event_handlers.handle_event(event_id, process) { + Ok(Some(mutations)) => Ok(mutations), + Ok(None) => { + #[derive(Debug, thiserror::Error)] + #[error("no event handler registered")] + struct UnhandledEvent; + + Err(UnhandledEvent.into()) + }, + Err(e) => Err(e), + } + } +} + // NOOPHOST // ================================================================================================ -/// A Host which does nothing. +/// A SyncHost which does nothing. pub struct NoopHost; -impl Host for NoopHost { +impl BaseHost for NoopHost { #[inline(always)] fn get_label_and_source_file( &self, @@ -198,21 +197,20 @@ impl Host for NoopHost { ) -> (SourceSpan, Option>) { (SourceSpan::UNKNOWN, None) } +} +impl SyncHost for NoopHost { #[inline(always)] - fn get_mast_forest( - &self, - _node_digest: &Word, - ) -> impl FutureMaybeSend>> { - async { None } + fn get_mast_forest(&self, _node_digest: &Word) -> Option> { + None } #[inline(always)] fn on_event( &mut self, _process: &ProcessorState<'_>, - ) -> impl FutureMaybeSend, EventError>> { - async { Ok(Vec::new()) } + ) -> Result, EventError> { + Ok(Vec::new()) } } diff --git a/processor/src/host/mod.rs b/processor/src/host/mod.rs index ec5b952213..53a1590b72 100644 --- a/processor/src/host/mod.rs +++ b/processor/src/host/mod.rs @@ -58,13 +58,13 @@ impl AdviceMutation { // HOST TRAIT // ================================================================================================ -/// Defines an interface by which the VM can interact with the host. +/// Defines the host functionality shared by both sync and async execution. /// /// There are three main categories of interactions between the VM and the host: /// 1. getting a library's MAST forest, /// 2. handling VM events (which can mutate the process' advice provider), and /// 3. handling debug and trace events. -pub trait Host { +pub trait BaseHost { // REQUIRED METHODS // -------------------------------------------------------------------------------------------- @@ -74,30 +74,6 @@ pub trait Host { location: &Location, ) -> (SourceSpan, Option>); - // Note: we don't use the `async` keyword in get_mast_forest and on_event, since we need to - // specify the `+ Send` bound to the returned Future, and `async` doesn't allow us to do that. - - /// Returns MAST forest corresponding to the specified digest, or None if the MAST forest for - /// this digest could not be found in this host. - fn get_mast_forest(&self, node_digest: &Word) -> impl FutureMaybeSend>>; - - /// Handles the event emitted from the VM and provides advice mutations to be applied to - /// the advice provider. - /// - /// The event ID is available at the top of the stack (position 0) when this handler is called. - /// This allows the handler to access both the event ID and any additional context data that - /// may have been pushed onto the stack prior to the emit operation. - /// - /// ## Implementation notes - /// - Extract the event ID via `EventId::from_felt(process.get_stack_item(0))` - /// - Return errors without event names or IDs - the caller will enrich them via - /// [`Host::resolve_event()`] - /// - System events (IDs 0-255) are handled by the VM before calling this method - fn on_event( - &mut self, - process: &ProcessorState<'_>, - ) -> impl FutureMaybeSend, EventError>>; - // PROVIDED METHODS // -------------------------------------------------------------------------------------------- @@ -126,12 +102,80 @@ pub trait Host { } } +/// Defines a synchronous interface by which the VM can interact with the host during execution. +pub trait SyncHost: BaseHost { + /// Returns MAST forest corresponding to the specified digest, or None if the MAST forest for + /// this digest could not be found in this host. + fn get_mast_forest(&self, node_digest: &Word) -> Option>; + + /// Handles the event emitted from the VM and provides advice mutations to be applied to + /// the advice provider. + /// + /// The event ID is available at the top of the stack (position 0) when this handler is called. + /// This allows the handler to access both the event ID and any additional context data that + /// may have been pushed onto the stack prior to the emit operation. + /// + /// ## Implementation notes + /// - Extract the event ID via `EventId::from_felt(process.get_stack_item(0))` + /// - Return errors without event names or IDs - the caller will enrich them via + /// [`BaseHost::resolve_event()`] + /// - System events (IDs 0-255) are handled by the VM before calling this method + fn on_event(&mut self, process: &ProcessorState<'_>) + -> Result, EventError>; +} + +/// Defines an async interface by which the VM can interact with the host during execution. +/// +/// This mirrors the historic async host surface while allowing the sync-first core to depend on +/// [`BaseHost`]. +pub trait Host: BaseHost { + // REQUIRED METHODS + // -------------------------------------------------------------------------------------------- + + /// Returns MAST forest corresponding to the specified digest, or None if the MAST forest for + /// this digest could not be found in this host. + fn get_mast_forest(&self, node_digest: &Word) -> impl FutureMaybeSend>>; + + /// Handles the event emitted from the VM and provides advice mutations to be applied to + /// the advice provider. + /// + /// The event ID is available at the top of the stack (position 0) when this handler is called. + /// This allows the handler to access both the event ID and any additional context data that + /// may have been pushed onto the stack prior to the emit operation. + /// + /// ## Implementation notes + /// - Extract the event ID via `EventId::from_felt(process.get_stack_item(0))` + /// - Return errors without event names or IDs - the caller will enrich them via + /// [`BaseHost::resolve_event()`] + /// - System events (IDs 0-255) are handled by the VM before calling this method + fn on_event( + &mut self, + process: &ProcessorState<'_>, + ) -> impl FutureMaybeSend, EventError>>; +} + +impl Host for T +where + T: SyncHost, +{ + fn get_mast_forest(&self, node_digest: &Word) -> impl FutureMaybeSend>> { + let result = SyncHost::get_mast_forest(self, node_digest); + async move { result } + } + + fn on_event( + &mut self, + process: &ProcessorState<'_>, + ) -> impl FutureMaybeSend, EventError>> { + let result = SyncHost::on_event(self, process); + async move { result } + } +} + /// Alias for a `Future` /// /// Unless the compilation target family is `wasm`, we add `Send` to the required bounds. For /// `wasm` compilation targets there is no `Send` bound. -/// -/// We also provide a blank implementation of this trait for all features. #[cfg(target_family = "wasm")] pub trait FutureMaybeSend: Future {} @@ -142,8 +186,6 @@ impl FutureMaybeSend for T where T: Future {} /// /// Unless the compilation target family is `wasm`, we add `Send` to the required bounds. For /// `wasm` compilation targets there is no `Send` bound. -/// -/// We also provide a blank implementation of this trait for all features. #[cfg(not(target_family = "wasm"))] pub trait FutureMaybeSend: Future + Send {} diff --git a/processor/src/lib.rs b/processor/src/lib.rs index dc4b8ecfa8..60e5914bdf 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -1,4 +1,7 @@ #![no_std] +// Trace tests intentionally use index-based `for i in a..b` over column slices; clippy's iterator +// suggestion is noisier than helpful there. +#![cfg_attr(test, allow(clippy::needless_range_loop))] #[macro_use] extern crate alloc; @@ -27,7 +30,7 @@ use crate::{ continuation_stack::ContinuationStack, errors::MapExecErr, processor::{Processor, SystemInterface}, - trace::{ExecutionTrace, RowIndex}, + trace::RowIndex, }; #[cfg(any(test, feature = "testing"))] @@ -46,7 +49,7 @@ pub use errors::{AceError, ExecutionError, HostError, MemoryError}; pub use execution_options::{ExecutionOptions, ExecutionOptionsError}; pub use fast::{BreakReason, ExecutionOutput, FastProcessor, ResumeContext}; pub use host::{ - FutureMaybeSend, Host, MastForestStore, MemMastForestStore, + BaseHost, FutureMaybeSend, Host, MastForestStore, MemMastForestStore, SyncHost, debug::DefaultDebugHandler, default::{DefaultHost, HostLibrary}, handlers::{DebugError, DebugHandler, TraceError}, @@ -58,6 +61,7 @@ pub use miden_core::{ }, serde, utils, }; +pub use trace::{TraceBuildInputs, TraceGenerationContext}; pub mod advice { pub use miden_core::advice::{AdviceInputs, AdviceMap, AdviceStackBuilder}; @@ -87,10 +91,8 @@ pub mod trace; // EXECUTORS // ================================================================================================ -/// Returns an execution trace resulting from executing the provided program against the provided -/// inputs. -/// -/// This is an async function that works on all platforms including wasm32. +/// Executes the provided program against the provided inputs and returns the resulting execution +/// output. /// /// The `host` parameter is used to provide the external environment to the program being executed, /// such as access to the advice provider and libraries that the program depends on. @@ -104,15 +106,9 @@ pub async fn execute( advice_inputs: AdviceInputs, host: &mut impl Host, options: ExecutionOptions, -) -> Result { +) -> Result { let processor = FastProcessor::new_with_options(stack_inputs, advice_inputs, options); - let (execution_output, trace_generation_context) = - processor.execute_for_trace(program, host).await?; - - let trace = trace::build_trace(execution_output, trace_generation_context, program.to_info())?; - - assert_eq!(&program.hash(), trace.program_hash(), "inconsistent program hash"); - Ok(trace) + processor.execute(program, host).await } /// Synchronous wrapper for the async `execute()` function. @@ -129,24 +125,11 @@ pub fn execute_sync( program: &Program, stack_inputs: StackInputs, advice_inputs: AdviceInputs, - host: &mut impl Host, + host: &mut impl SyncHost, options: ExecutionOptions, -) -> Result { - match tokio::runtime::Handle::try_current() { - Ok(_handle) => { - // We're already inside a Tokio runtime - this is not supported because we cannot - // safely create a nested runtime or move the non-Send host reference to another thread - panic!( - "Cannot call execute_sync from within a Tokio runtime. \ - Use the async execute() method instead." - ) - }, - Err(_) => { - // No runtime exists - create one and use it - let rt = tokio::runtime::Builder::new_current_thread().build().unwrap(); - rt.block_on(execute(program, stack_inputs, advice_inputs, host, options)) - }, - } +) -> Result { + let processor = FastProcessor::new_with_options(stack_inputs, advice_inputs, options); + processor.execute_sync(program, host) } // PROCESSOR STATE diff --git a/processor/src/processor.rs b/processor/src/processor.rs index 7000575687..9202eeaad5 100644 --- a/processor/src/processor.rs +++ b/processor/src/processor.rs @@ -4,7 +4,7 @@ use core::ops::ControlFlow; use miden_air::trace::{RowIndex, chiplets::hasher::HasherState}; use crate::{ - BreakReason, ContextId, ExecutionError, Felt, Host, MemoryError, Word, + BaseHost, BreakReason, ContextId, ExecutionError, Felt, MemoryError, Word, advice::AdviceError, crypto::merkle::MerklePath, errors::OperationError, @@ -71,7 +71,7 @@ pub(crate) trait Processor: Sized { &self, node_id: MastNodeId, current_forest: &MastForest, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow; /// Executes the decorators that should be executed after exiting a node. @@ -79,7 +79,7 @@ pub(crate) trait Processor: Sized { &self, node_id: MastNodeId, current_forest: &MastForest, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow; /// Executes any decorator in a basic block that is to be executed before the operation at the @@ -89,7 +89,7 @@ pub(crate) trait Processor: Sized { node_id: MastNodeId, op_idx_in_block: usize, current_forest: &MastForest, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow; /// Executes any decorator in a basic block that is to be executed after all operations in the @@ -100,7 +100,7 @@ pub(crate) trait Processor: Sized { basic_block_node: &BasicBlockNode, node_id: MastNodeId, current_forest: &Arc, - host: &mut impl Host, + host: &mut impl BaseHost, ) -> ControlFlow; } diff --git a/processor/src/test_utils/test_host.rs b/processor/src/test_utils/test_host.rs index adab8586af..2cf2a28e5d 100644 --- a/processor/src/test_utils/test_host.rs +++ b/processor/src/test_utils/test_host.rs @@ -11,8 +11,8 @@ use miden_debug_types::{ }; use crate::{ - DebugError, DebugHandler, FutureMaybeSend, Host, MastForestStore, MemMastForestStore, - ProcessorState, TraceError, Word, advice::AdviceMutation, event::EventError, mast::MastForest, + BaseHost, DebugError, DebugHandler, MastForestStore, MemMastForestStore, ProcessorState, + SyncHost, TraceError, Word, advice::AdviceMutation, event::EventError, mast::MastForest, }; /// A snapshot of the processor state for consistency checking between processors. @@ -152,7 +152,7 @@ impl Default for TestHost { } } -impl Host for TestHost +impl BaseHost for TestHost where S: SourceManagerSync, { @@ -165,20 +165,6 @@ where (span, maybe_file) } - fn get_mast_forest(&self, node_digest: &Word) -> impl FutureMaybeSend>> { - let result = self.store.get(node_digest); - async move { result } - } - - fn on_event( - &mut self, - process: &ProcessorState, - ) -> impl FutureMaybeSend, EventError>> { - let event_id: u32 = process.get_stack_item(0).as_canonical_u64().try_into().unwrap(); - self.event_handler.push(event_id); - async move { Ok(Vec::new()) } - } - fn on_debug( &mut self, _process: &ProcessorState, @@ -199,3 +185,18 @@ where Ok(()) } } + +impl SyncHost for TestHost +where + S: SourceManagerSync, +{ + fn get_mast_forest(&self, node_digest: &Word) -> Option> { + self.store.get(node_digest) + } + + fn on_event(&mut self, process: &ProcessorState) -> Result, EventError> { + let event_id: u32 = process.get_stack_item(0).as_canonical_u64().try_into().unwrap(); + self.event_handler.push(event_id); + Ok(Vec::new()) + } +} diff --git a/processor/src/trace/chiplets/ace/mod.rs b/processor/src/trace/chiplets/ace/mod.rs index a41cf12237..70537ebd88 100644 --- a/processor/src/trace/chiplets/ace/mod.rs +++ b/processor/src/trace/chiplets/ace/mod.rs @@ -1,6 +1,8 @@ use alloc::{collections::BTreeMap, vec::Vec}; -use miden_air::trace::{Challenges, MainTrace, RowIndex, chiplets::ace::ACE_CHIPLET_NUM_COLS}; +use miden_air::trace::{ + Challenges, MainTrace, RowIndex, bus_types::ACE_WIRING_BUS, chiplets::ace::ACE_CHIPLET_NUM_COLS, +}; use miden_core::{Felt, ZERO, field::ExtensionField}; use crate::trace::TraceFragment; @@ -147,7 +149,10 @@ impl AceHints { ctx: u32, wire: [Felt; 3], ) -> E { - challenges.encode([Felt::from_u32(clk), Felt::from_u32(ctx), wire[0], wire[1], wire[2]]) + challenges.encode( + ACE_WIRING_BUS, + [Felt::from_u32(clk), Felt::from_u32(ctx), wire[0], wire[1], wire[2]], + ) } pub(crate) fn build_divisors>( diff --git a/processor/src/trace/chiplets/ace/tests/mod.rs b/processor/src/trace/chiplets/ace/tests/mod.rs index b3353bbf55..109104ef11 100644 --- a/processor/src/trace/chiplets/ace/tests/mod.rs +++ b/processor/src/trace/chiplets/ace/tests/mod.rs @@ -269,7 +269,6 @@ fn generate_memory(circuit: &EncodedCircuit, inputs: &[QuadFelt]) -> Vec { } /// Given an EvaluationContext -#[expect(clippy::needless_range_loop)] fn verify_trace(context: &CircuitEvaluation, num_read_rows: usize, num_eval_rows: usize) { let num_rows = num_read_rows + num_eval_rows; let mut columns: Vec<_> = (0..ACE_CHIPLET_NUM_COLS).map(|_| vec![ZERO; num_rows]).collect(); diff --git a/processor/src/trace/chiplets/aux_trace/bus/ace.rs b/processor/src/trace/chiplets/aux_trace/bus/ace.rs index 69244fb693..c1fffd8ffe 100644 --- a/processor/src/trace/chiplets/aux_trace/bus/ace.rs +++ b/processor/src/trace/chiplets/aux_trace/bus/ace.rs @@ -1,6 +1,8 @@ use core::fmt::{Display, Formatter, Result as FmtResult}; -use miden_air::trace::{Challenges, MainTrace, RowIndex, chiplets::ace::ACE_INIT_LABEL}; +use miden_air::trace::{ + Challenges, MainTrace, RowIndex, bus_types::CHIPLETS_BUS, chiplets::ace::ACE_INIT_LABEL, +}; use miden_core::{Felt, ONE, field::ExtensionField}; use crate::debug::{BusDebugger, BusMessage}; @@ -100,14 +102,17 @@ where E: ExtensionField, { fn value(&self, challenges: &Challenges) -> E { - challenges.encode([ - self.op_label, - self.clk, - self.ctx, - self.ptr, - self.num_read_rows, - self.num_eval_rows, - ]) + challenges.encode( + CHIPLETS_BUS, + [ + self.op_label, + self.clk, + self.ctx, + self.ptr, + self.num_read_rows, + self.num_eval_rows, + ], + ) } fn source(&self) -> &str { diff --git a/processor/src/trace/chiplets/aux_trace/bus/bitwise.rs b/processor/src/trace/chiplets/aux_trace/bus/bitwise.rs index 628fba3361..de9783b282 100644 --- a/processor/src/trace/chiplets/aux_trace/bus/bitwise.rs +++ b/processor/src/trace/chiplets/aux_trace/bus/bitwise.rs @@ -1,7 +1,8 @@ use core::fmt::{Display, Formatter, Result as FmtResult}; use miden_air::trace::{ - Challenges, MainTrace, RowIndex, chiplets::bitwise::OP_CYCLE_LEN as BITWISE_OP_CYCLE_LEN, + Challenges, MainTrace, RowIndex, bus_types::CHIPLETS_BUS, + chiplets::bitwise::OP_CYCLE_LEN as BITWISE_OP_CYCLE_LEN, }; use miden_core::{Felt, ONE, ZERO, field::ExtensionField}; @@ -86,7 +87,7 @@ where E: ExtensionField, { fn value(&self, challenges: &Challenges) -> E { - challenges.encode([self.op_label, self.a, self.b, self.z]) + challenges.encode(CHIPLETS_BUS, [self.op_label, self.a, self.b, self.z]) } fn source(&self) -> &str { diff --git a/processor/src/trace/chiplets/aux_trace/bus/hasher.rs b/processor/src/trace/chiplets/aux_trace/bus/hasher.rs index 80d659824b..4d83e92216 100644 --- a/processor/src/trace/chiplets/aux_trace/bus/hasher.rs +++ b/processor/src/trace/chiplets/aux_trace/bus/hasher.rs @@ -2,12 +2,12 @@ use core::fmt::{Display, Formatter, Result as FmtResult}; use miden_air::trace::{ Challenges, MainTrace, RowIndex, bus_message, + bus_types::CHIPLETS_BUS, chiplets::{ hasher, hasher::{ - HASH_CYCLE_LEN, HASH_CYCLE_LEN_FELT, LAST_CYCLE_ROW, LAST_CYCLE_ROW_FELT, - LINEAR_HASH_LABEL, MP_VERIFY_LABEL, MR_UPDATE_NEW_LABEL, MR_UPDATE_OLD_LABEL, - RETURN_HASH_LABEL, RETURN_STATE_LABEL, + CONTROLLER_ROWS_PER_PERM_FELT, LINEAR_HASH_LABEL, MP_VERIFY_LABEL, MR_UPDATE_NEW_LABEL, + MR_UPDATE_OLD_LABEL, RETURN_HASH_LABEL, RETURN_STATE_LABEL, }, }, log_precompile::{ @@ -28,15 +28,16 @@ use crate::{ // // All hasher chiplet bus messages use a common encoding structure: // -// challenges.alpha = alpha (randomness base, accessed directly) +// challenges.bus_prefix[CHIPLETS_BUS] = alpha + 1*gamma (domain-separated base for this bus) // challenges.beta_powers[0] = beta^0 (label: transition type) // challenges.beta_powers[1] = beta^1 (addr: hasher chiplet address) // challenges.beta_powers[2] = beta^2 (node_index: Merkle path position, 0 for -// non-Merkle ops) challenges.beta_powers[3..10] = beta^3..beta^10 (state[0..7]: RATE0 || -// RATE1 in sponge order) challenges.beta_powers[11..14] = beta^11..beta^14 (capacity[0..3]: -// domain separation) +// non-Merkle ops) +// challenges.beta_powers[3..10] = beta^3..beta^10 (state[0..7]: RATE0 || RATE1) +// challenges.beta_powers[11..14] = beta^11..beta^14 (capacity[0..3]) // -// Message encoding: alpha + beta^0*label + beta^1*addr + beta^2*node_index +// Message encoding: bus_prefix[CHIPLETS_BUS] +// + beta^0*label + beta^1*addr + beta^2*node_index // + beta^3*state[0] + ... + beta^10*state[7] // + beta^11*capacity[0] + ... + beta^14*capacity[3] // @@ -60,7 +61,18 @@ const MP_VERIFY_LABEL_START: Felt = Felt::new((MP_VERIFY_LABEL + 16) as u64); const MR_UPDATE_OLD_LABEL_START: Felt = Felt::new((MR_UPDATE_OLD_LABEL + 16) as u64); const MR_UPDATE_NEW_LABEL_START: Felt = Felt::new((MR_UPDATE_NEW_LABEL + 16) as u64); -/// Encodes hasher message as **alpha + ** +/// Creates a full hasher state with a word in the first 4 elements and zeros elsewhere. +/// Used by the bus debugger to construct HasherMessage structs for Merkle operations +/// where only the digest word (4 elements) is meaningful. +#[cfg(any(test, feature = "bus-debugger"))] +fn word_to_hasher_state(word: &[Felt; WORD_SIZE]) -> [Felt; hasher::STATE_WIDTH] { + let mut state = [ZERO; hasher::STATE_WIDTH]; + state[..WORD_SIZE].copy_from_slice(word); + state +} + +/// Encodes hasher message as **bus_prefix[CHIPLETS_BUS] + **. /// /// Used for tree operations (MPVERIFY, MRUPDATE) and generic hasher messages with node_index. #[inline(always)] @@ -74,7 +86,7 @@ fn hasher_message_value( where E: ExtensionField, { - let mut acc = challenges.alpha + let mut acc = challenges.bus_prefix[CHIPLETS_BUS] + challenges.beta_powers[bus_message::LABEL_IDX] * transition_label + challenges.beta_powers[bus_message::ADDR_IDX] * addr_next + challenges.beta_powers[bus_message::NODE_INDEX_IDX] * node_index; @@ -84,7 +96,8 @@ where acc } -/// Encodes hasher message as **alpha + ** (skips node_index). +/// Encodes hasher message as **bus_prefix[CHIPLETS_BUS] + ** +/// (skips node_index). #[inline(always)] fn header_rate_value( challenges: &Challenges, @@ -95,7 +108,7 @@ fn header_rate_value( where E: ExtensionField, { - let mut acc = challenges.alpha + let mut acc = challenges.bus_prefix[CHIPLETS_BUS] + challenges.beta_powers[bus_message::LABEL_IDX] * transition_label + challenges.beta_powers[bus_message::ADDR_IDX] * addr; for (i, &elem) in state.iter().enumerate() { @@ -104,8 +117,8 @@ where acc } -/// Encodes hasher message as **alpha + ** (skips node_index, digest -/// is RATE0 only). +/// Encodes hasher message as **bus_prefix[CHIPLETS_BUS] + ** +/// (skips node_index, digest is RATE0 only). #[inline(always)] fn header_digest_value( challenges: &Challenges, @@ -116,7 +129,7 @@ fn header_digest_value( where E: ExtensionField, { - let mut acc = challenges.alpha + let mut acc = challenges.bus_prefix[CHIPLETS_BUS] + challenges.beta_powers[bus_message::LABEL_IDX] * transition_label + challenges.beta_powers[bus_message::ADDR_IDX] * addr; for (i, &elem) in digest.iter().enumerate() { @@ -202,7 +215,9 @@ pub(super) fn build_end_block_request>( _debugger: &mut BusDebugger, ) -> E { let end_block_message = EndBlockMessage { - addr: main_trace.addr(row) + LAST_CYCLE_ROW_FELT, + // The output row's hasher address is the input row's address + 1, + // since each controller pair occupies 2 consecutive rows. + addr: main_trace.addr(row) + ONE, transition_label: RETURN_HASH_LABEL_END, digest: main_trace.decoder_hasher_state(row)[..4] .try_into() @@ -225,30 +240,8 @@ pub(super) fn build_hperm_request>( _debugger: &mut BusDebugger, ) -> E { let helper_0 = main_trace.helper_register(0, row); - let s0 = main_trace.stack_element(0, row); - let s1 = main_trace.stack_element(1, row); - let s2 = main_trace.stack_element(2, row); - let s3 = main_trace.stack_element(3, row); - let s4 = main_trace.stack_element(4, row); - let s5 = main_trace.stack_element(5, row); - let s6 = main_trace.stack_element(6, row); - let s7 = main_trace.stack_element(7, row); - let s8 = main_trace.stack_element(8, row); - let s9 = main_trace.stack_element(9, row); - let s10 = main_trace.stack_element(10, row); - let s11 = main_trace.stack_element(11, row); - let s0_nxt = main_trace.stack_element(0, row + 1); - let s1_nxt = main_trace.stack_element(1, row + 1); - let s2_nxt = main_trace.stack_element(2, row + 1); - let s3_nxt = main_trace.stack_element(3, row + 1); - let s4_nxt = main_trace.stack_element(4, row + 1); - let s5_nxt = main_trace.stack_element(5, row + 1); - let s6_nxt = main_trace.stack_element(6, row + 1); - let s7_nxt = main_trace.stack_element(7, row + 1); - let s8_nxt = main_trace.stack_element(8, row + 1); - let s9_nxt = main_trace.stack_element(9, row + 1); - let s10_nxt = main_trace.stack_element(10, row + 1); - let s11_nxt = main_trace.stack_element(11, row + 1); + let state: [Felt; 12] = core::array::from_fn(|i| main_trace.stack_element(i, row)); + let state_nxt: [Felt; 12] = core::array::from_fn(|i| main_trace.stack_element(i, row + 1)); let input_req = HasherMessage { transition_label: LINEAR_HASH_LABEL_START, @@ -256,17 +249,15 @@ pub(super) fn build_hperm_request>( node_index: ZERO, // Internal Poseidon2 state for HPERM is taken directly from the top 12 // stack elements in order: [RATE0, RATE1, CAPACITY] = [s0..s11]. - hasher_state: [s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11], + hasher_state: state, source: "hperm input", }; let output_req = HasherMessage { transition_label: RETURN_STATE_LABEL_END, - addr_next: helper_0 + LAST_CYCLE_ROW_FELT, + // Output row is 1 row after input in controller pair + addr_next: helper_0 + ONE, node_index: ZERO, - hasher_state: [ - s0_nxt, s1_nxt, s2_nxt, s3_nxt, s4_nxt, s5_nxt, s6_nxt, s7_nxt, s8_nxt, s9_nxt, - s10_nxt, s11_nxt, - ], + hasher_state: state_nxt, source: "hperm output", }; @@ -341,7 +332,8 @@ pub(super) fn build_log_precompile_request>( let output_req = HasherMessage { transition_label: RETURN_STATE_LABEL_END, - addr_next: addr + LAST_CYCLE_ROW_FELT, + // Output row is 1 row after input in controller pair + addr_next: addr + ONE, node_index: ZERO, hasher_state: Word::words_as_elements(&state_output) .try_into() @@ -369,7 +361,7 @@ pub(super) fn build_mpverify_request>( ) -> E { // helper register holds (clk + 1) let helper_0 = main_trace.helper_register(0, row); - let hash_cycle_len = HASH_CYCLE_LEN_FELT; + let rows_per_perm = CONTROLLER_ROWS_PER_PERM_FELT; let node_value = main_trace.stack_word(0, row); let node_depth = main_trace.stack_element(4, row); @@ -385,10 +377,11 @@ pub(super) fn build_mpverify_request>( let input_value = hasher_message_value(challenges, MP_VERIFY_LABEL_START, helper_0, node_index, node_word); + // Output addr: depth pairs * 2 rows/pair - 1 (last output row) let output_value = hasher_message_value( challenges, RETURN_HASH_LABEL_END, - helper_0 + node_depth * hash_cycle_len - ONE, + helper_0 + node_depth * rows_per_perm - ONE, ZERO, root_word, ); @@ -397,25 +390,19 @@ pub(super) fn build_mpverify_request>( #[cfg(any(test, feature = "bus-debugger"))] { - let mut node_state = [ZERO; hasher::STATE_WIDTH]; - node_state[..WORD_SIZE].copy_from_slice(&node_word); - let input = HasherMessage { transition_label: MP_VERIFY_LABEL_START, addr_next: helper_0, node_index, - hasher_state: node_state, + hasher_state: word_to_hasher_state(&node_word), source: "mpverify input", }; - let mut root_state = [ZERO; hasher::STATE_WIDTH]; - root_state[..WORD_SIZE].copy_from_slice(&root_word); - let output = HasherMessage { transition_label: RETURN_HASH_LABEL_END, - addr_next: helper_0 + node_depth * hash_cycle_len - ONE, + addr_next: helper_0 + node_depth * rows_per_perm - ONE, node_index: ZERO, - hasher_state: root_state, + hasher_state: word_to_hasher_state(&root_word), source: "mpverify output", }; @@ -435,8 +422,8 @@ pub(super) fn build_mrupdate_request>( ) -> E { // helper register holds (clk + 1) let helper_0 = main_trace.helper_register(0, row); - let hash_cycle_len = HASH_CYCLE_LEN_FELT; - let two_hash_cycles_len = hash_cycle_len + hash_cycle_len; + let rows_per_perm = CONTROLLER_ROWS_PER_PERM_FELT; + let two_legs_rows = rows_per_perm + rows_per_perm; let old_node_value = main_trace.stack_word(0, row); let merkle_path_depth = main_trace.stack_element(4, row); @@ -461,24 +448,27 @@ pub(super) fn build_mrupdate_request>( node_index, old_node_word, ); + // Old path output: depth pairs * 2 rows/pair - 1 let output_old_value = hasher_message_value( challenges, RETURN_HASH_LABEL_END, - helper_0 + merkle_path_depth * hash_cycle_len - ONE, + helper_0 + merkle_path_depth * rows_per_perm - ONE, ZERO, old_root_word, ); + // New path input: starts right after old path output let input_new_value = hasher_message_value( challenges, MR_UPDATE_NEW_LABEL_START, - helper_0 + merkle_path_depth * hash_cycle_len, + helper_0 + merkle_path_depth * rows_per_perm, node_index, new_node_word, ); + // New path output: depth pairs * 2 rows/pair * 2 legs - 1 let output_new_value = hasher_message_value( challenges, RETURN_HASH_LABEL_END, - helper_0 + merkle_path_depth * two_hash_cycles_len - ONE, + helper_0 + merkle_path_depth * two_legs_rows - ONE, ZERO, new_root_word, ); @@ -487,44 +477,35 @@ pub(super) fn build_mrupdate_request>( #[cfg(any(test, feature = "bus-debugger"))] { - let mut old_node_state = [ZERO; hasher::STATE_WIDTH]; - old_node_state[..WORD_SIZE].copy_from_slice(&old_node_word); - let mut old_root_state = [ZERO; hasher::STATE_WIDTH]; - old_root_state[..WORD_SIZE].copy_from_slice(&old_root_word); - let mut new_node_state = [ZERO; hasher::STATE_WIDTH]; - new_node_state[..WORD_SIZE].copy_from_slice(&new_node_word); - let mut new_root_state = [ZERO; hasher::STATE_WIDTH]; - new_root_state[..WORD_SIZE].copy_from_slice(&new_root_word); - let input_old = HasherMessage { transition_label: MR_UPDATE_OLD_LABEL_START, addr_next: helper_0, node_index, - hasher_state: old_node_state, + hasher_state: word_to_hasher_state(&old_node_word), source: "mrupdate input_old", }; let output_old = HasherMessage { transition_label: RETURN_HASH_LABEL_END, - addr_next: helper_0 + merkle_path_depth * hash_cycle_len - ONE, + addr_next: helper_0 + merkle_path_depth * rows_per_perm - ONE, node_index: ZERO, - hasher_state: old_root_state, + hasher_state: word_to_hasher_state(&old_root_word), source: "mrupdate output_old", }; let input_new = HasherMessage { transition_label: MR_UPDATE_NEW_LABEL_START, - addr_next: helper_0 + merkle_path_depth * hash_cycle_len, + addr_next: helper_0 + merkle_path_depth * rows_per_perm, node_index, - hasher_state: new_node_state, + hasher_state: word_to_hasher_state(&new_node_word), source: "mrupdate input_new", }; let output_new = HasherMessage { transition_label: RETURN_HASH_LABEL_END, - addr_next: helper_0 + merkle_path_depth * two_hash_cycles_len - ONE, + addr_next: helper_0 + merkle_path_depth * two_legs_rows - ONE, node_index: ZERO, - hasher_state: new_root_state, + hasher_state: word_to_hasher_state(&new_root_word), source: "mrupdate output_new", }; @@ -541,6 +522,25 @@ pub(super) fn build_mrupdate_request>( // ============================================================================================== /// Builds the response from the hasher chiplet at `row`. +/// +/// Only controller rows of the hasher chiplet are able to produce bus responses. +/// +/// **Input rows that produce responses:** +/// - Sponge start (is_boundary=1, LINEAR_HASH): full state -> matches SPAN/control block request +/// - Sponge continuation (is_boundary=0, LINEAR_HASH): rate-only -> matches RESPAN request +/// - Tree start (is_boundary=1, MP/MV/MU): leaf word -> matches MPVERIFY/MRUPDATE input +/// +/// **Input rows that do NOT produce responses:** +/// - Tree continuation (is_boundary=0, MP/MV/MU): no matching request from decoder +/// +/// **Output rows that produce responses:** +/// - HOUT (s2=0): digest -> matches END / MPVERIFY output / MRUPDATE output +/// - SOUT with is_boundary=1 (s2=1): full state -> matches HPERM output +/// +/// **Output rows that do NOT produce responses:** +/// - SOUT with is_boundary=0: intermediate output, no matching request +/// +/// **Perm segment rows:** never produce responses. pub(super) fn build_hasher_chiplet_responses( main_trace: &MainTrace, row: RowIndex, @@ -550,178 +550,151 @@ pub(super) fn build_hasher_chiplet_responses( where E: ExtensionField, { - let mut multiplicand = E::ONE; - let selector0 = main_trace.chiplet_selector_0(row); + // Permutation segment rows never produce chiplets bus responses. + if main_trace.chiplet_s_perm(row) == ONE { + return E::ONE; + } + + // --- Precompute common values ----------------------------------------------- + let selector1 = main_trace.chiplet_selector_1(row); let selector2 = main_trace.chiplet_selector_2(row); let selector3 = main_trace.chiplet_selector_3(row); - let op_label = get_op_label(selector0, selector1, selector2, selector3); + // Hasher labels are computed with s0=0 (the old chiplet-level selector for hasher). + // chiplet_selector_0 is now s_ctrl (1 on controller rows), but labels encode + // [0, s0, s1, s2] to match the label constants defined in hasher.rs. + let op_label = get_op_label(ZERO, selector1, selector2, selector3); let addr_next = Felt::from(row + 1); + let state = main_trace.chiplet_hasher_state(row); + let node_index = main_trace.chiplet_node_index(row); - // f_bp, f_mp, f_mv or f_mu == 1 - if row.as_usize().is_multiple_of(HASH_CYCLE_LEN) { - // Trace is already in sponge order [RATE0, RATE1, CAP] - let state = main_trace.chiplet_hasher_state(row); - let node_index = main_trace.chiplet_node_index(row); - let transition_label = op_label + LABEL_OFFSET_START; - - // f_bp == 1 - // v_all = v_h + v_a + v_b + v_c - if selector1 == ONE && selector2 == ZERO && selector3 == ZERO { - let hasher_message = HasherMessage { - transition_label, + // Hasher-internal selectors (not chiplet-level selectors). + // chiplet selector1 = hasher s0, selector2 = hasher s1, selector3 = hasher s2. + let s0 = selector1; + let s1 = selector2; + let s2 = selector3; + + let is_boundary = main_trace.chiplet_is_boundary(row); + + // Precompute commonly needed slices. + let digest: [Felt; WORD_SIZE] = + state[..WORD_SIZE].try_into().expect("state[0..4] must be 4 field elements"); + let rate: [Felt; hasher::RATE_LEN] = state[..hasher::RATE_LEN] + .try_into() + .expect("state[0..8] must be 8 field elements"); + + // --- Classify row and compute response -------------------------------------- + // + // The branches below are mutually exclusive. Each either returns a non-identity + // response or falls through to return E::ONE (identity = no response). + + if s0 == ONE && s1 == ZERO && s2 == ZERO && is_boundary == ONE { + // Sponge start (LINEAR_HASH, is_boundary=1): full 12-element state. + // Matches SPAN / control block start request. + let label = op_label + LABEL_OFFSET_START; + let msg = HasherMessage { + transition_label: label, + addr_next, + node_index, + hasher_state: state, + source: "hasher sponge_start", + }; + let value = msg.value(challenges); + + #[cfg(any(test, feature = "bus-debugger"))] + _debugger.add_response(alloc::boxed::Box::new(msg), challenges); + + value + } else if s0 == ONE && s1 == ZERO && s2 == ZERO { + // Sponge continuation (LINEAR_HASH, is_boundary=0): rate-only message. + // Label uses OUTPUT_LABEL_OFFSET because the decoder's RESPAN request uses + // LINEAR_HASH_LABEL + 32. + let label = op_label + LABEL_OFFSET_END; + let value = header_rate_value(challenges, label, addr_next, rate); + + #[cfg(any(test, feature = "bus-debugger"))] + { + let msg = HasherMessage { + transition_label: label, addr_next, - node_index, - hasher_state: state, - source: "hasher", + node_index: ZERO, + hasher_state: word_to_hasher_state(&digest), // rate-only, capacity zeroed + source: "hasher sponge_respan", }; - multiplicand = hasher_message.value(challenges); - - #[cfg(any(test, feature = "bus-debugger"))] - _debugger.add_response(alloc::boxed::Box::new(hasher_message), challenges); + _debugger.add_response(alloc::boxed::Box::new(msg), challenges); } - // f_mp or f_mv or f_mu == 1 - // v_leaf = v_h + (1 - b) * v_b + b * v_d - // In sponge order: RATE0 is at 0..4, RATE1 is at 4..8 - if selector1 == ONE && !(selector2 == ZERO && selector3 == ZERO) { - let bit = (node_index.as_canonical_u64() & 1) as u8; - let rate_word: [Felt; WORD_SIZE] = if bit == 0 { - state[..WORD_SIZE].try_into().expect("RATE0 word must be 4 field elements") - } else { - state[WORD_SIZE..hasher::RATE_LEN] - .try_into() - .expect("RATE1 word must be 4 field elements") - }; + value + } else if s0 == ONE && (s1 == ONE || s2 == ONE) && is_boundary == ONE { + // Tree start (MP_VERIFY / MR_UPDATE_OLD / MR_UPDATE_NEW, is_boundary=1): leaf word + // selected by direction bit. Matches MPVERIFY / MRUPDATE first-input request. + // Tree continuation inputs (is_boundary=0) produce no response. + let label = op_label + LABEL_OFFSET_START; + let bit = node_index.as_canonical_u64() & 1; + let leaf_word: [Felt; WORD_SIZE] = if bit == 0 { + digest + } else { + state[WORD_SIZE..hasher::RATE_LEN] + .try_into() + .expect("state[4..8] must be 4 field elements") + }; - multiplicand = hasher_message_value( - challenges, - transition_label, - addr_next, - node_index, - rate_word, - ); - - #[cfg(any(test, feature = "bus-debugger"))] - { - let hasher_state = if bit == 0 { - [ - state[0], state[1], state[2], state[3], ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, - ZERO, ZERO, - ] - } else { - [ - state[4], state[5], state[6], state[7], ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, - ZERO, ZERO, - ] - }; - let hasher_message = HasherMessage { - transition_label, - addr_next, - node_index, - hasher_state, - source: "hasher", - }; - _debugger.add_response(alloc::boxed::Box::new(hasher_message), challenges); - } - } - } + let value = hasher_message_value(challenges, label, addr_next, node_index, leaf_word); - // f_hout, f_sout, f_abp == 1 - if row.as_usize() % HASH_CYCLE_LEN == LAST_CYCLE_ROW { - // Trace is already in sponge order [RATE0, RATE1, CAP] - let state = main_trace.chiplet_hasher_state(row); - let node_index = main_trace.chiplet_node_index(row); - let transition_label = op_label + LABEL_OFFSET_END; - - // f_hout == 1 - // v_res = v_h + v_b; - // Digest is at sponge positions 0..4 (RATE0) - if selector1 == ZERO && selector2 == ZERO && selector3 == ZERO { - let rate_word: [Felt; WORD_SIZE] = - state[..WORD_SIZE].try_into().expect("RATE0 word must be 4 field elements"); - multiplicand = hasher_message_value( - challenges, - transition_label, + #[cfg(any(test, feature = "bus-debugger"))] + { + let msg = HasherMessage { + transition_label: label, addr_next, node_index, - rate_word, - ); - - #[cfg(any(test, feature = "bus-debugger"))] - { - let hasher_message = HasherMessage { - transition_label, - addr_next, - node_index, - hasher_state: [ - state[0], state[1], state[2], state[3], ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, - ZERO, ZERO, - ], - source: "hasher", - }; - _debugger.add_response(alloc::boxed::Box::new(hasher_message), challenges); - } + hasher_state: word_to_hasher_state(&leaf_word), + source: "hasher tree_start", + }; + _debugger.add_response(alloc::boxed::Box::new(msg), challenges); } - // f_sout == 1 - // v_all = v_h + v_a + v_b + v_c - if selector1 == ZERO && selector2 == ZERO && selector3 == ONE { - let hasher_message = HasherMessage { - transition_label, + value + } else if s0 == ZERO && s1 == ZERO && s2 == ZERO { + // HOUT -- RETURN_HASH (0,0,0): digest-only response. + // Matches END / MPVERIFY output / MRUPDATE output. + let label = op_label + LABEL_OFFSET_END; + let value = hasher_message_value(challenges, label, addr_next, node_index, digest); + + #[cfg(any(test, feature = "bus-debugger"))] + { + let msg = HasherMessage { + transition_label: label, addr_next, node_index, - hasher_state: state, - source: "hasher", + hasher_state: word_to_hasher_state(&digest), + source: "hasher hout", }; + _debugger.add_response(alloc::boxed::Box::new(msg), challenges); + } - multiplicand = hasher_message.value(challenges); + value + } else if s0 == ZERO && s1 == ZERO && s2 == ONE && is_boundary == ONE { + // SOUT final -- RETURN_STATE (0,0,1) with is_boundary=1: full 12-element state. + // Matches HPERM output request. Intermediate SOUT (is_boundary=0) produces no response. + let label = op_label + LABEL_OFFSET_END; + let msg = HasherMessage { + transition_label: label, + addr_next, + node_index, + hasher_state: state, + source: "hasher sout_final", + }; + let value = msg.value(challenges); - #[cfg(any(test, feature = "bus-debugger"))] - _debugger.add_response(alloc::boxed::Box::new(hasher_message), challenges); - } + #[cfg(any(test, feature = "bus-debugger"))] + _debugger.add_response(alloc::boxed::Box::new(msg), challenges); - // f_abp == 1 - // v_abp = v_h + v_b' + v_c' - v_b - v_c - if selector1 == ONE && selector2 == ZERO && selector3 == ZERO { - // Build the value from the hasher state just after absorption of new elements. - // Trace is in sponge order: RATE0 at indices 0..4, RATE1 at indices 4..8. - // Rate is mapped to lanes 0..7 with capacity lanes zeroed. - let state_nxt = main_trace.chiplet_hasher_state(row + 1); - let rate: [Felt; hasher::RATE_LEN] = state_nxt[..hasher::RATE_LEN] - .try_into() - .expect("rate portion must be 8 field elements"); - - multiplicand = - hasher_message_value(challenges, transition_label, addr_next, node_index, rate); - - #[cfg(any(test, feature = "bus-debugger"))] - { - let hasher_message = HasherMessage { - transition_label, - addr_next, - node_index, - hasher_state: [ - state_nxt[0], - state_nxt[1], - state_nxt[2], - state_nxt[3], - state_nxt[4], - state_nxt[5], - state_nxt[6], - state_nxt[7], - ZERO, - ZERO, - ZERO, - ZERO, - ], - source: "hasher", - }; - _debugger.add_response(alloc::boxed::Box::new(hasher_message), challenges); - } - } + value + } else { + // No response: padding rows (s0=0, s1=1), tree continuations (is_boundary=0), + // intermediate SOUT (is_boundary=0), or any other non-responding row. + E::ONE } - multiplicand } // CONTROL BLOCK REQUEST MESSAGE @@ -737,8 +710,8 @@ impl BusMessage for ControlBlockRequestMessage where E: ExtensionField, { - /// Encodes as **alpha + ** (skips - /// node_index). + /// Encodes as **bus_prefix[CHIPLETS_BUS] + ** (skips node_index). fn value(&self, challenges: &Challenges) -> E { // Header + rate portion + capacity domain element for op_code let mut acc = header_rate_value( @@ -862,7 +835,8 @@ where E: ExtensionField, { fn value(&self, challenges: &Challenges) -> E { - header_rate_value(challenges, self.transition_label, self.addr_next - ONE, self.state) + // In the controller/perm split, addr_next is used directly (no subtraction). + header_rate_value(challenges, self.transition_label, self.addr_next, self.state) } fn source(&self) -> &str { diff --git a/processor/src/trace/chiplets/aux_trace/bus/kernel.rs b/processor/src/trace/chiplets/aux_trace/bus/kernel.rs index 0455b292f6..a366c612b6 100644 --- a/processor/src/trace/chiplets/aux_trace/bus/kernel.rs +++ b/processor/src/trace/chiplets/aux_trace/bus/kernel.rs @@ -2,6 +2,7 @@ use core::fmt::{Display, Formatter, Result as FmtResult}; use miden_air::trace::{ Challenges, MainTrace, RowIndex, + bus_types::CHIPLETS_BUS, chiplets::kernel_rom::{KERNEL_PROC_CALL_LABEL, KERNEL_PROC_INIT_LABEL}, }; use miden_core::{Felt, field::ExtensionField}; @@ -74,13 +75,16 @@ where { #[inline(always)] fn value(&self, challenges: &Challenges) -> E { - challenges.encode([ - KERNEL_PROC_CALL_LABEL, - self.kernel_proc_digest[0], - self.kernel_proc_digest[1], - self.kernel_proc_digest[2], - self.kernel_proc_digest[3], - ]) + challenges.encode( + CHIPLETS_BUS, + [ + KERNEL_PROC_CALL_LABEL, + self.kernel_proc_digest[0], + self.kernel_proc_digest[1], + self.kernel_proc_digest[2], + self.kernel_proc_digest[3], + ], + ) } fn source(&self) -> &str { @@ -106,13 +110,16 @@ where { #[inline(always)] fn value(&self, challenges: &Challenges) -> E { - challenges.encode([ - KERNEL_PROC_INIT_LABEL, - self.kernel_proc_digest[0], - self.kernel_proc_digest[1], - self.kernel_proc_digest[2], - self.kernel_proc_digest[3], - ]) + challenges.encode( + CHIPLETS_BUS, + [ + KERNEL_PROC_INIT_LABEL, + self.kernel_proc_digest[0], + self.kernel_proc_digest[1], + self.kernel_proc_digest[2], + self.kernel_proc_digest[3], + ], + ) } fn source(&self) -> &str { diff --git a/processor/src/trace/chiplets/aux_trace/bus/memory.rs b/processor/src/trace/chiplets/aux_trace/bus/memory.rs index bd179571ac..52c7941b93 100644 --- a/processor/src/trace/chiplets/aux_trace/bus/memory.rs +++ b/processor/src/trace/chiplets/aux_trace/bus/memory.rs @@ -2,6 +2,7 @@ use core::fmt::{Display, Formatter, Result as FmtResult}; use miden_air::trace::{ Challenges, MainTrace, RowIndex, + bus_types::CHIPLETS_BUS, chiplets::{ ace::{ACE_INSTRUCTION_ID1_OFFSET, ACE_INSTRUCTION_ID2_OFFSET}, memory::{ @@ -601,16 +602,19 @@ where E: ExtensionField, { fn value(&self, challenges: &Challenges) -> E { - challenges.encode([ - self.op_label, - self.ctx, - self.addr, - self.clk, - self.word[0], - self.word[1], - self.word[2], - self.word[3], - ]) + challenges.encode( + CHIPLETS_BUS, + [ + self.op_label, + self.ctx, + self.addr, + self.clk, + self.word[0], + self.word[1], + self.word[2], + self.word[3], + ], + ) } fn source(&self) -> &str { @@ -641,7 +645,8 @@ where E: ExtensionField, { fn value(&self, challenges: &Challenges) -> E { - challenges.encode([self.op_label, self.ctx, self.addr, self.clk, self.element]) + challenges + .encode(CHIPLETS_BUS, [self.op_label, self.ctx, self.addr, self.clk, self.element]) } fn source(&self) -> &str { diff --git a/processor/src/trace/chiplets/aux_trace/bus/mod.rs b/processor/src/trace/chiplets/aux_trace/bus/mod.rs index a222f0a5ae..ced7ba4977 100644 --- a/processor/src/trace/chiplets/aux_trace/bus/mod.rs +++ b/processor/src/trace/chiplets/aux_trace/bus/mod.rs @@ -15,6 +15,7 @@ use memory::{ }; use miden_air::trace::{ Challenges, MainTrace, RowIndex, + bus_types::CHIPLETS_BUS, chiplets::{ hasher::LINEAR_HASH_LABEL, memory::{ @@ -184,7 +185,7 @@ where { use miden_air::trace::bus_message; - challenges.alpha + challenges.bus_prefix[CHIPLETS_BUS] + challenges.beta_powers[bus_message::LABEL_IDX] * Felt::from_u8(LINEAR_HASH_LABEL + 16) + challenges.beta_powers[bus_message::ADDR_IDX] * addr + challenges.beta_powers[bus_message::CAPACITY_DOMAIN_IDX] * op_code diff --git a/processor/src/trace/chiplets/aux_trace/hasher_perm.rs b/processor/src/trace/chiplets/aux_trace/hasher_perm.rs new file mode 100644 index 0000000000..44f87de089 --- /dev/null +++ b/processor/src/trace/chiplets/aux_trace/hasher_perm.rs @@ -0,0 +1,115 @@ +//! Hasher perm-link bus builder. +//! +//! Builds the LogUp running-sum that links hasher controller rows (dispatch) to hasher +//! permutation segment rows (compute). Each controller input/output row adds +1/msg, +//! and each permutation cycle boundary subtracts -m/msg (where m = multiplicity from +//! memoization). +//! +//! The running sum is merged into the shared v_wiring auxiliary column. + +use alloc::vec::Vec; + +use miden_air::trace::{ + Challenges, MainTrace, RowIndex, bus_types::HASHER_PERM_LINK, chiplets::hasher::HASH_CYCLE_LEN, +}; +use miden_core::{Felt, field::ExtensionField}; + +/// Labels that distinguish input vs output perm-link messages within the `HASHER_PERM_LINK` bus. +const LABEL_IN: Felt = Felt::ZERO; +const LABEL_OUT: Felt = Felt::ONE; + +/// Builds the hasher perm-link running sum as a prefix array. +/// +/// The result is a vector of the same length as the main trace, where each entry +/// is the cumulative LogUp contribution from hasher perm-link messages up to that row. +pub fn build_perm_link_running_sum>( + main_trace: &MainTrace, + challenges: &Challenges, +) -> Vec { + let num_rows = main_trace.num_rows(); + let mut running_sum = vec![E::ZERO; num_rows]; + + // The hasher is always the first chiplet, so its trace starts at row 0. + // This invariant is required for the cycle_pos calculation below. + assert!( + main_trace.is_hash_row(RowIndex::from(0u32)), + "hasher chiplet must start at row 0" + ); + + // TODO: batch inversion + for row_idx in 0..(num_rows - 1) { + let row: RowIndex = (row_idx as u32).into(); + + if !main_trace.is_hash_row(row) { + running_sum[row_idx + 1] = running_sum[row_idx]; + continue; + } + + let s_perm = main_trace.chiplet_s_perm(row); + // Hasher-internal sub-selectors (only meaningful on controller rows): + // s0 = chiplets[1] (input flag), s1 = chiplets[2]. + let s0 = main_trace.chiplet_selector_1(row); + let s1 = main_trace.chiplet_selector_2(row); + + if s_perm == Felt::ZERO { + // Controller region + if s0 == Felt::ONE { + // Controller input row: +1/msg_in + let msg_in = encode_perm_link_message(main_trace, row, challenges, LABEL_IN); + running_sum[row_idx + 1] = running_sum[row_idx] + msg_in.inverse(); + } else if s0 == Felt::ZERO && s1 == Felt::ZERO { + // Controller output row (RETURN_HASH or RETURN_STATE with s0=0, s1=0): +1/msg_out + let msg_out = encode_perm_link_message(main_trace, row, challenges, LABEL_OUT); + running_sum[row_idx + 1] = running_sum[row_idx] + msg_out.inverse(); + } else { + running_sum[row_idx + 1] = running_sum[row_idx]; + } + } else { + // Permutation segment. + // This works because the hasher is always the first chiplet (rows start at 0) + // and the controller region is padded to a HASH_CYCLE_LEN boundary, so perm + // cycles are aligned to global row indices. + let cycle_pos = row_idx % HASH_CYCLE_LEN; + + if cycle_pos == 0 { + // Perm row 0: -m/msg_in + let m: E = main_trace.chiplet_node_index(row).into(); + let msg_in = encode_perm_link_message(main_trace, row, challenges, LABEL_IN); + running_sum[row_idx + 1] = running_sum[row_idx] - m * msg_in.inverse(); + } else if cycle_pos == HASH_CYCLE_LEN - 1 { + // Perm boundary row (row 15 in the packed 16-row cycle): -m/msg_out + let m: E = main_trace.chiplet_node_index(row).into(); + let msg_out = encode_perm_link_message(main_trace, row, challenges, LABEL_OUT); + running_sum[row_idx + 1] = running_sum[row_idx] - m * msg_out.inverse(); + } else { + running_sum[row_idx + 1] = running_sum[row_idx]; + } + } + } + + // The running sum should balance to zero (all requests matched by responses). + assert!( + running_sum[num_rows - 1] == E::ZERO, + "hasher perm-link running sum did not balance to zero: {:?}", + running_sum[num_rows - 1] + ); + + running_sum +} + +/// Encodes a perm-link message on the dedicated `HASHER_PERM_LINK` bus: `[label, h0, ..., h11]`. +fn encode_perm_link_message>( + main_trace: &MainTrace, + row: RowIndex, + challenges: &Challenges, + label: Felt, +) -> E { + let state = main_trace.chiplet_hasher_state(row); + challenges.encode( + HASHER_PERM_LINK, + [ + label, state[0], state[1], state[2], state[3], state[4], state[5], state[6], state[7], + state[8], state[9], state[10], state[11], + ], + ) +} diff --git a/processor/src/trace/chiplets/aux_trace/mod.rs b/processor/src/trace/chiplets/aux_trace/mod.rs index 06798577e4..6bc0421011 100644 --- a/processor/src/trace/chiplets/aux_trace/mod.rs +++ b/processor/src/trace/chiplets/aux_trace/mod.rs @@ -15,6 +15,7 @@ pub use bus::{ mod virtual_table; pub use virtual_table::ChipletsVTableColBuilder; +mod hasher_perm; mod wiring_bus; /// Constructs the execution trace for chiplets-related auxiliary columns (used in multiset checks). @@ -42,7 +43,8 @@ impl AuxTraceBuilder { /// 2. A column acting as /// - a virtual table for the sibling table used by the hasher chiplet, /// - a bus between the memory chiplet and the ACE chiplet. - /// 3. A column used as a bus to wire the gates of the ACE chiplet. + /// 3. A column used as a bus to wire the gates of the ACE chiplet. It also carries the hasher + /// perm-link (linking hasher controller rows to hasher permutation segment). pub(crate) fn build_aux_columns>( &self, main_trace: &MainTrace, @@ -55,11 +57,12 @@ impl AuxTraceBuilder { let b_chip = bus_col_builder.build_aux_column(main_trace, challenges); let wiring_bus = wiring_bus_builder.build_aux_column(main_trace, challenges); - // When debugging, check that the LogUp wiring bus balances. - // The vtable and chiplets bus final values are non-trivial (they encode public-input- - // dependent boundary terms) and are checked by the verifier in reduced_aux_values. - let log_up_final_value = wiring_bus.last().copied().unwrap_or(E::ZERO); - debug_assert_eq!(log_up_final_value, E::ZERO); + // The wiring bus (v_wiring) carries three stacked LogUp contributions: + // 1. ACE wiring (node definitions and consumptions) + // 2. Memory range checks (3 fractions per memory row) + // 3. Hasher perm-link (linking controller rows to permutation segment) + // The final value is non-zero due to memory range check residual; + // the verifier checks b_range + v_wiring = 0 in reduced_aux_values. [t_chip, b_chip, wiring_bus] } diff --git a/processor/src/trace/chiplets/aux_trace/virtual_table.rs b/processor/src/trace/chiplets/aux_trace/virtual_table.rs index d97c20d6e7..b6a9d87767 100644 --- a/processor/src/trace/chiplets/aux_trace/virtual_table.rs +++ b/processor/src/trace/chiplets/aux_trace/virtual_table.rs @@ -1,5 +1,6 @@ use miden_air::trace::{ Challenges, LOG_PRECOMPILE_LABEL, MainTrace, RowIndex, + bus_types::{LOG_PRECOMPILE_TRANSCRIPT, SIBLING_TABLE}, chiplets::hasher::DIGEST_LEN, log_precompile::{HELPER_CAP_PREV_RANGE, STACK_CAP_NEXT_RANGE}, }; @@ -99,48 +100,52 @@ const RATE0_RANGE: core::ops::Range = 0..DIGEST_LEN; /// Range for RATE1 (second rate word) in sponge state. const RATE1_RANGE: core::ops::Range = DIGEST_LEN..(2 * DIGEST_LEN); -/// Node is left child (lsb=0), sibling is right child at RATE1: alpha + beta_powers[2]*index + -/// beta_powers[7..10]*sibling -const SIBLING_RATE1_LAYOUT: [usize; 5] = [2, 7, 8, 9, 10]; -/// Node is right child (lsb=1), sibling is left child at RATE0: alpha + beta_powers[2]*index + -/// beta_powers[3..6]*sibling -const SIBLING_RATE0_LAYOUT: [usize; 5] = [2, 3, 4, 5, 6]; +/// Node is left child (lsb=0), sibling is right child at RATE1. +/// Layout: [mrupdate_id, node_index, h[4], h[5], h[6], h[7]] +const SIBLING_RATE1_LAYOUT: [usize; 6] = [1, 2, 7, 8, 9, 10]; +/// Node is right child (lsb=1), sibling is left child at RATE0. +/// Layout: [mrupdate_id, node_index, h[0], h[1], h[2], h[3]] +const SIBLING_RATE0_LAYOUT: [usize; 6] = [1, 2, 3, 4, 5, 6]; -/// Extracts the node index and sibling word from the trace and encodes a sibling table entry. +/// Extracts the node index, mrupdate_id, and sibling word from a controller input row +/// and encodes a sibling table entry. /// -/// The node index comes from `row`, while the sibling state comes from `state_row` -/// (which may be `row` or `row + 1` depending on whether this is an absorb or -/// absorb-next cycle). +/// In the controller/perm split, the sibling is always in the current row's state +/// (no need to look at the next row). #[inline(always)] fn encode_sibling_from_trace>( main_trace: &MainTrace, challenges: &Challenges, row: RowIndex, - state_row: RowIndex, ) -> E { let index = main_trace.chiplet_node_index(row); + let mrupdate_id = main_trace.chiplet_mrupdate_id(row); let lsb = index.as_canonical_u64() & 1; + let state = main_trace.chiplet_hasher_state(row); let (layout, sibling) = if lsb == 0 { // Node is left child, sibling is right child at RATE1 - (SIBLING_RATE1_LAYOUT, &main_trace.chiplet_hasher_state(state_row)[RATE1_RANGE]) + (SIBLING_RATE1_LAYOUT, &state[RATE1_RANGE]) } else { // Node is right child, sibling is left child at RATE0 - (SIBLING_RATE0_LAYOUT, &main_trace.chiplet_hasher_state(state_row)[RATE0_RANGE]) + (SIBLING_RATE0_LAYOUT, &state[RATE0_RANGE]) }; - challenges.encode_sparse(layout, [index, sibling[0], sibling[1], sibling[2], sibling[3]]) + challenges.encode_sparse( + SIBLING_TABLE, + layout, + [mrupdate_id, index, sibling[0], sibling[1], sibling[2], sibling[3]], + ) } -/// Constructs the removals from the table when the hasher absorbs a new sibling node while -/// computing the new Merkle root. +/// Constructs the removals from the table for MU (new path) controller input rows. +/// +/// In the controller/perm split, all MU input rows participate (not just init rows). fn chiplets_vtable_remove_sibling>( main_trace: &MainTrace, challenges: &Challenges, row: RowIndex, ) -> E { if main_trace.f_mu(row) { - encode_sibling_from_trace(main_trace, challenges, row, row) - } else if main_trace.f_mua(row) { - encode_sibling_from_trace(main_trace, challenges, row, row + 1) + encode_sibling_from_trace(main_trace, challenges, row) } else { E::ONE } @@ -149,17 +154,14 @@ fn chiplets_vtable_remove_sibling>( // VIRTUAL TABLE RESPONSES // ================================================================================================ -/// Constructs the inclusions to the table when the hasher absorbs a new sibling node while -/// computing the old Merkle root. +/// Constructs the inclusions to the table for MV (old path) controller input rows. fn chiplets_vtable_add_sibling>( main_trace: &MainTrace, challenges: &Challenges, row: RowIndex, ) -> E { if main_trace.f_mv(row) { - encode_sibling_from_trace(main_trace, challenges, row, row) - } else if main_trace.f_mva(row) { - encode_sibling_from_trace(main_trace, challenges, row, row + 1) + encode_sibling_from_trace(main_trace, challenges, row) } else { E::ONE } @@ -179,13 +181,16 @@ where { fn value(&self, challenges: &Challenges) -> E { let state_elements: [Felt; 4] = self.state.into(); - challenges.encode([ - Felt::from_u8(LOG_PRECOMPILE_LABEL), - state_elements[0], - state_elements[1], - state_elements[2], - state_elements[3], - ]) + challenges.encode( + LOG_PRECOMPILE_TRANSCRIPT, + [ + Felt::from_u8(LOG_PRECOMPILE_LABEL), + state_elements[0], + state_elements[1], + state_elements[2], + state_elements[3], + ], + ) } fn source(&self) -> &str { diff --git a/processor/src/trace/chiplets/aux_trace/wiring_bus.rs b/processor/src/trace/chiplets/aux_trace/wiring_bus.rs index 352f8752f2..11493c3602 100644 --- a/processor/src/trace/chiplets/aux_trace/wiring_bus.rs +++ b/processor/src/trace/chiplets/aux_trace/wiring_bus.rs @@ -1,11 +1,18 @@ use alloc::vec::Vec; -use miden_air::trace::{Challenges, MainTrace}; +use miden_air::trace::{Challenges, MainTrace, RowIndex}; use miden_core::{Felt, field::ExtensionField}; -use super::super::ace::{AceHints, NUM_ACE_LOGUP_FRACTIONS_EVAL, NUM_ACE_LOGUP_FRACTIONS_READ}; +use super::{ + super::ace::{AceHints, NUM_ACE_LOGUP_FRACTIONS_EVAL, NUM_ACE_LOGUP_FRACTIONS_READ}, + hasher_perm, +}; -/// Describes how to construct the execution trace of the ACE chiplet wiring bus column. +/// Describes how to construct the execution trace of the wiring bus column (v_wiring). +/// This column carries three stacked LogUp contributions: +/// 1. ACE wiring (node definitions and consumptions) +/// 2. Memory range checks (w0, w1, 4*w1 16-bit lookups) +/// 3. Hasher perm-link (controller-to-permutation segment linking) pub struct WiringBusBuilder<'a> { ace_hints: &'a AceHints, } @@ -64,6 +71,42 @@ impl<'a> WiringBusBuilder<'a> { assert_eq!(wiring_bus[trace_offset], E::ZERO); + // Build memory range check LogUp requests as a running sum, then merge into wiring_bus. + // For each memory row, subtract 1/(alpha_rc+w0) + 1/(alpha_rc+w1) + 1/(alpha_rc+4*w1). + // Must use bus_prefix[RANGE_CHECK_BUS] to match the range checker's encoding. + use miden_air::trace::bus_types::RANGE_CHECK_BUS; + let alpha = challenges.bus_prefix[RANGE_CHECK_BUS]; + let mut mem_prefix = vec![E::ZERO; main_trace.num_rows()]; + for row_idx in 0..(main_trace.num_rows() - 1) { + let row: RowIndex = (row_idx as u32).into(); + if !main_trace.is_memory_row(row) { + mem_prefix[row_idx + 1] = mem_prefix[row_idx]; + continue; + } + + let w0: E = main_trace.chiplet_memory_word_addr_lo(row).into(); + let w1: E = main_trace.chiplet_memory_word_addr_hi(row).into(); + let w1_mul4: E = + (main_trace.chiplet_memory_word_addr_hi(row) * Felt::from_u8(4)).into(); + + let den0 = alpha + w0; + let den1 = alpha + w1; + let den2 = alpha + w1_mul4; + + let delta = -(den0.inverse() + den1.inverse() + den2.inverse()); + mem_prefix[row_idx + 1] = mem_prefix[row_idx] + delta; + } + + for (dst, mem) in wiring_bus.iter_mut().zip(mem_prefix.iter()) { + *dst += *mem; + } + + // Build hasher perm-link LogUp running sum and merge into wiring_bus. + let perm_prefix = hasher_perm::build_perm_link_running_sum(main_trace, challenges); + for (dst, perm) in wiring_bus.iter_mut().zip(perm_prefix.iter()) { + *dst += *perm; + } + wiring_bus } } diff --git a/processor/src/trace/chiplets/bitwise/tests.rs b/processor/src/trace/chiplets/bitwise/tests.rs index 118b453c9b..b0a836a4e3 100644 --- a/processor/src/trace/chiplets/bitwise/tests.rs +++ b/processor/src/trace/chiplets/bitwise/tests.rs @@ -16,7 +16,6 @@ fn bitwise_init() { } #[test] -#[expect(clippy::needless_range_loop)] fn bitwise_and() { let mut bitwise = Bitwise::new(); @@ -60,7 +59,6 @@ fn bitwise_and() { } #[test] -#[expect(clippy::needless_range_loop)] fn bitwise_xor() { let mut bitwise = Bitwise::new(); @@ -104,7 +102,6 @@ fn bitwise_xor() { } #[test] -#[expect(clippy::needless_range_loop)] fn bitwise_multiple() { let mut bitwise = Bitwise::new(); @@ -199,7 +196,6 @@ fn build_trace(bitwise: Bitwise, num_rows: usize) -> Vec> { trace } -#[expect(clippy::needless_range_loop)] fn check_decomposition(trace: &[Vec], start: usize, a: u64, b: u64) { let mut bit_offset = 28; diff --git a/processor/src/trace/chiplets/hasher/mod.rs b/processor/src/trace/chiplets/hasher/mod.rs index 0a90bd7a5b..ff19e86c79 100644 --- a/processor/src/trace/chiplets/hasher/mod.rs +++ b/processor/src/trace/chiplets/hasher/mod.rs @@ -1,9 +1,10 @@ use alloc::collections::BTreeMap; use miden_air::trace::chiplets::hasher::{ - DIGEST_RANGE, LINEAR_HASH, MP_VERIFY, MR_UPDATE_NEW, MR_UPDATE_OLD, RATE_LEN, RETURN_HASH, - RETURN_STATE, STATE_WIDTH, Selectors, TRACE_WIDTH, + DIGEST_RANGE, HASH_CYCLE_LEN, LINEAR_HASH, MP_VERIFY, MR_UPDATE_NEW, MR_UPDATE_OLD, RATE_LEN, + RETURN_HASH, RETURN_STATE, STATE_WIDTH, Selectors, }; +use miden_core::chiplets::hasher::apply_permutation; use super::{ Felt, HasherState, MerklePath, MerkleRootUpdate, ONE, OpBatch, TraceFragment, Word as Digest, @@ -14,60 +15,104 @@ mod trace; use trace::HasherTrace; #[cfg(test)] +#[allow(clippy::needless_range_loop)] mod tests; // HASH PROCESSOR // ================================================================================================ +/// Key type for digest-based lookups. +type DigestKey = [u64; 4]; + +/// Key type for full-state lookups. +type StateKey = [u64; STATE_WIDTH]; + +/// Converts a Digest to a DigestKey for BTreeMap lookup. +fn digest_to_key(digest: Digest) -> DigestKey { + let elems = digest.as_elements(); + core::array::from_fn(|i| elems[i].as_canonical_u64()) +} + +/// Converts a HasherState to a StateKey for BTreeMap lookup. +fn state_to_key(state: &HasherState) -> StateKey { + core::array::from_fn(|i| state[i].as_canonical_u64()) +} + +/// Reconstructs a HasherState from a StateKey. +fn key_to_state(key: &StateKey) -> HasherState { + core::array::from_fn(|i| Felt::new(key[i])) +} + /// Hash chiplet for the VM. /// -/// This component is responsible for performing all hash-related computations for the VM, as well -/// as building an execution trace for these computations. These computations include: -/// * Linear hashes, including simple 2-to-1 hashes, single and multiple permutations. -/// * Merkle path verification. -/// * Merkle root updates. +/// This component uses a controller/permutation split architecture: /// -/// ## Execution trace -/// Hasher execution trace consists of 16 columns as illustrated below: +/// - **Controller region** (s_perm=0): pairs of (input, output) rows for each permutation request. +/// Input rows (s0=1) capture the operation type and pre-permutation state. Output rows (s0=0, +/// s1=0) capture the post-permutation state. /// -/// s0 s1 s2 h0 h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11 idx -/// ├────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴─────┴─────┴─────┤ +/// - **Permutation segment** (s_perm=1): one 16-row Poseidon2 cycle per unique input state. +/// Multiplicity is stored in the node_index column. Linked to controller rows via the hasher_perm +/// LogUp bus. /// -/// In the above, the meaning of the columns is as follows: -/// * Selector columns s0, s1, and s2 used to help select transition function for a given row. -/// * Hasher state columns h0 through h11 used to hold the hasher state for each round of hash -/// computation. The state is laid out as `[RATE0, RATE1, CAPACITY]`: -/// - The first eight columns (h0-h7) represent the rate elements of the state. These are used to -/// absorb the values to be hashed. Once a permutation is complete, hash output is located in -/// the first four rate columns (h0, h1, h2, h3). -/// - The last four columns (h8-h11) represent the capacity state of the sponge function. -/// * Node index column idx used to help with Merkle path verification and Merkle root update -/// computations. For all other computations the values in this column are set to 0s. +/// This architecture enables permutation deduplication: N requests with the same input state +/// produce N controller pairs but only one permutation cycle (with multiplicity N). /// -/// Each permutation of the hash function adds 8 rows to the execution trace. Thus, for Merkle -/// path verification, number of rows added to the trace is 8 * path.len(), and for Merkle root -/// update it is 16 * path.len(), since we need to perform two path verifications for each update. +/// ## Trace layout (20 columns) /// -/// In addition to the execution trace, the hash chiplet also maintains: -/// - an auxiliary trace builder, which can be used to construct a running product column describing -/// the state of the sibling table (used in Merkle root update operations). -/// - a map of memoized execution trace, which keeps track of start and end rows of the sections of -/// the trace of a control or span block that can be copied to be used later for program blocks -/// encountered with the same digest instead of building it from scratch everytime. The hash of -/// the block is used as the key here after converting it to a bytes array. +/// s0 s1 s2 h0..h11 idx mrupdate_id is_boundary direction_bit s_perm +/// ├────┴───┴───┴────────┴────┴────────────┴─────────┴─────────┴────────┤ #[derive(Debug, Default)] pub struct Hasher { trace: HasherTrace, - memoized_trace_map: BTreeMap<[u8; 32], (usize, usize)>, + /// Maps block digest -> (start_row, end_row) for memoized controller traces. + memoized_trace_map: BTreeMap, + /// Maps input state -> multiplicity for permutation deduplication. + /// During finalize_trace(), one 16-row perm cycle is emitted per entry. + perm_request_map: BTreeMap, + /// Monotonically increasing counter for MRUPDATE domain separation. + mrupdate_id: Felt, + /// Whether the permutation segment has been finalized. + finalized: bool, } impl Hasher { // STATE ACCESSORS // -------------------------------------------------------------------------------------------- - /// Returns current length of the execution trace stored in this hasher. + /// Returns the length of the execution trace. + /// + /// Before finalization, this returns an estimate based on the controller region length + /// plus the expected permutation segment size. The estimate is verified against the + /// actual length during `fill_trace()` via a debug assertion. pub(super) fn trace_len(&self) -> usize { - self.trace.trace_len() + if self.finalized { + self.trace.trace_len() + } else { + self.estimate_trace_len() + } + } + + /// Returns the layout of the hasher region as `(controller_len, perm_len)`, both exact + /// multiples of `HASH_CYCLE_LEN`. Must be called before `fill_trace()` consumes the hasher. + /// + /// `controller_len` includes the padding rows that `finalize_trace()` will later append to + /// round the raw controller count up to a cycle boundary; `perm_len` is the total span of + /// the permutation cycles that `finalize_trace()` will emit, one per unique input state. + pub(super) fn region_lengths(&self) -> (usize, usize) { + debug_assert!(!self.finalized, "region_lengths must be called before finalization"); + let controller_len = self.trace.trace_len().next_multiple_of(HASH_CYCLE_LEN); + let perm_len = self.perm_request_map.len() * HASH_CYCLE_LEN; + (controller_len, perm_len) + } + + /// Estimates the total trace length before finalization. + /// + /// This must match the actual length produced by `finalize_trace()`. The invariant is + /// verified by a debug assertion in `fill_trace()`. + fn estimate_trace_len(&self) -> usize { + let (controller_len, perm_len) = self.region_lengths(); + controller_len + perm_len } // HASHING METHODS @@ -76,22 +121,28 @@ impl Hasher { /// Applies a single permutation of the hash function to the provided state and records the /// execution trace of this computation. /// - /// The returned tuple contains the hasher state after the permutation and the row address of - /// the execution trace at which the permutation started. - pub fn permute(&mut self, mut state: HasherState) -> (Felt, HasherState) { + /// Returns (addr, permuted_state). + pub fn permute(&mut self, state: HasherState) -> (Felt, HasherState) { let addr = self.trace.next_row_addr(); - // perform the hash. - self.trace.append_permutation(&mut state, LINEAR_HASH, RETURN_STATE); + let permuted = self.append_controller_permutation( + LINEAR_HASH, + RETURN_STATE, + state, + ZERO, // input_node_index + ZERO, // output_node_index + ONE, // is_boundary_input = 1 (first input) + ONE, // is_boundary_output = 1 (final output) + ZERO, // input_direction_bit (non-Merkle) + ZERO, // output_direction_bit (non-Merkle) + ); - (addr, state) + (addr, permuted) } - /// Computes the hash of the control block by computing hash(h1, h2) and returns the result. - /// It also records the execution trace of this computation. + /// Computes hash(h1, h2) for a control block and returns the result. /// - /// The returned tuple also contains the row address of the execution trace at which the hash - /// computation started. + /// Returns (addr, digest). pub fn hash_control_block( &mut self, h1: Digest, @@ -99,110 +150,118 @@ impl Hasher { domain: Felt, expected_hash: Digest, ) -> (Felt, Digest) { - let addr = self.trace.next_row_addr(); - let mut state = init_state_from_words_with_domain(&h1, &h2, domain); - - if let Some((start_row, end_row)) = self.get_memoized_trace(expected_hash) { - // copy the trace of a block with same hash instead of building it again. - self.trace.copy_trace(&mut state, *start_row..*end_row); - } else { - // perform the hash. - self.trace.append_permutation(&mut state, LINEAR_HASH, RETURN_HASH); - - self.insert_to_memoized_trace_map(addr, expected_hash); - }; + if let Some(memoized) = self.replay_memoized_trace(expected_hash) { + return memoized; + } - let result = get_digest(&state); + let addr = self.trace.next_row_addr(); + let init_state = init_state_from_words_with_domain(&h1, &h2, domain); + // Single permutation: boundary on both input and output + let permuted = self.append_controller_permutation( + LINEAR_HASH, + RETURN_HASH, + init_state, + ZERO, + ZERO, // node_index: input, output + ONE, + ONE, // is_boundary: input=1, output=1 + ZERO, + ZERO, // direction_bit: non-Merkle + ); + self.insert_to_memoized_trace_map(addr, expected_hash); + let result = get_digest(&permuted); (addr, result) } - /// Computes a sequential hash of all operation batches in the list and returns the result. It - /// also records the execution trace of this computation. + /// Computes a sequential hash of all operation batches and returns the result. /// - /// The returned tuple also contains the row address of the execution trace at which the hash - /// computation started. + /// Returns (addr, digest). pub fn hash_basic_block( &mut self, op_batches: &[OpBatch], expected_hash: Digest, ) -> (Felt, Digest) { - const START: Selectors = LINEAR_HASH; - const RETURN: Selectors = RETURN_HASH; - // absorb selectors are the same as linear hash selectors, but absorb selectors are - // applied on the last row of a permutation cycle, while linear hash selectors are - // applied on the first row of a permutation cycle. - const ABSORB: Selectors = LINEAR_HASH; - // to continue linear hash we need retain the 2nd and 3rd selector flags and set the - // 1st flag to ZERO. - const CONTINUE: Selectors = [ZERO, LINEAR_HASH[1], LINEAR_HASH[2]]; + // Check memoization + if let Some(memoized) = self.replay_memoized_trace(expected_hash) { + return memoized; + } let addr = self.trace.next_row_addr(); - - // initialize the state and absorb the first operation batch into it - let mut state = init_state(op_batches[0].groups(), ZERO); - - // check if a span block with same hash has been encountered before in which case we can - // directly copy it's trace. - let (start_row, end_row, is_memoized) = - if let Some((start_row, end_row)) = self.get_memoized_trace(expected_hash) { - (*start_row, *end_row, true) - } else { - (0, 0, false) - }; + let init_state = init_state(op_batches[0].groups(), ZERO); let num_batches = op_batches.len(); - // if the span block is encountered for the first time and it's trace is not memoized, - // we need to build the trace from scratch. - if !is_memoized { - if num_batches == 1 { - // if there is only one batch to hash, we need only one permutation - self.trace.append_permutation(&mut state, START, RETURN); - } else { - // if there is more than one batch, we need to process the first, the last, and the - // middle permutations a bit differently. Specifically, selector flags for the - // permutations need to be set as follows: - // - first permutation: init linear hash on the first row, and absorb the next - // operation batch on the last row. - // - middle permutations: continue hashing on the first row, and absorb the next - // operation batch on the last row. - // - last permutation: continue hashing on the first row, and return the result on - // the last row. - self.trace.append_permutation(&mut state, START, ABSORB); - - for batch in op_batches.iter().take(num_batches - 1).skip(1) { - absorb_into_state(&mut state, batch.groups()); - - self.trace.append_permutation(&mut state, CONTINUE, ABSORB); - } - - absorb_into_state(&mut state, op_batches[num_batches - 1].groups()); - - self.trace.append_permutation(&mut state, CONTINUE, RETURN); - } + if num_batches == 1 { + // Single batch: boundary on both input and output + let permuted = self.append_controller_permutation( + LINEAR_HASH, + RETURN_HASH, + init_state, + ZERO, + ZERO, + ONE, + ONE, + ZERO, + ZERO, + ); self.insert_to_memoized_trace_map(addr, expected_hash); - } else { - self.trace.copy_trace(&mut state, start_row..end_row); + let result = get_digest(&permuted); + return (addr, result); } - let result = get_digest(&state); + // Multiple batches: + // First batch: boundary input only + let mut state = self.append_controller_permutation( + LINEAR_HASH, + RETURN_STATE, + init_state, + ZERO, + ZERO, + ONE, + ZERO, + ZERO, + ZERO, + ); + + // Middle batches: no boundary flags + for batch in op_batches.iter().take(num_batches - 1).skip(1) { + absorb_into_state(&mut state, batch.groups()); + state = self.append_controller_permutation( + LINEAR_HASH, + RETURN_STATE, + state, + ZERO, + ZERO, + ZERO, + ZERO, + ZERO, + ZERO, + ); + } + // Last batch: boundary output only + absorb_into_state(&mut state, op_batches[num_batches - 1].groups()); + let permuted = self.append_controller_permutation( + LINEAR_HASH, + RETURN_HASH, + state, + ZERO, + ZERO, + ZERO, + ONE, + ZERO, + ZERO, + ); + + self.insert_to_memoized_trace_map(addr, expected_hash); + let result = get_digest(&permuted); (addr, result) } /// Performs Merkle path verification computation and records its execution trace. /// - /// The computation consists of computing a Merkle root of the specified path for a node with - /// the specified value, located at the specified index. - /// - /// The returned tuple contains the root of the Merkle path and the row address of the - /// execution trace at which the computation started. - /// - /// # Panics - /// Panics if: - /// - The provided path does not contain any nodes. - /// - The provided index is out of range for the specified path. + /// Returns (addr, root). pub fn build_merkle_root( &mut self, value: Digest, @@ -210,26 +269,18 @@ impl Hasher { index: Felt, ) -> (Felt, Digest) { let addr = self.trace.next_row_addr(); - let root = self.verify_merkle_path( value, path, index.as_canonical_u64(), MerklePathContext::MpVerify, ); - (addr, root) } /// Performs Merkle root update computation and records its execution trace. /// - /// The computation consists of two Merkle path verifications, one for the old value of the - /// node (value before the update), and another for the new value (value after the update). - /// - /// # Panics - /// Panics if: - /// - The provided path does not contain any nodes. - /// - The provided index is out of range for the specified path. + /// Increments the mrupdate_id counter. Both MV and MU legs share the same id. pub fn update_merkle_root( &mut self, old_value: Digest, @@ -237,6 +288,9 @@ impl Hasher { path: &MerklePath, index: Felt, ) -> MerkleRootUpdate { + // Increment the mrupdate_id for this update operation + self.mrupdate_id += ONE; + let address = self.trace.next_row_addr(); let index = index.as_canonical_u64(); @@ -251,24 +305,110 @@ impl Hasher { // TRACE GENERATION // -------------------------------------------------------------------------------------------- - /// Fills the provided trace fragment with trace data from this hasher trace instance. This - /// also returns the trace builder for hasher-related auxiliary trace columns. - pub(super) fn fill_trace(self, trace: &mut TraceFragment) { - self.trace.fill_trace(trace) + /// Finalizes and fills the provided trace fragment with data from this hasher trace. + /// + /// Finalization pads the controller region and appends one 16-row permutation cycle + /// per unique input state. This is the only place where the perm segment is materialized. + pub(super) fn fill_trace(mut self, trace: &mut TraceFragment) { + if !self.finalized { + let estimated_len = self.estimate_trace_len(); + self.finalize_trace(); + debug_assert_eq!( + estimated_len, + self.trace.trace_len(), + "hasher trace length estimate ({}) diverged from actual ({})", + estimated_len, + self.trace.trace_len(), + ); + } + self.trace.fill_trace(trace); } - // HELPER METHODS + /// Finalizes the trace by padding the controller region and appending the permutation segment. + fn finalize_trace(&mut self) { + if self.finalized { + return; + } + + // Pad controller region to a multiple of HASH_CYCLE_LEN. + // Padding rows must carry the current mrupdate_id to satisfy the AIR progression + // constraint (mrupdate_id is constant on non-MV-start transitions). + self.trace.pad_to_cycle_boundary(self.mrupdate_id); + + // Append one 16-row permutation cycle per unique input state + for (key, multiplicity) in core::mem::take(&mut self.perm_request_map) { + let state = key_to_state(&key); + self.trace.append_permutation_cycle(&state, Felt::new(multiplicity)); + } + + self.finalized = true; + } + + // CORE HELPER: CONTROLLER PERMUTATION // -------------------------------------------------------------------------------------------- - /// Computes a root of the provided Merkle path in the specified context. The path is assumed - /// to be for a node with the specified value at the specified index. + /// Appends a controller (input, output) pair and records the permutation request. + /// + /// Writes two rows to the controller region: + /// - Input row: `init_selectors` (s0=1), pre-permutation `state`, `input_node_index`, + /// `is_boundary_input`, `input_direction_bit`. + /// - Output row: `final_selectors` (s0=0), post-permutation state, `output_node_index`, + /// `is_boundary_output`, `output_direction_bit`. /// - /// This also records the execution trace of the Merkle path computation. + /// Both rows carry the current `mrupdate_id` for sibling table domain separation. + /// The pre-permutation state is also recorded in `perm_request_map` for deduplication. /// - /// # Panics - /// Panics if: - /// - The provided path does not contain any nodes. - /// - The provided index is out of range for the specified path. + /// For Merkle operations, `input_node_index` is the full tree index and + /// `output_node_index` is the shifted index (input >> 1). For non-Merkle operations, + /// both should be ZERO. + /// + /// Returns the post-permutation state. + fn append_controller_permutation( + &mut self, + init_selectors: Selectors, + final_selectors: Selectors, + state: HasherState, + input_node_index: Felt, + output_node_index: Felt, + is_boundary_input: Felt, + is_boundary_output: Felt, + input_direction_bit: Felt, + output_direction_bit: Felt, + ) -> HasherState { + // Append input controller row + self.trace.append_controller_row( + init_selectors, + &state, + input_node_index, + self.mrupdate_id, + is_boundary_input, + input_direction_bit, + ); + + // Apply the permutation + let mut permuted = state; + apply_permutation(&mut permuted); + + // Append output controller row + self.trace.append_controller_row( + final_selectors, + &permuted, + output_node_index, + self.mrupdate_id, + is_boundary_output, + output_direction_bit, + ); + + // Record this permutation request for deduplication + self.record_perm_request(&state); + + permuted + } + + // MERKLE PATH HELPERS + // -------------------------------------------------------------------------------------------- + + /// Computes a root of the provided Merkle path in the specified context. fn verify_merkle_path( &mut self, value: Digest, @@ -281,91 +421,107 @@ impl Hasher { index.checked_shr(path.len() as u32).unwrap_or(0) == 0, "invalid index for the path" ); - let mut root = value; - // determine selectors for the specified context let main_selectors = context.main_selectors(); - let part_selectors = context.part_selectors(); + let depth = path.len(); - if path.len() == 1 { - // handle path of length 1 separately because pattern for init and final selectors - // is different from other cases - self.verify_mp_leg(root, path[0], &mut index, main_selectors, RETURN_HASH) - } else { - // process the first node of the path; for this node, init and final selectors are - // the same - let sibling = path[0]; - root = self.verify_mp_leg(root, sibling, &mut index, main_selectors, main_selectors); - - // process all other nodes, except for the last one - for &sibling in &path[1..path.len() - 1] { - root = - self.verify_mp_leg(root, sibling, &mut index, part_selectors, main_selectors); - } - - // process the last node - let sibling = path[path.len() - 1]; - self.verify_mp_leg(root, sibling, &mut index, part_selectors, RETURN_HASH) + let mut root = value; + + for (i, &sibling) in path.iter().enumerate() { + let is_first = i == 0; + let is_last = i == depth - 1; + + // Determine boundary flags + let is_boundary_input = if is_first { ONE } else { ZERO }; + let is_boundary_output = if is_last { ONE } else { ZERO }; + + // Direction bit for this step: LSB of the current index + let b_i = index & 1; + let state = build_merge_state(&root, &sibling, b_i); + + // Input row carries the full index; output row carries the shifted index. + let input_node_idx = Felt::new(index); + let output_node_idx = Felt::new(index >> 1); + + // Direction bit for the NEXT step (forward propagation for routing constraint). + // On the last step there is no next step, so direction_bit = 0. + let b_next = if is_last { 0 } else { (index >> 1) & 1 }; + + let final_selectors = if is_last { RETURN_HASH } else { RETURN_STATE }; + + // Append controller pair with direction bits + let permuted = self.append_controller_permutation( + main_selectors, + final_selectors, + state, + input_node_idx, + output_node_idx, + is_boundary_input, + is_boundary_output, + Felt::new(b_i), // input direction_bit: current step's bit + Felt::new(b_next), // output direction_bit: next step's bit (propagated) + ); + + root = get_digest(&permuted); + index >>= 1; } + + root } - /// Verifies a single leg of a Merkle path. + // PERMUTATION DEDUPLICATION + // -------------------------------------------------------------------------------------------- + + /// Records a permutation request for the given input state. If the same state was already + /// seen, increments the multiplicity counter. + fn record_perm_request(&mut self, state: &HasherState) { + let key = state_to_key(state); + *self.perm_request_map.entry(key).or_insert(0) += 1; + } + + // MEMOIZATION + // -------------------------------------------------------------------------------------------- + + /// Attempts to replay a memoized controller trace for the given expected hash. /// - /// This function does the following: - /// - Builds the initial hasher state based on the least significant bit of the index. - /// - Applies a permutation to this state and records the resulting trace. - /// - Returns the result of the permutation and updates the index by removing its least - /// significant bit. - fn verify_mp_leg( - &mut self, - root: Digest, - sibling: Digest, - index: &mut u64, - init_selectors: Selectors, - final_selectors: Selectors, - ) -> Digest { - // build the hasher state based on the value of the least significant bit of the index - let index_bit = *index & 1; - let mut state = build_merge_state(&root, &sibling, index_bit); - - // determine values for the node index column for this permutation. if the first selector - // of init_selectors is not ZERO (i.e., we are processing the first leg of the Merkle - // path), the index for the first row is different from the index for the other rows; - // otherwise, indexes are the same. - let (init_index, rest_index) = if init_selectors[0] == ZERO { - (Felt::new(*index >> 1), Felt::new(*index >> 1)) - } else { - (Felt::new(*index), Felt::new(*index >> 1)) + /// If a memoized trace exists, copies it, re-registers permutation requests from copied + /// input rows, and returns `Some((addr, digest))`. Otherwise returns `None`. + fn replay_memoized_trace(&mut self, expected_hash: Digest) -> Option<(Felt, Digest)> { + let (start_row, end_row) = match self.get_memoized_trace(expected_hash) { + Some(&(s, e)) => (s, e), + None => return None, }; - // apply the permutation to the state and record its trace - self.trace.append_permutation_with_index( - &mut state, - init_selectors, - final_selectors, - init_index, - rest_index, - ); - - // remove the least significant bit from the index and return hash result - *index >>= 1; + let addr = self.trace.next_row_addr(); + let mut state = [ZERO; STATE_WIDTH]; + let append_start = self.trace.trace_len(); + self.trace.copy_trace(&mut state, start_row..end_row); + let append_end = self.trace.trace_len(); + + // Ensure mrupdate_id is consistent with the current counter for all copied rows. + self.trace + .overwrite_mrupdate_id_in_range(append_start..append_end, self.mrupdate_id); + + // Re-register permutation requests from copied input rows + let input_states = self.trace.input_states_in_range(append_start..append_end); + for input_state in input_states { + self.record_perm_request(&input_state); + } - get_digest(&state) + let result = get_digest(&state); + Some((addr, result)) } - /// Checks if a trace for a program block already exists and returns the start and end rows - /// of the memoized trace. Returns None otherwise. + /// Returns the start and end rows of a memoized block trace, if it exists. fn get_memoized_trace(&self, hash: Digest) -> Option<&(usize, usize)> { - let key: [u8; 32] = hash.into(); - self.memoized_trace_map.get(&key) + self.memoized_trace_map.get(&digest_to_key(hash)) } - /// Inserts start and end rows of trace for a program block to the memoized_trace_map. + /// Records the start and end rows of a block's controller trace for memoization. fn insert_to_memoized_trace_map(&mut self, addr: Felt, hash: Digest) { - let key: [u8; 32] = hash.into(); let start_row = addr.as_canonical_u64() as usize - 1; let end_row = self.trace.next_row_addr().as_canonical_u64() as usize - 1; - self.memoized_trace_map.insert(key, (start_row, end_row)); + self.memoized_trace_map.insert(digest_to_key(hash), (start_row, end_row)); } } @@ -394,22 +550,12 @@ impl MerklePathContext { Self::MrUpdateNew => MR_UPDATE_NEW, } } - - /// Returns partial selector values for this context. Partial selector values are derived - /// from selector values by replacing the first selector with ZERO. - pub fn part_selectors(&self) -> Selectors { - let selectors = self.main_selectors(); - [ZERO, selectors[1], selectors[2]] - } } // HELPER FUNCTIONS // ================================================================================================ /// Combines two words into a hasher state for Merkle path computation. -/// -/// If index_bit = 0, the words are combined in the order (a, b), if index_bit = 1, the words are -/// combined in the order (b, a), otherwise, the function panics. #[inline(always)] fn build_merge_state(a: &Digest, b: &Digest, index_bit: u64) -> HasherState { match index_bit { @@ -419,18 +565,12 @@ fn build_merge_state(a: &Digest, b: &Digest, index_bit: u64) -> HasherState { } } -// TODO: Move these to another file. - // HASHER STATE MUTATORS // ================================================================================================ -/// Initializes hasher state with the first 8 elements to be absorbed. In accordance with the -/// Poseidon2 padding rule, the first capacity element is set with the provided padding flag, which -/// is assumed to be ZERO or ONE, depending on whether the number of elements to be absorbed is a -/// multiple of the rate or not. The remaining elements in the capacity portion of the state are set -/// to ZERO. +/// Initializes hasher state with the first 8 elements to be absorbed. /// -/// State layout: [R1, R2, CAP] where: +/// State layout: [RATE0, RATE1, CAP] where: /// - state[0..8] = init_values (rate) /// - state[8..12] = [padding_flag, ZERO, ZERO, ZERO] (capacity) #[inline(always)] @@ -439,43 +579,19 @@ pub fn init_state(init_values: &[Felt; RATE_LEN], padding_flag: Felt) -> [Felt; padding_flag == ZERO || padding_flag == ONE, "first capacity element must be 0 or 1" ); - [ - init_values[0], - init_values[1], - init_values[2], - init_values[3], - init_values[4], - init_values[5], - init_values[6], - init_values[7], - padding_flag, - ZERO, - ZERO, - ZERO, - ] + let mut state = [ZERO; STATE_WIDTH]; + state[..RATE_LEN].copy_from_slice(init_values); + state[RATE_LEN] = padding_flag; + state } -/// Initializes hasher state with the elements from the provided words. Because the length of the -/// input is a multiple of the rate, all capacity elements are initialized to zero, as specified by -/// the Poseidon2 padding rule. -/// -/// State layout: [RATE0, RATE1, CAP] where: -/// - state[0..4] = w1 (first rate word, also digest location) -/// - state[4..8] = w2 (second rate word) -/// - state[8..12] = capacity +/// Initializes hasher state from two words with zero capacity. #[inline(always)] pub fn init_state_from_words(w1: &Digest, w2: &Digest) -> [Felt; STATE_WIDTH] { init_state_from_words_with_domain(w1, w2, ZERO) } -/// Initializes hasher state with elements from the provided words. Sets the second element of the -/// capacity register to the provided domain. All other elements of the capacity register are set -/// to 0. -/// -/// State layout: [RATE0, RATE1, CAP] where: -/// - state[0..4] = w1 (first rate word, also digest location) -/// - state[4..8] = w2 (second rate word) -/// - state[8..12] = [ZERO, domain, ZERO, ZERO] (capacity) +/// Initializes hasher state from two words with a domain value in capacity[1]. #[inline(always)] pub fn init_state_from_words_with_domain( w1: &Digest, @@ -485,23 +601,13 @@ pub fn init_state_from_words_with_domain( [w1[0], w1[1], w1[2], w1[3], w2[0], w2[1], w2[2], w2[3], ZERO, domain, ZERO, ZERO] } -/// Absorbs the specified values into the provided state by overwriting the corresponding elements -/// in the rate portion of the state. -/// -/// State layout: rate is at state[0..8] +/// Absorbs values into the rate portion of the state. #[inline(always)] pub fn absorb_into_state(state: &mut [Felt; STATE_WIDTH], values: &[Felt; RATE_LEN]) { - state[0] = values[0]; - state[1] = values[1]; - state[2] = values[2]; - state[3] = values[3]; - state[4] = values[4]; - state[5] = values[5]; - state[6] = values[6]; - state[7] = values[7]; + state[..RATE_LEN].copy_from_slice(values); } -/// Returns elements representing the digest portion of the provided hasher's state. +/// Returns the digest portion of the hasher state. pub fn get_digest(state: &[Felt; STATE_WIDTH]) -> Digest { state[DIGEST_RANGE].try_into().expect("failed to get digest from hasher state") } diff --git a/processor/src/trace/chiplets/hasher/tests.rs b/processor/src/trace/chiplets/hasher/tests.rs index 7f9e8765e2..7ee92c16d1 100644 --- a/processor/src/trace/chiplets/hasher/tests.rs +++ b/processor/src/trace/chiplets/hasher/tests.rs @@ -1,692 +1,753 @@ use alloc::vec::Vec; use miden_air::trace::chiplets::hasher::{ - DIGEST_LEN, HASH_CYCLE_LEN, NUM_ROUNDS, NUM_SELECTORS, STATE_COL_RANGE, + DIRECTION_BIT_COL_IDX, HASH_CYCLE_LEN, IS_BOUNDARY_COL_IDX, MRUPDATE_ID_COL_IDX, + NODE_INDEX_COL_IDX, S_PERM_COL_IDX, STATE_COL_RANGE, TRACE_WIDTH, }; use miden_core::{ ONE, ZERO, chiplets::hasher, crypto::merkle::{MerkleTree, NodeIndex}, - mast::{ - BasicBlockNodeBuilder, DecoratorId, JoinNodeBuilder, LoopNodeBuilder, MastForest, - MastForestContributor, MastNode, MastNodeExt, SplitNodeBuilder, - }, - operations::Operation, + mast::OpBatch, }; use miden_utils_testing::rand::rand_array; use super::{ Digest, Felt, Hasher, HasherState, LINEAR_HASH, MP_VERIFY, MR_UPDATE_NEW, MR_UPDATE_OLD, - MerklePath, RETURN_HASH, RETURN_STATE, Selectors, TRACE_WIDTH, TraceFragment, + RETURN_HASH, RETURN_STATE, Selectors, TraceFragment, absorb_into_state, get_digest, init_state, init_state_from_words, }; -// LINEAR HASH TESTS +// SPONGE MODE TESTS // ================================================================================================ #[test] fn hasher_permute() { - // --- test one permutation ----------------------------------------------- - - // initialize the hasher and perform one permutation + // --- test one permutation (HPERM) --- let mut hasher = Hasher::default(); let init_state: HasherState = rand_array(); let (addr, final_state) = hasher.permute(init_state); - - // address of the permutation should be ONE (as hasher address starts at ONE) assert_eq!(ONE, addr); - // make sure the result is correct let expected_state = apply_permutation(init_state); assert_eq!(expected_state, final_state); - // build the trace - let trace = build_trace(hasher, HASH_CYCLE_LEN); + let trace = build_trace(hasher); - // make sure the trace is correct - check_selector_trace(&trace, 0, LINEAR_HASH, RETURN_STATE); - check_hasher_state_trace(&trace, 0, init_state); - assert_eq!(trace.last().unwrap(), &[ZERO; HASH_CYCLE_LEN]); + // Controller region: 2 rows (1 pair), padded to 16 rows total. + // Perm segment: 1 packed 16-row cycle (1 unique state). + // Total hasher rows: 32. + assert_eq!(trace[0].len(), 2 * HASH_CYCLE_LEN); - // --- test two permutations ---------------------------------------------- + // Row 0: input (LINEAR_HASH, is_boundary=1, s_perm=0) + check_controller_input(&trace, 0, LINEAR_HASH, &init_state, ZERO, ONE, ZERO, ZERO); + // Row 1: output (RETURN_STATE, is_boundary=1, s_perm=0) + check_controller_output(&trace, 1, RETURN_STATE, &expected_state, ZERO, ONE, ZERO); + + // Perm segment starts at row 16 (after padding) + check_perm_segment(&trace, HASH_CYCLE_LEN, &init_state, ONE); +} - // initialize the hasher and perform two permutations +#[test] +fn hasher_permute_two() { let mut hasher = Hasher::default(); let init_state1: HasherState = rand_array(); + let init_state2: HasherState = rand_array(); let (addr1, final_state1) = hasher.permute(init_state1); - - let init_state2: HasherState = rand_array(); let (addr2, final_state2) = hasher.permute(init_state2); - // make sure the returned addresses are correct (they must be `HASH_CYCLE_LEN` rows apart) + // Addresses are 2 rows apart (controller pairs) assert_eq!(ONE, addr1); - assert_eq!(Felt::new(HASH_CYCLE_LEN as u64 + 1), addr2); + assert_eq!(Felt::from_u8(3), addr2); - // make sure the results are correct - let expected_state1 = apply_permutation(init_state1); - assert_eq!(expected_state1, final_state1); + assert_eq!(apply_permutation(init_state1), final_state1); + assert_eq!(apply_permutation(init_state2), final_state2); - let expected_state2 = apply_permutation(init_state2); - assert_eq!(expected_state2, final_state2); + let trace = build_trace(hasher); - // build the trace - let trace = build_trace(hasher, 2 * HASH_CYCLE_LEN); + // Controller region: 4 rows (2 pairs), padded to 16 rows total. + // Perm segment: 2 packed 16-row cycles = 32 rows. + // Total hasher rows: 48. + assert_eq!(trace[0].len(), HASH_CYCLE_LEN + 2 * HASH_CYCLE_LEN); - // make sure the trace is correct - check_selector_trace(&trace, 0, LINEAR_HASH, RETURN_STATE); - check_selector_trace(&trace, HASH_CYCLE_LEN, LINEAR_HASH, RETURN_STATE); - check_hasher_state_trace(&trace, 0, init_state1); - check_hasher_state_trace(&trace, HASH_CYCLE_LEN, init_state2); - assert_eq!(trace.last().unwrap(), &[ZERO; 2 * HASH_CYCLE_LEN]); + // Pair 1 + check_controller_input(&trace, 0, LINEAR_HASH, &init_state1, ZERO, ONE, ZERO, ZERO); + check_controller_output(&trace, 1, RETURN_STATE, &final_state1, ZERO, ONE, ZERO); + // Pair 2 + check_controller_input(&trace, 2, LINEAR_HASH, &init_state2, ZERO, ONE, ZERO, ZERO); + check_controller_output(&trace, 3, RETURN_STATE, &final_state2, ZERO, ONE, ZERO); } -// MERKLE TREE TESTS +// TREE MODE TESTS // ================================================================================================ -// -// These tests verify trace generation, not computed results. The Merkle roots are validated -// through `check_merkle_path`. +/// Merkle tree with 2 leaves (depth 1): +/// +/// ```text +/// root +/// / \ +/// L0 L1 +/// ``` +/// +/// Verifying the path from L0 to root requires 1 controller pair. #[test] -fn hasher_build_merkle_root() { - // --- Merkle tree with 2 leaves ------------------------------------------ - - // build a Merkle tree +fn hasher_build_merkle_root_depth_1() { let leaves = init_leaves(&[1, 2]); let tree = MerkleTree::new(&leaves).unwrap(); - // initialize the hasher and perform two Merkle branch verifications let mut hasher = Hasher::default(); let path0 = tree.get_path(NodeIndex::new(1, 0).unwrap()).unwrap(); + let (_, root) = hasher.build_merkle_root(leaves[0], &path0, ZERO); - let _ = hasher.build_merkle_root(leaves[0], &path0, ZERO); - - let path1 = tree.get_path(NodeIndex::new(1, 1).unwrap()).unwrap(); - - let _ = hasher.build_merkle_root(leaves[1], &path1, ONE); - - // build the trace - let trace = build_trace(hasher, 2 * HASH_CYCLE_LEN); + assert_eq!(root, tree.root()); - // make sure the trace is correct - check_selector_trace(&trace, 0, MP_VERIFY, RETURN_HASH); - check_selector_trace(&trace, HASH_CYCLE_LEN, MP_VERIFY, RETURN_HASH); - check_hasher_state_trace(&trace, 0, init_state_from_words(&leaves[0], &path0[0])); - check_hasher_state_trace(&trace, 0, init_state_from_words(&path1[0], &leaves[1])); - let node_idx_column = trace.last().unwrap(); - assert_eq!(node_idx_column.len(), 2 * HASH_CYCLE_LEN); - assert!(node_idx_column[..HASH_CYCLE_LEN].iter().all(|&v| v == ZERO)); - assert_eq!(node_idx_column[HASH_CYCLE_LEN], ONE); - assert!(node_idx_column[HASH_CYCLE_LEN + 1..].iter().all(|&v| v == ZERO)); + let trace = build_trace(hasher); - // --- Merkle tree with 8 leaves ------------------------------------------ + // Row 0: input (MP_VERIFY, is_boundary=1, node_index=0) + let init_state = init_state_from_words(&leaves[0], &path0[0]); + check_controller_input(&trace, 0, MP_VERIFY, &init_state, ZERO, ONE, ZERO, ZERO); + // Row 1: output (RETURN_HASH, is_boundary=1, node_index=0) + check_controller_output( + &trace, + 1, + RETURN_HASH, + &apply_permutation(init_state), + ZERO, + ONE, + ZERO, + ); +} - // build a Merkle tree +/// Merkle tree with 8 leaves (depth 3): +/// +/// ```text +/// root +/// / \ +/// N(1,0) N(1,1) +/// / \ / \ +/// N20 N21 N22 N23 +/// / \ / \ / \ / \ +/// L0 L1 L2 L3 L4 L5 L6 L7 +/// ``` +/// +/// Verifying the path from L5 (node_index=5) to root requires 3 controller pairs. +/// The node_index shifts right by 1 at each level: 5 -> 2 -> 1 -> 0. +#[test] +fn hasher_build_merkle_root_depth_3() { let leaves = init_leaves(&[1, 2, 3, 4, 5, 6, 7, 8]); let tree = MerkleTree::new(&leaves).unwrap(); - // initialize the hasher and perform one Merkle branch verifications let mut hasher = Hasher::default(); let path = tree.get_path(NodeIndex::new(3, 5).unwrap()).unwrap(); - let _ = hasher.build_merkle_root(leaves[5], &path, Felt::new(5)); - - // build and check the trace for validity - let trace = build_trace(hasher, path.len() * HASH_CYCLE_LEN); - check_merkle_path(&trace, 0, leaves[5], &path, 5, MP_VERIFY); + let (_, root) = hasher.build_merkle_root(leaves[5], &path, Felt::from_u8(5)); + + assert_eq!(root, tree.root()); + + let trace = build_trace(hasher); + + // Depth 3: 3 controller pairs = 6 rows + // Index=5 (binary 101): direction bits are LSBs at each level + // Pair 0 (rows 0-1): node_index 5 -> 2, b_0=5&1=1, b_next=(5>>1)&1=0 + check_merkle_controller_pair(&trace, 0, MP_VERIFY, 5, true, false, ZERO, ONE, ZERO); + // Pair 1 (rows 2-3): node_index 2 -> 1, b_1=2&1=0, b_next=(2>>1)&1=1 + check_merkle_controller_pair(&trace, 2, MP_VERIFY, 2, false, false, ZERO, ZERO, ONE); + // Pair 2 (rows 4-5): node_index 1 -> 0, b_2=1&1=1, b_next=0 (last step) + check_merkle_controller_pair(&trace, 4, MP_VERIFY, 1, false, true, ZERO, ONE, ZERO); + + // Capacity is zero on all tree-mode input rows + for row in [0, 2, 4] { + for cap_col in 11..15 { + assert_eq!( + trace[cap_col][row], ZERO, + "capacity should be zero on tree input row {row}, col {cap_col}" + ); + } + } +} - // --- Merkle tree with 8 leaves (multiple branches) ---------------------- +#[test] +fn hasher_update_merkle_root() { + let leaves = init_leaves(&[1, 2, 3, 4]); + let tree = MerkleTree::new(&leaves).unwrap(); - // initialize the hasher and perform one Merkle branch verifications let mut hasher = Hasher::default(); + let index = 1u64; + let path = tree.get_path(NodeIndex::new(2, index).unwrap()).unwrap(); + let new_leaf: Digest = [Felt::from_u8(100), ZERO, ZERO, ZERO].into(); + + let update = + hasher.update_merkle_root(leaves[index as usize], new_leaf, &path, Felt::new(index)); - let path0 = tree.get_path(NodeIndex::new(3, 0).unwrap()).unwrap(); + assert_eq!(update.get_old_root(), tree.root()); - let _ = hasher.build_merkle_root(leaves[0], &path0, ZERO); + let trace = build_trace(hasher); - let path3 = tree.get_path(NodeIndex::new(3, 3).unwrap()).unwrap(); + // Depth 2: 2 pairs for MV (old path) + 2 pairs for MU (new path) = 8 controller rows. + // All rows share mrupdate_id=1. - let _ = hasher.build_merkle_root(leaves[3], &path3, Felt::new(3)); + // MV leg (old path): rows 0-3 + // Index=1 (binary 01): direction bits are LSBs at each level + // Pair 0 (rows 0-1): node_index 1 -> 0, b_0=1&1=1, b_next=(1>>1)&1=0 + check_merkle_controller_pair(&trace, 0, MR_UPDATE_OLD, 1, true, false, ONE, ONE, ZERO); + // Pair 1 (rows 2-3): node_index 0 -> 0, b_1=0&1=0, b_next=0 (last step) + check_merkle_controller_pair(&trace, 2, MR_UPDATE_OLD, 0, false, true, ONE, ZERO, ZERO); - let path7 = tree.get_path(NodeIndex::new(3, 7).unwrap()).unwrap(); + // MU leg (new path): rows 4-7 + // Same index, same direction bits + // Pair 0 (rows 4-5): node_index 1 -> 0, b_0=1&1=1, b_next=(1>>1)&1=0 + check_merkle_controller_pair(&trace, 4, MR_UPDATE_NEW, 1, true, false, ONE, ONE, ZERO); + // Pair 1 (rows 6-7): node_index 0 -> 0, b_1=0&1=0, b_next=0 (last step) + check_merkle_controller_pair(&trace, 6, MR_UPDATE_NEW, 0, false, true, ONE, ZERO, ZERO); +} + +// PERM SEGMENT TESTS +// ================================================================================================ + +#[test] +fn perm_segment_structure() { + // One permutation -> perm segment has 1 cycle with multiplicity 1 + let mut hasher = Hasher::default(); + let init_state: HasherState = rand_array(); + let (addr, result) = hasher.permute(init_state); - let _ = hasher.build_merkle_root(leaves[7], &path7, Felt::new(7)); + // Verify returned address and permuted state + assert_eq!(addr, ONE, "first permutation should start at address 1"); + assert_eq!(result, apply_permutation(init_state), "permuted state should match"); - // path3 again + let trace = build_trace(hasher); - let _ = hasher.build_merkle_root(leaves[3], &path3, Felt::new(3)); + // Perm segment starts at HASH_CYCLE_LEN (after padding) + let perm_start = HASH_CYCLE_LEN; - // build and check the trace for validity - let trace = build_trace(hasher, 4 * path0.len() * HASH_CYCLE_LEN); - check_merkle_path(&trace, 0, leaves[0], &path0, 0, MP_VERIFY); - check_merkle_path(&trace, path0.len() * HASH_CYCLE_LEN, leaves[3], &path3, 3, MP_VERIFY); - check_merkle_path(&trace, 2 * path0.len() * HASH_CYCLE_LEN, leaves[7], &path7, 7, MP_VERIFY); - check_merkle_path(&trace, 3 * path0.len() * HASH_CYCLE_LEN, leaves[3], &path3, 3, MP_VERIFY); + // All perm rows have s_perm=1 + for row in perm_start..perm_start + HASH_CYCLE_LEN { + assert_eq!(trace[S_PERM_COL_IDX][row], ONE, "s_perm should be 1 at row {row}"); + } + + // On perm rows, s0/s1/s2 serve as witness columns for packed internal rounds. + // They are zero on external and boundary rows, but hold S-box witnesses on + // packed-internal rows (4-10) and the mixed int+ext row (11). + // Rows 0-3, 12-15: witnesses should be zero + for offset in [0, 1, 2, 3, 12, 13, 14, 15] { + let row = perm_start + offset; + assert_eq!(trace[0][row], ZERO, "perm row {row}: s0 should be zero"); + assert_eq!(trace[1][row], ZERO, "perm row {row}: s1 should be zero"); + assert_eq!(trace[2][row], ZERO, "perm row {row}: s2 should be zero"); + } + // Rows 4-10: s0, s1, s2 hold witness values (non-zero for non-trivial states) + // Row 11: s0 holds witness, s1 and s2 are zero + let row_11 = perm_start + 11; + assert_eq!(trace[1][row_11], ZERO, "perm row {row_11}: s1 should be zero on int+ext row"); + assert_eq!(trace[2][row_11], ZERO, "perm row {row_11}: s2 should be zero on int+ext row"); + + // Multiplicity in node_index column + assert_eq!(trace[NODE_INDEX_COL_IDX][perm_start], ONE); + + // is_boundary, direction_bit, mrupdate_id all zero on perm rows + for row in perm_start..perm_start + HASH_CYCLE_LEN { + assert_eq!(trace[IS_BOUNDARY_COL_IDX][row], ZERO); + assert_eq!(trace[DIRECTION_BIT_COL_IDX][row], ZERO); + assert_eq!(trace[MRUPDATE_ID_COL_IDX][row], ZERO); + } } #[test] -fn hasher_update_merkle_root() { - // --- Merkle tree with 2 leaves ------------------------------------------ +fn perm_deduplication() { + // Two permutations with the SAME input state -> perm segment has 1 cycle with multiplicity 2 + let mut hasher = Hasher::default(); + let init_state: HasherState = rand_array(); + let (addr1, result1) = hasher.permute(init_state); + let (addr2, result2) = hasher.permute(init_state); // same state - // build a Merkle tree - let leaves = init_leaves(&[1, 2]); - let mut tree = MerkleTree::new(&leaves).unwrap(); + // Both should produce the same result but at different addresses + assert_eq!(result1, result2, "same input should produce same output"); + assert_ne!(addr1, addr2, "second call should have a different address"); - // initialize the hasher and update both leaves - let mut hasher = Hasher::default(); + let trace = build_trace(hasher); - let path0 = tree.get_path(NodeIndex::new(1, 0).unwrap()).unwrap(); - let new_leaf0 = init_leaf(3); + // Controller: 4 rows (2 pairs), padded to 16. Perm: 1 cycle = 16 rows (deduped). Total: 32. + assert_eq!(trace[0].len(), 2 * HASH_CYCLE_LEN); - hasher.update_merkle_root(leaves[0], new_leaf0, &path0, ZERO); - tree.update_leaf(0, new_leaf0).unwrap(); + // Perm segment: multiplicity should be 2 + let perm_start = HASH_CYCLE_LEN; + assert_eq!(trace[NODE_INDEX_COL_IDX][perm_start], Felt::from_u8(2)); +} - let path1 = tree.get_path(NodeIndex::new(1, 1).unwrap()).unwrap(); - let new_leaf1 = init_leaf(4); +// MEMOIZATION TESTS +// ================================================================================================ - hasher.update_merkle_root(leaves[1], new_leaf1, &path1, ONE); - tree.update_leaf(1, new_leaf1).unwrap(); +#[test] +fn hash_memoization_control_blocks() { + let h1: Digest = rand_array::().into(); + let h2: Digest = rand_array::().into(); + let domain = Felt::from_u8(7); // arbitrary domain - // build the trace - let trace = build_trace(hasher, 4 * HASH_CYCLE_LEN); + // Compute the expected hash + let state = super::init_state_from_words_with_domain(&h1, &h2, domain); + let permuted = apply_permutation(state); + let expected_hash: Digest = super::get_digest(&permuted); - // make sure the trace is correct - check_selector_trace(&trace, 0, MR_UPDATE_OLD, RETURN_HASH); - check_selector_trace(&trace, HASH_CYCLE_LEN, MR_UPDATE_NEW, RETURN_HASH); - check_selector_trace(&trace, 2 * HASH_CYCLE_LEN, MR_UPDATE_OLD, RETURN_HASH); - check_selector_trace(&trace, 3 * HASH_CYCLE_LEN, MR_UPDATE_NEW, RETURN_HASH); - check_hasher_state_trace(&trace, 0, init_state_from_words(&leaves[0], &path0[0])); - check_hasher_state_trace(&trace, HASH_CYCLE_LEN, init_state_from_words(&new_leaf0, &path0[0])); - check_hasher_state_trace( - &trace, - 2 * HASH_CYCLE_LEN, - init_state_from_words(&path1[0], &leaves[1]), - ); - check_hasher_state_trace( - &trace, - 3 * HASH_CYCLE_LEN, - init_state_from_words(&path1[0], &new_leaf1), - ); - let node_idx_column = trace.last().unwrap(); - assert_eq!(node_idx_column.len(), 4 * HASH_CYCLE_LEN); - assert!(node_idx_column[..2 * HASH_CYCLE_LEN].iter().all(|&v| v == ZERO)); - assert_eq!(node_idx_column[2 * HASH_CYCLE_LEN], ONE); - assert!( - node_idx_column[2 * HASH_CYCLE_LEN + 1..3 * HASH_CYCLE_LEN] - .iter() - .all(|&v| v == ZERO) - ); - assert_eq!(node_idx_column[3 * HASH_CYCLE_LEN], ONE); - assert!(node_idx_column[3 * HASH_CYCLE_LEN + 1..].iter().all(|&v| v == ZERO)); + let mut hasher = Hasher::default(); - // --- Merkle tree with 8 leaves ------------------------------------------ + let (addr1, digest1) = hasher.hash_control_block(h1, h2, domain, expected_hash); + let (addr2, digest2) = hasher.hash_control_block(h1, h2, domain, expected_hash); - // build a Merkle tree - let leaves = init_leaves(&[1, 2, 3, 4, 5, 6, 7, 8]); - let mut tree = MerkleTree::new(&leaves).unwrap(); + assert_eq!(digest1, digest2); + assert_eq!(digest1, expected_hash); + // Second call uses memoized trace at a different address + assert_ne!(addr1, addr2); - // initialize the hasher - let mut hasher = Hasher::default(); + let trace = build_trace(hasher); - let path3 = tree.get_path(NodeIndex::new(3, 3).unwrap()).unwrap(); - let new_leaf3 = init_leaf(23); - - hasher.update_merkle_root(leaves[3], new_leaf3, &path3, Felt::new(3)); - tree.update_leaf(3, new_leaf3).unwrap(); - - let path6 = tree.get_path(NodeIndex::new(3, 6).unwrap()).unwrap(); - let new_leaf6 = init_leaf(25); - hasher.update_merkle_root(leaves[6], new_leaf6, &path6, Felt::new(6)); - tree.update_leaf(6, new_leaf6).unwrap(); - - // update leaf 3 again - let path3_2 = tree.get_path(NodeIndex::new(3, 3).unwrap()).unwrap(); - let new_leaf3_2 = init_leaf(27); - hasher.update_merkle_root(new_leaf3, new_leaf3_2, &path3_2, Felt::new(3)); - tree.update_leaf(3, new_leaf3_2).unwrap(); - assert_ne!(path3, path3_2); - - // build and check the trace for validity - let leg_rows = path3.len() * HASH_CYCLE_LEN; - let trace = build_trace(hasher, 6 * leg_rows); - check_merkle_path(&trace, 0, leaves[3], &path3, 3, MR_UPDATE_OLD); - check_merkle_path(&trace, leg_rows, new_leaf3, &path3, 3, MR_UPDATE_NEW); - check_merkle_path(&trace, 2 * leg_rows, leaves[6], &path6, 6, MR_UPDATE_OLD); - check_merkle_path(&trace, 3 * leg_rows, new_leaf6, &path6, 6, MR_UPDATE_NEW); - check_merkle_path(&trace, 4 * leg_rows, new_leaf3, &path3_2, 3, MR_UPDATE_OLD); - check_merkle_path(&trace, 5 * leg_rows, new_leaf3_2, &path3_2, 3, MR_UPDATE_NEW); + // Both calls produce controller pairs (4 rows), but share perm requests. + // Controller: 4 rows, padded to 16. Perm: 1 cycle (deduped). Total: 32. + assert_eq!(trace[0].len(), 2 * HASH_CYCLE_LEN); + + // Perm segment has multiplicity 2 (two requests for same state) + let perm_start = HASH_CYCLE_LEN; + assert_eq!(trace[NODE_INDEX_COL_IDX][perm_start], Felt::from_u8(2)); } -// MEMOIZATION TESTS +// BASIC BLOCK MEMOIZATION TESTS // ================================================================================================ #[test] -fn hash_memoization_control_blocks() { - // --- Join block with 2 same split blocks as children, having the same hasher execution trace. - // Join - // / \ - // / \ - // / \ - // Split1 Split2 (memoized) +fn hash_memoization_basic_blocks_single_batch() { + // Test that hashing the same single-batch basic block twice uses memoization: + // the second call copies the controller rows and reuses the perm cycle (multiplicity 2). + let mut hasher = Hasher::default(); + + let batches = make_single_batch(); + let expected_hash = compute_basic_block_hash(&batches); - let mut mast_forest = MastForest::new(); + let (addr1, digest1) = hasher.hash_basic_block(&batches, expected_hash); + let (addr2, digest2) = hasher.hash_basic_block(&batches, expected_hash); - let t_branch_id = BasicBlockNodeBuilder::new(vec![Operation::Push(ZERO)], Vec::new()) - .add_to_forest(&mut mast_forest) - .unwrap(); - let t_branch = mast_forest[t_branch_id].clone(); + assert_eq!(digest1, digest2, "memoized digest should match original"); + assert_eq!(digest1, expected_hash); + assert_ne!(addr1, addr2, "memoized call should have a different address"); - let f_branch_id = BasicBlockNodeBuilder::new(vec![Operation::Push(ONE)], Vec::new()) - .add_to_forest(&mut mast_forest) - .unwrap(); - let f_branch = mast_forest[f_branch_id].clone(); + let trace = build_trace(hasher); - let split1_id = SplitNodeBuilder::new([t_branch_id, f_branch_id]) - .add_to_forest(&mut mast_forest) - .unwrap(); - let split1 = mast_forest[split1_id].clone(); + // Single batch -> 1 controller pair per call = 4 rows total, padded to 16. + // Perm: 1 unique state with multiplicity 2 = 16 rows. Total: 32. + assert_eq!(trace[0].len(), 2 * HASH_CYCLE_LEN); - let split2_id = SplitNodeBuilder::new([t_branch_id, f_branch_id]) - .add_to_forest(&mut mast_forest) - .unwrap(); - let split2 = mast_forest[split2_id].clone(); + // Verify first call: rows 0-1 + check_controller_input( + &trace, + 0, + LINEAR_HASH, + &init_state(batches[0].groups(), ZERO), + ZERO, + ONE, + ZERO, + ZERO, + ); + check_controller_output( + &trace, + 1, + RETURN_HASH, + &apply_permutation(init_state(batches[0].groups(), ZERO)), + ZERO, + ONE, + ZERO, + ); - let _join_node_id = JoinNodeBuilder::new([split1_id, split2_id]) - .add_to_forest(&mut mast_forest) - .unwrap(); - let join_node = mast_forest[_join_node_id].clone(); + // Verify memoized call: rows 2-3 should match rows 0-1 in selectors and state + check_memoized_trace(&trace, 0..2, 2..4); - let mut hasher = Hasher::default(); - let h1: [Felt; DIGEST_LEN] = split1 - .digest() - .as_elements() - .try_into() - .expect("Could not convert slice to array"); - let h2: [Felt; DIGEST_LEN] = split2 - .digest() - .as_elements() - .try_into() - .expect("Could not convert slice to array"); - - let expected_hash = join_node.digest(); - - // builds the trace of the join block. - let (_, final_state) = - hasher.hash_control_block(h1.into(), h2.into(), join_node.domain(), expected_hash); - - // make sure the hash of the final state is the same as the expected hash. - assert_eq!(final_state, expected_hash); - - let h1: [Felt; DIGEST_LEN] = t_branch - .digest() - .as_elements() - .try_into() - .expect("Could not convert slice to array"); - let h2: [Felt; DIGEST_LEN] = f_branch - .digest() - .as_elements() - .try_into() - .expect("Could not convert slice to array"); - - let expected_hash = split1.digest(); - - // builds the hash execution trace of the first split block from scratch. - let (addr, final_state) = - hasher.hash_control_block(h1.into(), h2.into(), split1.domain(), expected_hash); - - let first_block_final_state = final_state; - - // make sure the hash of the final state of the first split block is the same as the expected - // hash. - assert_eq!(final_state, expected_hash); - - let start_row = addr.as_canonical_u64() as usize - 1; - let end_row = hasher.trace_len() - 1; - - let h1: [Felt; DIGEST_LEN] = t_branch - .digest() - .as_elements() - .try_into() - .expect("Could not convert slice to array"); - let h2: [Felt; DIGEST_LEN] = f_branch - .digest() - .as_elements() - .try_into() - .expect("Could not convert slice to array"); - let expected_hash = split2.digest(); - - // builds the hash execution trace of the second split block by copying it from the trace of - // the first split block. - let (addr, final_state) = - hasher.hash_control_block(h1.into(), h2.into(), split2.domain(), expected_hash); - - // make sure the hash of the final state of the second split block is the same as the expected - // hash. - assert_eq!(final_state, expected_hash); - // make sure the hash of the first and second split blocks is the same. - assert_eq!(first_block_final_state, final_state); - - let copied_start_row = addr.as_canonical_u64() as usize - 1; - let copied_end_row = hasher.trace_len() - 1; - - let trace = build_trace(hasher, copied_end_row + 1); - - // check the row address at which memoized block starts. - let hash_cycle_len: u64 = HASH_CYCLE_LEN.try_into().expect("Could not convert usize to u64"); - assert_eq!(Felt::new(hash_cycle_len * 2 + 1), addr); - // check the trace length of the final trace. - assert_eq!(trace.last().unwrap(), &[ZERO; HASH_CYCLE_LEN * 3]); - - // check correct copy of the memoized trace. - check_memoized_trace(&trace, start_row, end_row, copied_start_row, copied_end_row); + // Perm segment: multiplicity should be 2 (original + memoized) + let perm_start = HASH_CYCLE_LEN; + assert_eq!(trace[NODE_INDEX_COL_IDX][perm_start], Felt::from_u8(2)); } #[test] -fn hash_memoization_basic_blocks() { - // --- basic block with 1 batch ---------------------------------------------------------------- - hash_memoization_basic_blocks_check( - vec![Operation::Push(Felt::new(10)), Operation::Drop], - Vec::new(), - ); +fn hash_memoization_basic_blocks_multi_batch() { + // Test memoization of a multi-batch basic block (3 batches). + // The second call should copy all 3 controller pairs and re-register all 3 perm requests. + let mut hasher = Hasher::default(); - // --- basic block with multiple batches ------------------------------------------------------- - let ops = vec![ - Operation::Push(ONE), - Operation::Push(Felt::new(2)), - Operation::Push(Felt::new(3)), - Operation::Push(Felt::new(4)), - Operation::Push(Felt::new(5)), - Operation::Push(Felt::new(6)), - Operation::Push(Felt::new(7)), - Operation::Push(Felt::new(8)), - Operation::Push(Felt::new(9)), - Operation::Push(Felt::new(10)), - Operation::Push(Felt::new(11)), - Operation::Push(Felt::new(12)), - Operation::Push(Felt::new(13)), - Operation::Push(Felt::new(14)), - Operation::Push(Felt::new(15)), - Operation::Push(Felt::new(16)), - Operation::Push(Felt::new(17)), - Operation::Push(Felt::new(18)), - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - ]; - - hash_memoization_basic_blocks_check(ops, Vec::new()); + let batches = make_multi_batch(3); + let expected_hash = compute_basic_block_hash(&batches); + + let (addr1, digest1) = hasher.hash_basic_block(&batches, expected_hash); + let (addr2, digest2) = hasher.hash_basic_block(&batches, expected_hash); + + assert_eq!(digest1, digest2); + assert_eq!(digest1, expected_hash); + assert_ne!(addr1, addr2); + + let trace = build_trace(hasher); + + // 3 batches -> 3 controller pairs per call = 12 rows total, padded to 16. + // 3 unique perm states (each with multiplicity 2) = 3 * 16 = 48 rows. + // Total: 16 + 48 = 64 rows. + assert_eq!(trace[0].len(), HASH_CYCLE_LEN + 3 * HASH_CYCLE_LEN); + + // Verify first call: rows 0-5 (3 pairs) + // Row 0: first batch input, is_boundary=1 (start) + assert_eq!(trace[IS_BOUNDARY_COL_IDX][0], ONE); + assert_eq!(trace[DIRECTION_BIT_COL_IDX][0], ZERO); + // Row 1: first batch output, is_boundary=0 (not final) + assert_eq!(trace[IS_BOUNDARY_COL_IDX][1], ZERO); + assert_eq!(trace[DIRECTION_BIT_COL_IDX][1], ZERO); + // Row 2: second batch input, is_boundary=0 (continuation) + assert_eq!(trace[IS_BOUNDARY_COL_IDX][2], ZERO); + // Row 4: third batch input, is_boundary=0 (continuation) + assert_eq!(trace[IS_BOUNDARY_COL_IDX][4], ZERO); + // Row 5: third batch output, is_boundary=1 (final) + assert_eq!(trace[IS_BOUNDARY_COL_IDX][5], ONE); + + // Verify memoized call: rows 6-11 should match rows 0-5 + check_memoized_trace(&trace, 0..6, 6..12); + + // Perm segment: each of the 3 unique states should have multiplicity 2 + let perm_start = HASH_CYCLE_LEN; + for i in 0..3 { + let cycle_start = perm_start + i * HASH_CYCLE_LEN; + assert_eq!( + trace[NODE_INDEX_COL_IDX][cycle_start], + Felt::from_u8(2), + "perm cycle {i} should have multiplicity 2" + ); + } } -fn hash_memoization_basic_blocks_check( - operations: Vec, - decorators: Vec<(usize, DecoratorId)>, -) { - // Join block with a join and basic block as children. The child of the first join - // child node is the same as the basic block child of root join node. Here the hash execution - // trace of the second basic block is built by copying the trace built for the first same - // basic block. +#[test] +fn hash_memoization_basic_blocks_check() { + // Tree structure: + // // Join1 // / \ - // / \ - // / \ - // Join2 BB2 (memoized) - // / \ - // / \ - // / \ - // BB1 Loop - - let mut mast_forest = MastForest::new(); - - let basic_block_1_id = BasicBlockNodeBuilder::new(operations.clone(), decorators.clone()) - .add_to_forest(&mut mast_forest) - .unwrap(); - let basic_block_1 = mast_forest[basic_block_1_id].clone(); - - let loop_body_id = - BasicBlockNodeBuilder::new(vec![Operation::Pad, Operation::Eq, Operation::Not], Vec::new()) - .add_to_forest(&mut mast_forest) - .unwrap(); - - let loop_block_id = LoopNodeBuilder::new(loop_body_id).add_to_forest(&mut mast_forest).unwrap(); - let loop_block = mast_forest[loop_block_id].clone(); - - let join2_block_id = JoinNodeBuilder::new([basic_block_1_id, loop_block_id]) - .add_to_forest(&mut mast_forest) - .unwrap(); - let join2_block = mast_forest[join2_block_id].clone(); - - let basic_block_2_id = BasicBlockNodeBuilder::new(operations.clone(), decorators.clone()) - .add_to_forest(&mut mast_forest) - .unwrap(); - let basic_block_2 = mast_forest[basic_block_2_id].clone(); - - let join1_block_id = JoinNodeBuilder::new([join2_block_id, basic_block_2_id]) - .add_to_forest(&mut mast_forest) - .unwrap(); - let join1_block = mast_forest[join1_block_id].clone(); - + // Join2 BB2 (memoized from BB1) + // / \ + // BB1 Loop_body + // + // BB1 and BB2 are identical 2-batch basic blocks. When BB2 is hashed, + // it should be memoized from BB1's trace, so BB1's perm states get multiplicity 2. + // + // Expected controller row layout: + // Rows 0-3: BB1 (2 batches = 2 pairs) + // Rows 4-5: Loop body (1 batch = 1 pair) + // Rows 6-7: Join2 (1 pair) + // Rows 8-11: BB2 memoized (2 pairs, copied from BB1) + // Rows 12-13: Join1 (1 pair) let mut hasher = Hasher::default(); - let h1: [Felt; DIGEST_LEN] = join2_block - .digest() - .as_elements() - .try_into() - .expect("Could not convert slice to array"); - let h2: [Felt; DIGEST_LEN] = basic_block_2 - .digest() - .as_elements() - .try_into() - .expect("Could not convert slice to array"); - let expected_hash = join1_block.digest(); - - // builds the trace of the Join1 block. - let (_, final_state) = - hasher.hash_control_block(h1.into(), h2.into(), join1_block.domain(), expected_hash); - - // make sure the hash of the final state of Join1 is the same as the expected hash. - assert_eq!(final_state, expected_hash); - - let h1: [Felt; DIGEST_LEN] = basic_block_1 - .digest() - .as_elements() - .try_into() - .expect("Could not convert slice to array"); - let h2: [Felt; DIGEST_LEN] = loop_block - .digest() - .as_elements() - .try_into() - .expect("Could not convert slice to array"); - let expected_hash = join2_block.digest(); - - let (_, final_state) = - hasher.hash_control_block(h1.into(), h2.into(), join2_block.domain(), expected_hash); - - // make sure the hash of the final state of Join2 is the same as the expected hash. - assert_eq!(final_state, expected_hash); - - let basic_block_1_val = if let MastNode::Block(basic_block) = basic_block_1.clone() { - basic_block - } else { - unreachable!() - }; - - // builds the hash execution trace of the first basic block from scratch. - let (addr, final_state) = - hasher.hash_basic_block(basic_block_1_val.op_batches(), basic_block_1.digest()); - - let first_basic_block_final_state = final_state; - - // make sure the hash of the final state of basic block 1 is the same as the expected hash. - let expected_hash = basic_block_1.digest(); - assert_eq!(final_state, expected_hash); - - let start_row = addr.as_canonical_u64() as usize - 1; - let end_row = hasher.trace_len() - 1; - - let basic_block_2_val = if let MastNode::Block(basic_block) = basic_block_2.clone() { - basic_block - } else { - unreachable!() - }; - - // builds the hash execution trace of the second basic block by copying the sections of the - // trace corresponding to the first basic block with the same hash. - let (addr, final_state) = - hasher.hash_basic_block(basic_block_2_val.op_batches(), basic_block_2.digest()); - - let _num_batches = basic_block_2_val.op_batches().len(); - - let expected_hash = basic_block_2.digest(); - // make sure the hash of the final state of basic block 2 is the same as the expected hash. - assert_eq!(final_state, expected_hash); - - // make sure the hash of the first and second basic blocks is the same. - assert_eq!(first_basic_block_final_state, final_state); - - let copied_start_row = addr.as_canonical_u64() as usize - 1; - let copied_end_row = hasher.trace_len() - 1; - - let trace = build_trace(hasher, copied_end_row + 1); - - // check correct copy after memoization - check_memoized_trace(&trace, start_row, end_row, copied_start_row, copied_end_row); + + let batches = make_multi_batch(2); + let bb_hash = compute_basic_block_hash(&batches); + + // Hash a loop body (different block) to interleave + let loop_body_batches = make_single_batch(); + let loop_body_hash = compute_basic_block_hash(&loop_body_batches); + + // BB1: 2-batch basic block + let (bb1_addr, bb1_digest) = hasher.hash_basic_block(&batches, bb_hash); + assert_eq!(bb1_digest, bb_hash); + + // Loop body: different block in between + let (_loop_addr, loop_digest) = hasher.hash_basic_block(&loop_body_batches, loop_body_hash); + assert_eq!(loop_digest, loop_body_hash); + + // Hash Join2 = hash(BB1, Loop) + let join2_state = + super::init_state_from_words_with_domain(&bb1_digest, &loop_digest, Felt::from_u8(7)); + let join2_permuted = apply_permutation(join2_state); + let join2_hash = get_digest(&join2_permuted); + let (_join2_addr, join2_digest) = + hasher.hash_control_block(bb1_digest, loop_digest, Felt::from_u8(7), join2_hash); + assert_eq!(join2_digest, join2_hash); + + // BB2: identical to BB1 -- should be memoized + let (bb2_addr, bb2_digest) = hasher.hash_basic_block(&batches, bb_hash); + assert_eq!(bb2_digest, bb_hash); + assert_ne!(bb1_addr, bb2_addr, "memoized BB2 should have a different address"); + + // Hash Join1 = hash(Join2, BB2) + let join1_state = + super::init_state_from_words_with_domain(&join2_digest, &bb2_digest, Felt::from_u8(7)); + let join1_permuted = apply_permutation(join1_state); + let join1_hash = get_digest(&join1_permuted); + let (_join1_addr, join1_digest) = + hasher.hash_control_block(join2_digest, bb2_digest, Felt::from_u8(7), join1_hash); + assert_eq!(join1_digest, join1_hash); + + let trace = build_trace(hasher); + + // Verify BB2's controller rows (the memoized copy) match BB1's original rows. + // BB1 is at rows 0..4 (2 batches = 2 pairs = 4 rows). + // Loop body is at rows 4..6 (1 batch = 1 pair = 2 rows). + // Join2 is at rows 6..8 (1 pair). + // BB2 (memoized) is at rows 8..12. + // Join1 is at rows 12..14. + let bb1_start = bb1_addr.as_canonical_u64() as usize - 1; + let bb2_start = bb2_addr.as_canonical_u64() as usize - 1; + check_memoized_trace(&trace, bb1_start..bb1_start + 4, bb2_start..bb2_start + 4); + + // Verify perm multiplicities: BB1's 2 perm states should each have multiplicity 2 + // (original from BB1 + memoized from BB2). The loop body's perm state and the two + // join perm states should each have multiplicity 1. + let controller_rows: usize = 14; // 4 + 2 + 2 + 4 + 2 + let controller_padded_len = controller_rows.next_multiple_of(HASH_CYCLE_LEN); + + // Count unique perm states: BB1 has 2 unique states (2 batches), loop body has 1, + // join2 has 1, join1 has 1 = 5 unique states total (unless some coincide, which is + // astronomically unlikely with random groups). + // BB2 is memoized so its 2 states are the same as BB1's. + // Total perm cycles: at most 5 (could be less if join states happen to match). + + // Verify that the perm segment has correct multiplicities + let perm_start = controller_padded_len; + let total_len = trace[0].len(); + let num_perm_cycles = (total_len - perm_start) / HASH_CYCLE_LEN; + + // We should have at least 5 perm cycles (2 from BB + 1 loop + 2 joins) + assert!(num_perm_cycles >= 5, "expected at least 5 perm cycles, got {num_perm_cycles}"); + + // Count how many perm cycles have multiplicity 2 vs 1 + let mut mult_2_count = 0; + let mut mult_1_count = 0; + for i in 0..num_perm_cycles { + let cycle_start = perm_start + i * HASH_CYCLE_LEN; + let mult = trace[NODE_INDEX_COL_IDX][cycle_start]; + if mult == Felt::from_u8(2) { + mult_2_count += 1; + } else if mult == ONE { + mult_1_count += 1; + } + } + + // BB1's 2 perm states should have multiplicity 2 (from BB1 + BB2 memoized) + assert_eq!(mult_2_count, 2, "expected 2 perm cycles with multiplicity 2 (BB1's states)"); + // The remaining states (loop body, join2, join1) should have multiplicity 1 + assert_eq!(mult_1_count, 3, "expected 3 perm cycles with multiplicity 1"); } // HELPER FUNCTIONS // ================================================================================================ -/// Builds an execution trace for the provided hasher. The trace must have the number of rows -/// specified by num_rows. -fn build_trace(hasher: Hasher, num_rows: usize) -> Vec> { - let mut trace = (0..TRACE_WIDTH).map(|_| vec![ZERO; num_rows]).collect::>(); +/// Builds the full hasher trace (controller + perm segment). +fn build_trace(hasher: Hasher) -> Vec> { + let trace_len = hasher.trace_len(); + let mut trace = (0..TRACE_WIDTH).map(|_| vec![ZERO; trace_len]).collect::>(); let mut fragment = TraceFragment::trace_to_fragment(&mut trace); hasher.fill_trace(&mut fragment); trace } -/// Makes sure that the provided trace is consistent with verifying the specified Merkle path -/// in the context defined by init_selectors. -fn check_merkle_path( +/// Checks a controller input row. +fn check_controller_input( trace: &[Vec], - row_idx: usize, - leaf: Digest, - path: &MerklePath, - node_index: u64, - init_selectors: Selectors, + row: usize, + selectors: Selectors, + state: &HasherState, + node_index: Felt, + is_boundary: Felt, + mrupdate_id: Felt, + direction_bit: Felt, ) { - // make sure selectors were set correctly - let mid_selectors = [ZERO, init_selectors[1], init_selectors[2]]; - check_selector_trace(trace, row_idx, init_selectors, init_selectors); - for i in 1..path.len() - 1 { - check_selector_trace(trace, row_idx + i * HASH_CYCLE_LEN, mid_selectors, init_selectors); - } - let last_perm_row_addr = row_idx + (path.len() - 1) * HASH_CYCLE_LEN; - check_selector_trace(trace, last_perm_row_addr, mid_selectors, RETURN_HASH); - - // make sure hasher states are correct - let mut root = leaf; - for (i, &node) in path.iter().enumerate() { - let index_bit = (node_index >> i) & 1; - let old_root = root; - let init_state = if index_bit == 0 { - root = hasher::merge(&[root, node]); - init_state_from_words(&old_root, &node) - } else { - root = hasher::merge(&[node, root]); - init_state_from_words(&node, &old_root) - }; - check_hasher_state_trace(trace, row_idx + i * HASH_CYCLE_LEN, init_state); - } - - // make sure node index is set correctly - let node_idx_column = trace.last().unwrap(); - assert_eq!(Felt::new(node_index), node_idx_column[row_idx]); - let mut node_index = node_index >> 1; - for i in 1..HASH_CYCLE_LEN { - assert_eq!(Felt::new(node_index), node_idx_column[row_idx + i]) + // Selectors + assert_eq!(trace[0][row], selectors[0], "s0 at row {row}"); + assert_eq!(trace[1][row], selectors[1], "s1 at row {row}"); + assert_eq!(trace[2][row], selectors[2], "s2 at row {row}"); + + // State + for (i, &val) in state.iter().enumerate() { + assert_eq!(trace[STATE_COL_RANGE.start + i][row], val, "state[{i}] at row {row}"); } - for i in 1..path.len() { - node_index >>= 1; - for j in 0..HASH_CYCLE_LEN { - assert_eq!(Felt::new(node_index), node_idx_column[row_idx + i * HASH_CYCLE_LEN + j]) - } - } + // Control columns + assert_eq!(trace[NODE_INDEX_COL_IDX][row], node_index, "node_index at row {row}"); + assert_eq!(trace[IS_BOUNDARY_COL_IDX][row], is_boundary, "is_boundary at row {row}"); + assert_eq!(trace[DIRECTION_BIT_COL_IDX][row], direction_bit, "direction_bit at row {row}"); + assert_eq!(trace[S_PERM_COL_IDX][row], ZERO, "s_perm should be 0 on controller row {row}"); + assert_eq!(trace[MRUPDATE_ID_COL_IDX][row], mrupdate_id, "mrupdate_id at row {row}"); } -/// Makes sure that selector columns (columns 0, 1, 2) are valid for a `HASH_CYCLE_LEN`-row cycle -/// starting with row_idx. -fn check_selector_trace( +/// Checks a controller output row. +fn check_controller_output( trace: &[Vec], - row_idx: usize, - init_selectors: Selectors, - final_selectors: Selectors, + row: usize, + selectors: Selectors, + state: &HasherState, + node_index: Felt, + is_boundary: Felt, + direction_bit: Felt, ) { - let trace = &trace[0..3]; - let mid_selectors = [ZERO, init_selectors[1], init_selectors[2]]; + assert_eq!(trace[0][row], selectors[0], "s0 at row {row}"); + assert_eq!(trace[1][row], selectors[1], "s1 at row {row}"); + assert_eq!(trace[2][row], selectors[2], "s2 at row {row}"); - assert_row_equal(trace, row_idx, &init_selectors); - for i in 0..NUM_ROUNDS - 1 { - assert_row_equal(trace, row_idx + i + 1, &mid_selectors); + for (i, &val) in state.iter().enumerate() { + assert_eq!(trace[STATE_COL_RANGE.start + i][row], val, "state[{i}] at row {row}"); } - assert_row_equal(trace, row_idx + NUM_ROUNDS, &final_selectors); + + assert_eq!(trace[NODE_INDEX_COL_IDX][row], node_index, "node_index at row {row}"); + assert_eq!(trace[IS_BOUNDARY_COL_IDX][row], is_boundary, "is_boundary at row {row}"); + assert_eq!(trace[DIRECTION_BIT_COL_IDX][row], direction_bit, "direction_bit at row {row}"); + assert_eq!(trace[S_PERM_COL_IDX][row], ZERO, "s_perm should be 0 on controller row {row}"); } -/// Makes sure hasher state columns (columns 4 through 15) are valid for a `HASH_CYCLE_LEN`-row -/// cycle starting with row_idx. -fn check_hasher_state_trace(trace: &[Vec], row_idx: usize, init_state: HasherState) { - let trace = &trace[STATE_COL_RANGE]; - let mut state = init_state; +/// Checks both the input and output rows of a Merkle controller pair. +/// +/// A Merkle pair consists of: +/// - Input row (`input_row`): has `input_selectors`, `node_index`, `is_boundary_input` flag. +/// - Output row (`input_row + 1`): has `node_index >> 1`, `is_boundary_output` flag. +/// +/// Both rows must have `s_perm=0` and the given `mrupdate_id`. +fn check_merkle_controller_pair( + trace: &[Vec], + input_row: usize, + input_selectors: Selectors, + node_index: u64, + is_boundary_input: bool, + is_boundary_output: bool, + mrupdate_id: Felt, + input_direction_bit: Felt, + output_direction_bit: Felt, +) { + let output_row = input_row + 1; + let is_boundary_input_felt = if is_boundary_input { ONE } else { ZERO }; + let is_boundary_output_felt = if is_boundary_output { ONE } else { ZERO }; + + // Input row: selectors, node_index, is_boundary, direction_bit, s_perm=0 + assert_eq!(trace[0][input_row], input_selectors[0], "s0 at input row {input_row}"); + assert_eq!(trace[1][input_row], input_selectors[1], "s1 at input row {input_row}"); + assert_eq!(trace[2][input_row], input_selectors[2], "s2 at input row {input_row}"); + assert_eq!( + trace[NODE_INDEX_COL_IDX][input_row], + Felt::new(node_index), + "node_index at input row {input_row}" + ); + assert_eq!( + trace[IS_BOUNDARY_COL_IDX][input_row], is_boundary_input_felt, + "is_boundary at input row {input_row}" + ); + assert_eq!( + trace[DIRECTION_BIT_COL_IDX][input_row], input_direction_bit, + "direction_bit at input row {input_row}" + ); + assert_eq!(trace[S_PERM_COL_IDX][input_row], ZERO, "s_perm at input row {input_row}"); + assert_eq!( + trace[MRUPDATE_ID_COL_IDX][input_row], mrupdate_id, + "mrupdate_id at input row {input_row}" + ); - assert_row_equal(trace, row_idx, &state); - for i in 0..NUM_ROUNDS { - hasher::apply_round(&mut state, i); - assert_row_equal(trace, row_idx + i + 1, &state); - } + // Output row: node_index >> 1, is_boundary, direction_bit, s_perm=0 + assert_eq!( + trace[NODE_INDEX_COL_IDX][output_row], + Felt::new(node_index >> 1), + "node_index at output row {output_row}" + ); + assert_eq!( + trace[IS_BOUNDARY_COL_IDX][output_row], is_boundary_output_felt, + "is_boundary at output row {output_row}" + ); + assert_eq!( + trace[DIRECTION_BIT_COL_IDX][output_row], output_direction_bit, + "direction_bit at output row {output_row}" + ); + assert_eq!(trace[S_PERM_COL_IDX][output_row], ZERO, "s_perm at output row {output_row}"); + assert_eq!( + trace[MRUPDATE_ID_COL_IDX][output_row], mrupdate_id, + "mrupdate_id at output row {output_row}" + ); } -fn check_memoized_trace( +/// Checks a 16-row permutation cycle in the perm segment. +/// +/// The packed schedule records the PRE-transition state on each row: +/// - Row 0: initial state +/// - Row 1: state after init+ext1 +/// - Rows 2-3: state after ext2, ext3 +/// - Row 4: state after ext4 +/// - Rows 5-10: state after each packed-internal triple +/// - Row 11: state after packed-internal triple 6 +/// - Row 12: state after int22+ext5 +/// - Rows 13-14: state after ext6, ext7 +/// - Row 15: state after ext8 (= final permutation output) +fn check_perm_segment( trace: &[Vec], start_row: usize, - end_row: usize, - copied_start_row: usize, - copied_end_row: usize, + init_state: &HasherState, + expected_multiplicity: Felt, ) { - // make sure the number of copied rows are equal as the original. - assert_eq!(end_row - start_row, copied_end_row - copied_start_row); + use miden_core::chiplets::hasher::Hasher; - // make sure selector trace is copied correctly - let selector_trace = &trace[0..NUM_SELECTORS]; - for column in selector_trace.iter() { - assert_eq!(column[start_row..end_row], column[copied_start_row..copied_end_row]) + let mut state = *init_state; + + // Row 0: initial state + for (i, &val) in state.iter().enumerate() { + assert_eq!( + trace[STATE_COL_RANGE.start + i][start_row], + val, + "state[{i}] at perm row 0 (row {start_row})" + ); + } + assert_eq!(trace[NODE_INDEX_COL_IDX][start_row], expected_multiplicity); + assert_eq!(trace[S_PERM_COL_IDX][start_row], ONE); + + // Apply init+ext1, check row 1 + Hasher::apply_matmul_external(&mut state); + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_INITIAL[0]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + check_state_at_row(trace, start_row + 1, &state, "after init+ext1"); + + // Apply ext2-4, check rows 2-4 + for r in 1..=3 { + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_INITIAL[r]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + check_state_at_row(trace, start_row + 1 + r, &state, &alloc::format!("after ext{}", r + 1)); + } + + // Apply 7 packed internal triples, check rows 5-11 + for triple in 0..7_usize { + let base = triple * 3; + for k in 0..3 { + state[0] += Hasher::ARK_INT[base + k]; + state[0] = state[0].exp_const_u64::<7>(); + Hasher::matmul_internal(&mut state, Hasher::MAT_DIAG); + } + check_state_at_row( + trace, + start_row + 5 + triple, + &state, + &alloc::format!("after int triple {triple}"), + ); } - // make sure hasher state trace is copied correctly - let hasher_state_trace = &trace[STATE_COL_RANGE]; - for column in hasher_state_trace.iter() { - assert_eq!(column[start_row..end_row], column[copied_start_row..copied_end_row]) + // Apply int22+ext5, check row 12 + state[0] += Hasher::ARK_INT[21]; + state[0] = state[0].exp_const_u64::<7>(); + Hasher::matmul_internal(&mut state, Hasher::MAT_DIAG); + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_TERMINAL[0]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + check_state_at_row(trace, start_row + 12, &state, "after int22+ext5"); + + // Apply ext6-8, check rows 13-15 + for r in 1..=3 { + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_TERMINAL[r]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + check_state_at_row( + trace, + start_row + 12 + r, + &state, + &alloc::format!("after ext{}", r + 5), + ); } } -/// Makes sure that a row in the provided trace is equal to the provided values at the specified -/// row index. -fn assert_row_equal(trace: &[Vec], row_idx: usize, values: &[Felt]) { - for (column, &value) in trace.iter().zip(values.iter()) { - assert_eq!(column[row_idx], value); +/// Helper to check the hasher state at a specific trace row. +fn check_state_at_row(trace: &[Vec], row: usize, state: &HasherState, label: &str) { + for (i, &val) in state.iter().enumerate() { + assert_eq!(trace[STATE_COL_RANGE.start + i][row], val, "state[{i}] at row {row} ({label})"); } } @@ -702,3 +763,113 @@ fn init_leaves(values: &[u64]) -> Vec { fn init_leaf(value: u64) -> Digest { [Felt::new(value), ZERO, ZERO, ZERO].into() } + +/// Verifies that a memoized (copied) range of controller rows matches the original range. +/// +/// Checks selectors (s0, s1, s2), state columns (h0..h11), and node_index. +/// Does NOT check mrupdate_id (which is overwritten by the hasher on copy). +fn check_memoized_trace( + trace: &[Vec], + original: core::ops::Range, + copied: core::ops::Range, +) { + assert_eq!( + original.len(), + copied.len(), + "original and copied ranges must have the same length" + ); + + for (orig_row, copy_row) in original.zip(copied) { + // Selectors s0, s1, s2 + for col in 0..3 { + assert_eq!( + trace[col][orig_row], trace[col][copy_row], + "selector col {col} mismatch: original row {orig_row} vs copied row {copy_row}" + ); + } + + // State columns h0..h11 + for col in STATE_COL_RANGE { + assert_eq!( + trace[col][orig_row], trace[col][copy_row], + "state col {col} mismatch: original row {orig_row} vs copied row {copy_row}" + ); + } + + // node_index + assert_eq!( + trace[NODE_INDEX_COL_IDX][orig_row], trace[NODE_INDEX_COL_IDX][copy_row], + "node_index mismatch: original row {orig_row} vs copied row {copy_row}" + ); + + // is_boundary, direction_bit should also match + assert_eq!( + trace[IS_BOUNDARY_COL_IDX][orig_row], trace[IS_BOUNDARY_COL_IDX][copy_row], + "is_boundary mismatch: original row {orig_row} vs copied row {copy_row}" + ); + assert_eq!( + trace[DIRECTION_BIT_COL_IDX][orig_row], trace[DIRECTION_BIT_COL_IDX][copy_row], + "direction_bit mismatch: original row {orig_row} vs copied row {copy_row}" + ); + + // s_perm should be 0 on all controller rows + assert_eq!( + trace[S_PERM_COL_IDX][copy_row], ZERO, + "s_perm should be 0 on copied controller row {copy_row}" + ); + } +} + +/// Creates a BasicBlockNode from the given operations and returns its op_batches. +/// +/// This is a helper for tests that need `&[OpBatch]` without building a full MAST forest. +fn make_basic_block_batches(ops: Vec) -> Vec { + use miden_core::mast::BasicBlockNodeBuilder; + + let node = BasicBlockNodeBuilder::new(ops, Vec::new()) + .build() + .expect("failed to build basic block"); + node.op_batches().to_vec() +} + +/// Creates a single OpBatch with a distinct operation (Pad) for testing. +/// +/// Uses Pad instead of Noop to ensure the groups differ from those produced by `make_multi_batch`. +fn make_single_batch() -> Vec { + use miden_core::operations::Operation; + make_basic_block_batches(vec![Operation::Pad]) +} + +/// Creates exactly `n` OpBatch objects for testing multi-batch basic blocks. +/// +/// Uses Noop operations to fill batches. Each batch holds 8 groups * 9 ops = 72 ops. +/// To produce exactly `n` batches, we use 72*(n-1) + 1 operations. +fn make_multi_batch(n: usize) -> Vec { + use miden_core::operations::Operation; + assert!(n >= 2, "use make_single_batch for n=1"); + + // 72 ops fills exactly 1 batch. To get n batches, we need 72*(n-1) + 1 ops. + let num_ops = 72 * (n - 1) + 1; + let ops = vec![Operation::Noop; num_ops]; + + let batches = make_basic_block_batches(ops); + assert_eq!(batches.len(), n, "expected exactly {n} batches, got {}", batches.len()); + batches +} + +/// Computes the expected hash for a basic block given its op batches. +/// +/// Mirrors the logic in `Hasher::hash_basic_block` without recording a trace. +fn compute_basic_block_hash(batches: &[OpBatch]) -> Digest { + assert!(!batches.is_empty()); + + let mut state = init_state(batches[0].groups(), ZERO); + hasher::apply_permutation(&mut state); + + for batch in batches.iter().skip(1) { + absorb_into_state(&mut state, batch.groups()); + hasher::apply_permutation(&mut state); + } + + get_digest(&state) +} diff --git a/processor/src/trace/chiplets/hasher/trace.rs b/processor/src/trace/chiplets/hasher/trace.rs index cf031a685a..36f1d2619d 100644 --- a/processor/src/trace/chiplets/hasher/trace.rs +++ b/processor/src/trace/chiplets/hasher/trace.rs @@ -1,25 +1,38 @@ use alloc::vec::Vec; use core::ops::Range; -use miden_air::trace::chiplets::hasher::NUM_ROUNDS; -use miden_core::chiplets::hasher::apply_round; +use miden_air::trace::chiplets::hasher::{HASH_CYCLE_LEN, TRACE_WIDTH}; +use miden_core::chiplets::hasher::Hasher; -use super::{Felt, HasherState, STATE_WIDTH, Selectors, TRACE_WIDTH, TraceFragment, ZERO}; +use super::{Felt, HasherState, ONE, STATE_WIDTH, Selectors, TraceFragment, ZERO}; // HASHER TRACE // ================================================================================================ /// Execution trace of the hasher component. /// -/// The trace consists of 16 columns grouped logically as follows: -/// - 3 selector columns. -/// - 12 columns describing hasher state. -/// - 1 node index column used for Merkle path related computations. +/// The trace consists of 20 columns grouped logically as follows: +/// - 3 selector columns (s0, s1, s2). +/// - 12 columns describing hasher state (h0..h11). +/// - 1 node_index column: holds the Merkle tree node index on controller rows. This column is +/// reused to hold the permutation request multiplicity on perm segment rows. +/// - 1 mrupdate_id column (domain separator for sibling table). +/// - 1 is_boundary column (1 on boundary rows: first input or last output, 0 otherwise). +/// - 1 direction_bit column (Merkle direction bit on controller rows, 0 elsewhere). +/// - 1 s_perm column (0 = controller region, 1 = permutation segment). +/// +/// The trace is divided into two regions: +/// - Controller region (s_perm=0): pairs of (input, output) rows per permutation request. +/// - Permutation segment (s_perm=1): one 16-row cycle per unique input state. #[derive(Debug, Default)] pub struct HasherTrace { selectors: [Vec; 3], hasher_state: [Vec; STATE_WIDTH], node_index: Vec, + mrupdate_id: Vec, + is_boundary: Vec, + direction_bit: Vec, + s_perm: Vec, } impl HasherTrace { @@ -40,83 +53,192 @@ impl HasherTrace { Felt::new(self.trace_len() as u64 + 1) } - // TRACE MUTATORS + // CONTROLLER ROW METHODS // -------------------------------------------------------------------------------------------- - /// Appends 32 rows to the execution trace describing a single permutation of the hash function. - /// - /// The initial state of the hasher is provided via the `state` parameter. All subsequent - /// states are derived by applying a single round of the hash function to the previous state. - /// - /// Selector values for the first and last rows are provided via `init_selectors` and - /// `final_selectors` parameters. Selector values for all other rows are derived from the - /// selectors of the first row. - /// - /// Node index values are provided via `init_index` and `rest_index` parameters. The former is - /// used for the first row, and the latter for all subsequent rows. - pub fn append_permutation_with_index( + /// Appends a single controller row to the trace. + pub fn append_controller_row( &mut self, - state: &mut HasherState, - init_selectors: Selectors, - final_selectors: Selectors, - init_index: Felt, - rest_index: Felt, + selectors: Selectors, + state: &HasherState, + node_index: Felt, + mrupdate_id: Felt, + is_boundary: Felt, + direction_bit: Felt, ) { - // append the first row of the permutation cycle - self.append_row(init_selectors, state, init_index); - - // append the next NUM_ROUNDS - 1 rows of the permutation cycle. for these rows: - // - the last two selectors are carried over from row to row; the first selector is set to - // ZERO. - // - hasher state is updated by applying a single round of the hash function for every row. - let next_selectors = [ZERO, init_selectors[1], init_selectors[2]]; - for i in 0..NUM_ROUNDS - 1 { - apply_round(state, i); - self.append_row(next_selectors, state, rest_index); + for (trace_col, selector_val) in self.selectors.iter_mut().zip(selectors) { + trace_col.push(selector_val); + } + for (trace_col, &state_val) in self.hasher_state.iter_mut().zip(state) { + trace_col.push(state_val); + } + self.node_index.push(node_index); + self.mrupdate_id.push(mrupdate_id); + self.is_boundary.push(is_boundary); + self.direction_bit.push(direction_bit); + self.s_perm.push(ZERO); + } + + // PERMUTATION SEGMENT METHODS + // -------------------------------------------------------------------------------------------- + + /// Appends a 16-row permutation cycle to the trace. + /// + /// The 16-row packed schedule: + /// - Row 0: init linear + ext1 (merged) + /// - Rows 1-3: ext2, ext3, ext4 + /// - Rows 4-10: 7 packed triples of internal rounds (needs extra witnesses in s0,s1,s2) + /// - Row 11: int22 + ext5 (merged, extra witness in s0) + /// - Rows 12-14: ext6, ext7, ext8 + /// - Row 15: boundary (final state, no transition) + /// + /// The `multiplicity` is stored in the node_index column on all rows of the cycle and constant + /// within a cycle. + pub fn append_permutation_cycle(&mut self, init_state: &HasherState, multiplicity: Felt) { + let mut state = *init_state; + + // Row 0: initial state + self.append_perm_row_with_witnesses(&state, multiplicity, [ZERO; 3]); + + // Apply init linear + ext1 (merged: M_E, add RC, S-box, M_E) + Hasher::apply_matmul_external(&mut state); + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_INITIAL[0]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + + // Rows 1-3: ext2, ext3, ext4 + for r in 1..=3 { + self.append_perm_row_with_witnesses(&state, multiplicity, [ZERO; 3]); + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_INITIAL[r]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + } + + // Rows 4-10: packed 3x internal rounds + for triple in 0..7_usize { + let base = triple * 3; + let pre_state = state; + let mut witnesses = [ZERO; 3]; + for (k, witness) in witnesses.iter_mut().enumerate() { + // Witness = S-box output for lane 0 + let sbox_out = (state[0] + Hasher::ARK_INT[base + k]).exp_const_u64::<7>(); + *witness = sbox_out; + state[0] = sbox_out; + Hasher::matmul_internal(&mut state, Hasher::MAT_DIAG); + } + self.append_perm_row_with_witnesses(&pre_state, multiplicity, witnesses); + } + + // Row 11: int22 + ext5 (merged) + let pre_state = state; + let w0 = (state[0] + Hasher::ARK_INT[21]).exp_const_u64::<7>(); + state[0] = w0; + Hasher::matmul_internal(&mut state, Hasher::MAT_DIAG); + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_TERMINAL[0]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); + self.append_perm_row_with_witnesses(&pre_state, multiplicity, [w0, ZERO, ZERO]); + + // Rows 12-14: ext6, ext7, ext8 + for r in 1..=3 { + self.append_perm_row_with_witnesses(&state, multiplicity, [ZERO; 3]); + Hasher::add_rc(&mut state, &Hasher::ARK_EXT_TERMINAL[r]); + Hasher::apply_sbox(&mut state); + Hasher::apply_matmul_external(&mut state); } - // apply the last round and append the last row to the trace - apply_round(state, NUM_ROUNDS - 1); - self.append_row(final_selectors, state, rest_index); + // Row 15: boundary (final state) + self.append_perm_row_with_witnesses(&state, multiplicity, [ZERO; 3]); } - /// Appends 32 rows to the execution trace describing a single permutation of the hash function. + /// Appends a single permutation segment row (s_perm = 1). /// - /// This function is similar to the append_permutation_with_index() function above, but it sets - /// init_index and rest_index parameters to ZEROs. - #[inline(always)] - pub fn append_permutation( + /// On permutation rows, `s0, s1, s2` serve as witness columns for packed internal + /// rounds. The `witnesses` array provides values to write into these columns. + /// Control columns (mrupdate_id, is_boundary, direction_bit) are zero. + fn append_perm_row_with_witnesses( &mut self, - state: &mut HasherState, - init_selectors: Selectors, - final_selectors: Selectors, + state: &HasherState, + multiplicity: Felt, + witnesses: [Felt; 3], ) { - self.append_permutation_with_index(state, init_selectors, final_selectors, ZERO, ZERO); + self.selectors[0].push(witnesses[0]); + self.selectors[1].push(witnesses[1]); + self.selectors[2].push(witnesses[2]); + for (trace_col, &state_val) in self.hasher_state.iter_mut().zip(state) { + trace_col.push(state_val); + } + self.node_index.push(multiplicity); + self.mrupdate_id.push(ZERO); + self.is_boundary.push(ZERO); + self.direction_bit.push(ZERO); + self.s_perm.push(ONE); } - /// Appends a new row to the execution trace based on the supplied parameters. - fn append_row(&mut self, selectors: Selectors, state: &HasherState, index: Felt) { - for (trace_col, selector_val) in self.selectors.iter_mut().zip(selectors) { - trace_col.push(selector_val); + /// Appends padding rows to fill the controller region to a multiple of HASH_CYCLE_LEN. + /// + /// Padding rows have all columns set to zero except mrupdate_id, which must carry the + /// last value to satisfy the AIR progression constraint (mrupdate_id is constant on + /// non-MV-start transitions). + pub fn pad_to_cycle_boundary(&mut self, mrupdate_id: Felt) { + // Padding selectors: [0, 1, 0]. This combination is unused in the controller region + // (s0=0, s1=1 only appears in perm segment rows which have s_perm=1). Using it + // prevents padding rows from being mistaken for HOUT output rows ([0,0,0]) by the + // bus response builder. + let padding_selectors = [ZERO, ONE, ZERO]; + + let remainder = self.trace_len() % HASH_CYCLE_LEN; + if remainder != 0 { + let padding_rows = HASH_CYCLE_LEN - remainder; + for _ in 0..padding_rows { + self.append_controller_row( + padding_selectors, + &[ZERO; STATE_WIDTH], + ZERO, + mrupdate_id, + ZERO, + ZERO, + ); + } } - for (trace_col, &state_val) in self.hasher_state.iter_mut().zip(state) { - trace_col.push(state_val); + } + + // MEMOIZATION SUPPORT + // -------------------------------------------------------------------------------------------- + + /// Collects input states from controller input rows in the given range. + /// + /// A controller input row is identified by s0 == ONE and s_perm == ZERO. + /// Returns the hasher state for each such row. + pub fn input_states_in_range(&self, range: Range) -> Vec { + let mut states = Vec::new(); + for row in range { + // Controller input row: s0 = ONE and s_perm = ZERO + if self.selectors[0][row] == ONE && self.s_perm[row] == ZERO { + let mut state = [ZERO; STATE_WIDTH]; + for (col, hasher) in self.hasher_state.iter().enumerate() { + state[col] = hasher[row]; + } + states.push(state); + } } - self.node_index.push(index); + states } - /// Copies section of trace from the given range of start and end rows at the end of the trace. - /// The hasher state of the last row is copied to the provided state input. + /// Copies a section of the controller trace from the given range to the end of the trace. + /// Updates the provided state with the hasher state from the last row of the copied range. pub fn copy_trace(&mut self, state: &mut [Felt; STATE_WIDTH], range: Range) { for selector in self.selectors.iter_mut() { selector.extend_from_within(range.clone()); } - for hasher in self.hasher_state.iter_mut() { hasher.extend_from_within(range.clone()); } - self.node_index.extend_from_within(range.clone()); + self.mrupdate_id.extend_from_within(range.clone()); + self.is_boundary.extend_from_within(range.clone()); + self.direction_bit.extend_from_within(range.clone()); + self.s_perm.extend_from_within(range.clone()); // copy the latest hasher state to the provided state slice for (col, hasher) in self.hasher_state.iter().enumerate() { @@ -124,24 +246,30 @@ impl HasherTrace { } } + /// Overwrites mrupdate_id values in the given range. + pub fn overwrite_mrupdate_id_in_range(&mut self, range: Range, mrupdate_id: Felt) { + for row in range { + self.mrupdate_id[row] = mrupdate_id; + } + } + // EXECUTION TRACE GENERATION // -------------------------------------------------------------------------------------------- /// Fills the provided trace fragment with trace data from this hasher trace instance. pub fn fill_trace(self, trace: &mut TraceFragment) { - // make sure fragment dimensions are consistent with the dimensions of this trace debug_assert_eq!(self.trace_len(), trace.len(), "inconsistent trace lengths"); debug_assert_eq!(TRACE_WIDTH, trace.width(), "inconsistent trace widths"); - // collect all trace columns into a single vector let mut columns = Vec::new(); self.selectors.into_iter().for_each(|c| columns.push(c)); - self.hasher_state.into_iter().for_each(|c| columns.push(c)); columns.push(self.node_index); + columns.push(self.mrupdate_id); + columns.push(self.is_boundary); + columns.push(self.direction_bit); + columns.push(self.s_perm); - // copy trace into the fragment column-by-column - // TODO: this can be parallelized to copy columns in multiple threads (#2163) for (out_column, column) in trace.columns().zip(columns) { out_column.copy_from_slice(&column); } diff --git a/processor/src/trace/chiplets/kernel_rom/tests.rs b/processor/src/trace/chiplets/kernel_rom/tests.rs index f72aba36eb..8bae80c235 100644 --- a/processor/src/trace/chiplets/kernel_rom/tests.rs +++ b/processor/src/trace/chiplets/kernel_rom/tests.rs @@ -57,7 +57,6 @@ fn kernel_rom_no_access() { } #[test] -#[expect(clippy::needless_range_loop)] fn kernel_rom_with_access() { let kernel = build_kernel(); let mut rom = KernelRom::new(kernel); @@ -99,7 +98,6 @@ fn kernel_rom_with_access() { } #[test] -#[expect(clippy::needless_range_loop)] fn kernel_rom_with_single_access() { let kernel = build_kernel(); let mut rom = KernelRom::new(kernel); diff --git a/processor/src/trace/chiplets/memory/mod.rs b/processor/src/trace/chiplets/memory/mod.rs index ff2ef64266..a444918c06 100644 --- a/processor/src/trace/chiplets/memory/mod.rs +++ b/processor/src/trace/chiplets/memory/mod.rs @@ -7,7 +7,7 @@ use miden_air::trace::{ CLK_COL_IDX, CTX_COL_IDX, D_INV_COL_IDX, D0_COL_IDX, D1_COL_IDX, FLAG_SAME_CONTEXT_AND_WORD, IDX0_COL_IDX, IDX1_COL_IDX, IS_READ_COL_IDX, IS_WORD_ACCESS_COL_IDX, MEMORY_ACCESS_ELEMENT, MEMORY_ACCESS_WORD, MEMORY_READ, - MEMORY_WRITE, V_COL_RANGE, WORD_COL_IDX, + MEMORY_WRITE, V_COL_RANGE, WORD_ADDR_HI_COL_IDX, WORD_ADDR_LO_COL_IDX, WORD_COL_IDX, }, }; @@ -53,8 +53,8 @@ const INIT_MEM_VALUE: Word = EMPTY_WORD; /// ## Execution trace /// The layout of the memory access trace is shown below. /// -/// rw ew ctx word_addr idx0 idx1 clk v0 v1 v2 v3 d0 d1 d_inv f_scw -/// ├────┴────┴────┴───────────┴──────┴──────┴────┴────┴────┴────┴────┴────┴────┴───────┴───────┤ +/// rw ew ctx word_addr idx0 idx1 clk v0 v1 v2 v3 d0 d1 d_inv f_scw w0 w1 +/// ├────┴────┴────┴──────────┴─────┴──────┴────┴────┴────┴────┴────┴────┴────┴─────┴─────┴───┴─┤ /// /// In the above, the meaning of the columns is as follows: /// - `rw` is a selector column used to identify whether the memory operation is a read or a write @@ -87,6 +87,10 @@ const INIT_MEM_VALUE: Word = EMPTY_WORD; /// cycles computed as described above. It is the field inverse of `(d_1 * 2^16) + d_0` /// - `f_scw` is a flag indicating whether the context and the word of the current row are the same /// as in the next row. +/// - `w0` contains the lower 16 bits of the word index (`word_addr / 4`). +/// - `w1` contains the upper 16 bits of the word index (`word_addr / 4`). Together with range +/// checks on `w0`, `w1`, and `4 * w1`, these columns prove that memory addresses are valid 32-bit +/// values. /// /// For the first row of the trace, values in `d0`, `d1`, and `d_inv` are set to zeros. #[derive(Debug, Default)] @@ -251,7 +255,7 @@ impl Memory { // trace; we also adjust the clock cycle so that delta value for the first row would end // up being ZERO. if the trace is empty, return without any further processing. let (mut prev_ctx, mut prev_addr, mut prev_clk) = match self.get_first_row_info() { - Some((ctx, addr, clk)) => (ctx, addr, clk.as_canonical_u64() - 1), + Some((ctx, addr, clk)) => (ctx, addr, clk.as_canonical_u64().wrapping_sub(1)), None => return, }; @@ -271,12 +275,23 @@ impl Memory { } else if prev_addr != addr { u64::from(addr - prev_addr) } else { - clk - prev_clk + clk.wrapping_sub(prev_clk) }; let (delta_hi, delta_lo) = split_u32_into_u16(delta); range.add_range_checks(row, &[delta_lo, delta_hi]); + // word index decomposition range checks: prove addr is a valid 32-bit value + // by checking w0, w1, and 4*w1 are all in [0, 2^16). + // Since addr is u32 and word_index = addr/4, w1 = word_index >> 16 < 2^14, + // so 4*w1 < 2^16 and fits by definition in u16. + let word_index = addr / WORD_SIZE as u32; + let w0 = (word_index & 0xffff) as u16; + let w1 = (word_index >> 16) as u16; + range.add_value(w0); + range.add_value(w1); + range.add_value(w1 << 2); + // update values for the next iteration of the loop prev_ctx = ctx; prev_addr = addr; @@ -300,7 +315,7 @@ impl Memory { }; // iterate through addresses in ascending order, and write trace row for each memory access - // into the trace. we expect the trace to be 15 columns wide. + // into the trace. we expect the trace to be 17 columns wide. let mut row: RowIndex = 0.into(); for (ctx, segment) in self.trace { @@ -363,6 +378,13 @@ impl Memory { trace.set(row, FLAG_SAME_CONTEXT_AND_WORD, ZERO); }; + // decompose word address into 16-bit limbs of word index + let word_index = addr / WORD_SIZE as u32; + let w0 = (word_index & 0xffff) as u16; + let w1 = (word_index >> 16) as u16; + trace.set(row, WORD_ADDR_LO_COL_IDX, Felt::from_u16(w0)); + trace.set(row, WORD_ADDR_HI_COL_IDX, Felt::from_u16(w1)); + // update values for the next iteration of the loop prev_ctx = ctx; prev_addr = felt_addr; diff --git a/processor/src/trace/chiplets/memory/tests.rs b/processor/src/trace/chiplets/memory/tests.rs index c936b43375..82174e49d3 100644 --- a/processor/src/trace/chiplets/memory/tests.rs +++ b/processor/src/trace/chiplets/memory/tests.rs @@ -12,10 +12,10 @@ use miden_core::{ONE, WORD_SIZE, Word, ZERO, assert_matches, field::Field}; use super::{ CLK_COL_IDX, CTX_COL_IDX, D_INV_COL_IDX, D0_COL_IDX, D1_COL_IDX, EMPTY_WORD, Felt, Memory, - TraceFragment, V_COL_RANGE, WORD_COL_IDX, + TraceFragment, V_COL_RANGE, WORD_ADDR_HI_COL_IDX, WORD_ADDR_LO_COL_IDX, WORD_COL_IDX, segment::{MemoryAccessType, MemoryOperation}, }; -use crate::{ContextId, MemoryAddress, MemoryError}; +use crate::{ContextId, MemoryAddress, MemoryError, trace::range::RangeChecker}; #[test] fn mem_init() { @@ -455,6 +455,17 @@ fn mem_get_state_at() { assert_eq!(mem.get_state_at(3.into(), clk), vec![]); } +#[test] +fn append_range_checks_does_not_panic_when_first_access_clk_is_zero() { + let mut mem = Memory::default(); + mem.write(ContextId::root(), ZERO, 0.into(), ONE).unwrap(); + + let mut range_checker = RangeChecker::new(); + mem.append_range_checks(0.into(), &mut range_checker); + + assert!(range_checker.trace_len() > 0); +} + // HELPER STRUCT & FUNCTIONS // ================================================================================================ @@ -577,6 +588,12 @@ fn build_trace_row( row[FLAG_SAME_CONTEXT_AND_WORD] = ZERO; } + // Word index decomposition: word_addr / 4 + let word_addr: u32 = word.as_canonical_u64() as u32; + let word_index = word_addr / WORD_SIZE as u32; + row[WORD_ADDR_LO_COL_IDX] = Felt::from_u16((word_index & 0xffff) as u16); + row[WORD_ADDR_HI_COL_IDX] = Felt::from_u16((word_index >> 16) as u16); + row } diff --git a/processor/src/trace/chiplets/mod.rs b/processor/src/trace/chiplets/mod.rs index e45690918e..a61cf0699a 100644 --- a/processor/src/trace/chiplets/mod.rs +++ b/processor/src/trace/chiplets/mod.rs @@ -1,7 +1,7 @@ use alloc::vec::Vec; use miden_air::trace::{CHIPLETS_WIDTH, chiplets::hasher::HasherState}; -use miden_core::{mast::OpBatch, program::Kernel}; +use miden_core::{mast::OpBatch, program::Kernel, utils::RowMajorMatrix}; use crate::{ Felt, ONE, Word, ZERO, @@ -14,8 +14,6 @@ use bitwise::Bitwise; mod hasher; use hasher::Hasher; -#[cfg(test)] -pub(crate) use hasher::init_state_from_words; mod memory; use memory::Memory; @@ -32,13 +30,14 @@ mod aux_trace; pub use aux_trace::AuxTraceBuilder; #[cfg(test)] +#[allow(clippy::needless_range_loop)] mod tests; // TRACE // ================================================================================================ pub struct ChipletsTrace { - pub(crate) trace: [Vec; CHIPLETS_WIDTH], + pub(crate) trace: Vec, pub(crate) aux_builder: AuxTraceBuilder, } @@ -49,99 +48,88 @@ pub struct ChipletsTrace { /// and kernel ROM chiplets and is responsible for building a final execution trace from their /// stacked execution traces and chiplet selectors. /// -/// The module's trace can be thought of as 6 stacked segments in the following form: +/// The module's trace can be thought of as 6 stacked segments in the following form. +/// +/// The chiplet system uses two physical selector columns (`s_ctrl = column 0` and +/// `s_perm = column 20`) plus the virtual `s0 = 1 - (s_ctrl + s_perm)` to partition +/// rows into three top-level regions. Columns 1-4 (`s1..s4`) subdivide the `s0` region. /// -/// * Hasher segment: contains the trace and selector for the hasher chiplet. This segment fills the -/// first rows of the trace up to the length of the hasher `trace_len`. -/// - column 0: selector column with values set to ZERO -/// - columns 1-16: execution trace of hash chiplet -/// - columns 17-20: unused columns padded with ZERO +/// * Hasher segment: fills the first rows of the trace up to the hasher `trace_len`. Split into +/// controller (s_ctrl=1, s_perm=0) and permutation (s_ctrl=0, s_perm=1) sub-regions. +/// - column 0 (s_ctrl): 1 on controller rows, 0 on permutation rows +/// - columns 1-19: execution trace of hash chiplet +/// - column 20 (s_perm): 0 on controller rows, 1 on permutation rows /// -/// * Bitwise segment: contains the trace and selectors for the bitwise chiplet. This segment begins -/// at the end of the hasher segment and fills the next rows of the trace for the `trace_len` of -/// the bitwise chiplet. -/// - column 0: selector column with values set to ONE -/// - column 1: selector column with values set to ZERO +/// * Bitwise segment: begins at the end of the hasher segment. +/// - column 0 (s_ctrl): ZERO +/// - column 1 (s1): ZERO /// - columns 2-14: execution trace of bitwise chiplet /// - columns 15-20: unused columns padded with ZERO /// -/// * Memory segment: contains the trace and selectors for the memory chiplet. This segment begins -/// at the end of the bitwise segment and fills the next rows of the trace for the `trace_len` of -/// the memory chiplet. -/// - column 0-1: selector columns with values set to ONE -/// - column 2: selector column with values set to ZERO -/// - columns 3-17: execution trace of memory chiplet -/// - columns 18-20: unused columns padded with ZERO +/// * Memory segment: begins at the end of the bitwise segment. +/// - column 0 (s_ctrl): ZERO +/// - column 1 (s1): ONE +/// - column 2 (s2): ZERO +/// - columns 3-19: execution trace of memory chiplet +/// - column 20: unused column padded with ZERO /// -/// * ACE segment: contains the trace and selectors for the arithmetic circuit evaluation chiplet. -/// This segment begins at the end of the memory segment and fills the next rows of the trace for -/// the `trace_len` of the ACE chiplet. -/// - column 0-2: selector columns with values set to ONE -/// - column 3: selector column with values set to ZERO +/// * ACE segment: begins at the end of the memory segment. +/// - column 0 (s_ctrl): ZERO +/// - column 1-2 (s1, s2): ONE +/// - column 3 (s3): ZERO /// - columns 4-20: execution trace of ACE chiplet /// -/// * Kernel ROM segment: contains the trace and selectors for the kernel ROM chiplet * This segment -/// begins at the end of the memory segment and fills the next rows of the trace for the -/// `trace_len` of the kernel ROM chiplet. -/// - column 0-3: selector columns with values set to ONE -/// - column 4: selector column with values set to ZERO +/// * Kernel ROM segment: begins at the end of the ACE segment. +/// - column 0 (s_ctrl): ZERO +/// - columns 1-3 (s1, s2, s3): ONE +/// - column 4 (s4): ZERO /// - columns 5-9: execution trace of kernel ROM chiplet -/// - columns 10-20: unused column padded with ZERO +/// - columns 10-20: unused columns padded with ZERO /// -/// * Padding segment: unused. This segment begins at the end of the kernel ROM segment and fills -/// the rest of the execution trace minus the number of random rows. When it finishes, the -/// execution trace should have exactly enough rows remaining for the specified number of random -/// rows. -/// - columns 0-4: selector columns with values set to ONE +/// * Padding segment: fills the rest of the trace. +/// - column 0 (s_ctrl): ZERO +/// - columns 1-4 (s1..s4): ONE /// - columns 5-20: unused columns padded with ZERO /// /// /// The following is a pictorial representation of the chiplet module: /// /// ```text -/// +---+--------------------------------------------------------------+------+ -/// | 0 | |------| -/// | . | Hash chiplet |------| -/// | . | 16 columns |------| -/// | . | constraint degree 8 |------| -/// | 0 | |------| -/// +---+---+------------------------------------------------------+---+------+ -/// | 1 | 0 | |----------| -/// | . | . | Bitwise chiplet |----------| -/// | . | . | 13 columns |----------| -/// | . | . | constraint degree 5 |----------| -/// | . | . | |----------| -/// | . | 0 | |----------| -/// | . +---+---+--------------------------------------------------+-----+----+ -/// | . | 1 | 0 | |----| -/// | . | . | . | Memory chiplet |----| -/// | . | . | . | 15 columns |----| -/// | . | . | . | constraint degree 9 |----| -/// | . | . | 0 | |----| -/// | . + . +---+---+----------------------------------------------------+----+ -/// | . | . | 1 | 0 | | -/// | . | . | . | . | ACE chiplet | -/// | . | . | . | . | 16 columns | -/// | . | . | . | . | constraint degree 5 | -/// | . | . | . | 0 | | -/// | . + . | . +---+---+---------------------------+-------------------------+ -/// | . | . | . | 1 | 0 | |-------------------------| -/// | . | . | . | . | . | Kernel ROM chiplet |-------------------------| -/// | . | . | . | . | . | 5 columns |-------------------------| -/// | . | . | . | . | . | constraint degree 9 |-------------------------| -/// | . | . | . | . | 0 | |-------------------------| -/// | . + . | . | . +---+---+-----------------------+-------------------------+ -/// | . | . | . | . | 1 | 0 |-------------------------------------------------| -/// | . | . | . | . | . | . |-------------------------------------------------| -/// | . | . | . | . | . | . |-------------------------------------------------| -/// | . | . | . | . | . | . |-------------------------------------------------| -/// | . | . | . | . | . | . |-------------------- Padding --------------------| -/// | . + . | . | . | . | . |-------------------------------------------------| -/// | . | . | . | . | . | . |-------------------------------------------------| -/// | . | . | . | . | . | . |-------------------------------------------------| -/// | . | . | . | . | . | . |-------------------------------------------------| -/// | 1 | 1 | 1 | 1 | 1 | 0 |-------------------------------------------------| -/// +---+---+---+---+---------------------------------------------------------+ +/// s_ctrl s1 s2 s3 s4 s_perm +/// [0] [1] [2] [3] [4] [20] +/// +---+----------------------------------------------------------+---+ +/// ctrl | 1 | Hash chiplet (controller rows) | 0 | +/// | . | 20 columns | . | +/// | 1 | constraint degree 9 | 0 | +/// +---+ +---+ +/// perm | 0 | Hash chiplet (permutation rows) | 1 | +/// | . | | . | +/// | 0 | | 1 | +/// +---+---+------------------------------------------------------+---+ +/// | 0 | 0 | |---| +/// | . | . | Bitwise chiplet |---| +/// | . | . | 13 columns |---| +/// | 0 | 0 | constraint degree 5 |---| +/// | . +---+---+--------------------------------------------------+---+ +/// | . | 1 | 0 | |---| +/// | . | . | . | Memory chiplet |---| +/// | . | . | . | 17 columns |---| +/// | . | . | 0 | constraint degree 9 |---| +/// | . + . +---+---+----------------------------------------------+---+ +/// | . | . | 1 | 0 | |---| +/// | . | . | . | . | ACE chiplet |---| +/// | . | . | . | . | 16 columns |---| +/// | . | . | . | 0 | constraint degree 5 |---| +/// | . + . | . +---+---+-------------------------+--------------------+ +/// | . | . | . | 1 | 0 | |--------------------| +/// | . | . | . | . | . | Kernel ROM chiplet |--------------------| +/// | . | . | . | . | . | 5 columns |--------------------| +/// | . | . | . | . | 0 | constraint degree 9 |--------------------| +/// | . + . | . | . +---+-------------------------+--------------------+ +/// | . | . | . | . | 1 |-------- Padding ---------| | +/// | . | . | . | . | . | | | +/// | 0 | 1 | 1 | 1 | 1 | | 0 | +/// +---+---+---+---+---+--------------------------+-------------------+ /// ``` #[derive(Debug)] pub struct Chiplets { @@ -228,8 +216,15 @@ impl Chiplets { .expect("failed to convert vector to array"); let ace_hint = self.fill_trace(&mut trace); + let mut col_flat = Vec::with_capacity(CHIPLETS_WIDTH * trace_len); + for col in &trace { + col_flat.extend_from_slice(col); + } + let col_mat = RowMajorMatrix::new(col_flat, trace_len); + let row_mat = col_mat.transpose(); + ChipletsTrace { - trace, + trace: row_mat.values, aux_builder: AuxTraceBuilder::new(ace_hint), } } @@ -242,8 +237,10 @@ impl Chiplets { /// to identify each individual chiplet trace in addition to padding to fill the rest of /// the trace. fn fill_trace(self, trace: &mut [Vec; CHIPLETS_WIDTH]) -> AceHints { - // get the rows where:usize chiplets begin. - let bitwise_start: usize = self.bitwise_start().into(); + // s_ctrl (trace[0]) is 1 on the hasher's controller rows and 0 elsewhere. + // The controller region is the padded prefix of the hasher region; `region_lengths` + // returns the same padded length that `finalize_trace` will materialize later. + let (hasher_ctrl_len, _hasher_perm_len) = self.hasher.region_lengths(); let memory_start: usize = self.memory_start().into(); let ace_start: usize = self.ace_start().into(); let kernel_rom_start: usize = self.kernel_rom_start().into(); @@ -251,106 +248,105 @@ impl Chiplets { let Chiplets { hasher, bitwise, memory, kernel_rom, ace } = self; - // populate external selector columns for all chiplets - trace[0][bitwise_start..].fill(ONE); + // Populate external selector columns. Each is a contiguous 0/1 indicator; the trace + // is zero-initialized, so we only memset the regions where the selector is ONE. + // s_perm (trace[20]) is written row-by-row by the hasher itself during fragment fill. + trace[0][..hasher_ctrl_len].fill(ONE); // s_ctrl: hasher controller rows trace[1][memory_start..].fill(ONE); trace[2][ace_start..].fill(ONE); trace[3][kernel_rom_start..].fill(ONE); trace[4][padding_start..].fill(ONE); - // allocate fragments to be filled with the respective execution traces of each chiplet - let mut hasher_fragment = TraceFragment::new(CHIPLETS_WIDTH, hasher.trace_len()); - let mut bitwise_fragment = TraceFragment::new(CHIPLETS_WIDTH, bitwise.trace_len()); - let mut memory_fragment = TraceFragment::new(CHIPLETS_WIDTH, memory.trace_len()); - let mut ace_fragment = TraceFragment::new(CHIPLETS_WIDTH, ace.trace_len()); - let mut kernel_rom_fragment = TraceFragment::new(CHIPLETS_WIDTH, kernel_rom.trace_len()); - - // add the hasher, bitwise, memory, ACE, and kernel ROM segments to their respective - // fragments so they can be filled with the chiplet traces - for (column_num, column) in trace.iter_mut().enumerate().skip(1) { - match column_num { - 1 => { - // column 1 is relevant only for the hasher - hasher_fragment.push_column_slice(column); - }, - 2 => { - // column 2 is relevant to the hasher and to bitwise chiplet - let rest = hasher_fragment.push_column_slice(column); - bitwise_fragment.push_column_slice(rest); - }, - 3 => { - // column 3 is relevant for hasher, bitwise, and memory chiplets - let rest = hasher_fragment.push_column_slice(column); - let rest = bitwise_fragment.push_column_slice(rest); - memory_fragment.push_column_slice(rest); - }, - 4 | 10..=14 => { - // columns 4 - 10 to 14 are relevant for hasher, bitwise, memory chiplets and - // ace chiplet - let rest = hasher_fragment.push_column_slice(column); - let rest = bitwise_fragment.push_column_slice(rest); - let rest = memory_fragment.push_column_slice(rest); - ace_fragment.push_column_slice(rest); - }, - 5..=9 => { - // columns 5 - 9 are relevant to all chiplets - let rest = hasher_fragment.push_column_slice(column); - let rest = bitwise_fragment.push_column_slice(rest); - let rest = memory_fragment.push_column_slice(rest); - let rest = ace_fragment.push_column_slice(rest); - kernel_rom_fragment.push_column_slice(rest); - }, - 15 | 16 => { - // columns 15 and 16 are relevant only for the hasher, memory and ace chiplets - let rest = hasher_fragment.push_column_slice(column); - // skip bitwise chiplet - let (_, rest) = rest.split_at_mut(bitwise.trace_len()); - let rest = memory_fragment.push_column_slice(rest); - ace_fragment.push_column_slice(rest); - }, - 17 => { - // column 17 is relevant only for the memory chiplet - // skip the hasher and bitwise chiplets - let (_, rest) = column.split_at_mut(hasher.trace_len() + bitwise.trace_len()); - let rest = memory_fragment.push_column_slice(rest); - ace_fragment.push_column_slice(rest); - }, - 18 | 19 => { - // column 18 and 19 are relevant only for the ACE chiplet - // skip the hasher, bitwise and memory chiplets - let (_, rest) = column.split_at_mut( - hasher.trace_len() + bitwise.trace_len() + memory.trace_len(), - ); - ace_fragment.push_column_slice(rest); - }, - _ => panic!("invalid column index"), + // Fill chiplet traces via fragments. The block scopes the fragment borrows. + { + // allocate fragments to be filled with the respective execution traces of each chiplet + let mut hasher_fragment = TraceFragment::new(CHIPLETS_WIDTH, hasher.trace_len()); + let mut bitwise_fragment = TraceFragment::new(CHIPLETS_WIDTH, bitwise.trace_len()); + let mut memory_fragment = TraceFragment::new(CHIPLETS_WIDTH, memory.trace_len()); + let mut ace_fragment = TraceFragment::new(CHIPLETS_WIDTH, ace.trace_len()); + let mut kernel_rom_fragment = + TraceFragment::new(CHIPLETS_WIDTH, kernel_rom.trace_len()); + + // add the hasher, bitwise, memory, ACE, and kernel ROM segments to their respective + // fragments so they can be filled with the chiplet traces + for (column_num, column) in trace.iter_mut().enumerate().skip(1) { + match column_num { + 1 => { + // column 1 is relevant only for the hasher + hasher_fragment.push_column_slice(column); + }, + 2 => { + // column 2 is relevant to the hasher and to bitwise chiplet + let rest = hasher_fragment.push_column_slice(column); + bitwise_fragment.push_column_slice(rest); + }, + 3 => { + // column 3 is relevant for hasher, bitwise, and memory chiplets + let rest = hasher_fragment.push_column_slice(column); + let rest = bitwise_fragment.push_column_slice(rest); + memory_fragment.push_column_slice(rest); + }, + 4 | 10..=14 => { + // columns 4 - 10 to 14 are relevant for hasher, bitwise, memory chiplets + // and ace chiplet + let rest = hasher_fragment.push_column_slice(column); + let rest = bitwise_fragment.push_column_slice(rest); + let rest = memory_fragment.push_column_slice(rest); + ace_fragment.push_column_slice(rest); + }, + 5..=9 => { + // columns 5 - 9 are relevant to all chiplets + let rest = hasher_fragment.push_column_slice(column); + let rest = bitwise_fragment.push_column_slice(rest); + let rest = memory_fragment.push_column_slice(rest); + let rest = ace_fragment.push_column_slice(rest); + kernel_rom_fragment.push_column_slice(rest); + }, + 15 | 16 => { + // columns 15 and 16 are relevant for the hasher, memory and ace chiplets + let rest = hasher_fragment.push_column_slice(column); + // skip bitwise chiplet + let (_, rest) = rest.split_at_mut(bitwise.trace_len()); + let rest = memory_fragment.push_column_slice(rest); + ace_fragment.push_column_slice(rest); + }, + 17..=19 => { + // columns 17-19 are relevant for hasher, memory, and ace chiplets + // (hasher: mrupdate_id/is_start/is_final; memory: f_scw/w0/w1; ace cols) + let rest = hasher_fragment.push_column_slice(column); + // skip bitwise chiplet + let (_, rest) = rest.split_at_mut(bitwise.trace_len()); + let rest = memory_fragment.push_column_slice(rest); + ace_fragment.push_column_slice(rest); + }, + 20 => { + // column 20 is relevant only for the hasher chiplet (s_perm) + hasher_fragment.push_column_slice(column); + }, + _ => panic!("invalid column index"), + } } - } - // fill the fragments with the execution trace from each chiplet in parallel - // The chiplets are independent and can be processed concurrently - - // Fill independent chiplets in parallel: hasher, bitwise, memory, kernel_rom - // Note: ACE must be processed separately since it returns a value - // Use ThreadPool::install() to prevent nested parallelism from column operations - rayon::scope(|s| { - s.spawn(move |_| { - hasher.fill_trace(&mut hasher_fragment); - }); - s.spawn(move |_| { - bitwise.fill_trace(&mut bitwise_fragment); - }); - s.spawn(move |_| { - memory.fill_trace(&mut memory_fragment); + // Fill independent chiplets in parallel: hasher, bitwise, memory, kernel_rom. + // ACE must be processed separately since it returns a value. + rayon::scope(|s| { + s.spawn(move |_| { + hasher.fill_trace(&mut hasher_fragment); + }); + s.spawn(move |_| { + bitwise.fill_trace(&mut bitwise_fragment); + }); + s.spawn(move |_| { + memory.fill_trace(&mut memory_fragment); + }); + s.spawn(move |_| { + kernel_rom.fill_trace(&mut kernel_rom_fragment); + }); }); - s.spawn(move |_| { - kernel_rom.fill_trace(&mut kernel_rom_fragment); - }); - }); - // Process ACE chiplet separately as it returns ace_sections - let ace_sections = ace.fill_trace(&mut ace_fragment); - AceHints::new(ace_start, ace_sections) + let ace_sections = ace.fill_trace(&mut ace_fragment); + AceHints::new(ace_start, ace_sections) + } } } diff --git a/processor/src/trace/chiplets/tests.rs b/processor/src/trace/chiplets/tests.rs index fe1327c6f0..2a5193858b 100644 --- a/processor/src/trace/chiplets/tests.rs +++ b/processor/src/trace/chiplets/tests.rs @@ -4,15 +4,14 @@ use miden_air::trace::{ CHIPLETS_RANGE, CHIPLETS_WIDTH, chiplets::{ NUM_BITWISE_SELECTORS, NUM_KERNEL_ROM_SELECTORS, NUM_MEMORY_SELECTORS, - bitwise::{BITWISE_XOR, OP_CYCLE_LEN, TRACE_WIDTH as BITWISE_TRACE_WIDTH}, - hasher::{HASH_CYCLE_LEN, LAST_CYCLE_ROW, LINEAR_HASH, RETURN_STATE}, - kernel_rom::TRACE_WIDTH as KERNEL_ROM_TRACE_WIDTH, - memory::TRACE_WIDTH as MEMORY_TRACE_WIDTH, + bitwise::{self, BITWISE_XOR, OP_CYCLE_LEN}, + hasher::{CONTROLLER_ROWS_PER_PERMUTATION, HASH_CYCLE_LEN, LINEAR_HASH, S_PERM_COL_IDX}, + kernel_rom, memory, }, }; use miden_core::{ Felt, ONE, Word, ZERO, - mast::{BasicBlockNodeBuilder, MastForest, MastForestContributor}, + mast::{BasicBlockNodeBuilder, CallNodeBuilder, MastForest, MastForestContributor}, program::{Program, StackInputs}, }; @@ -22,98 +21,156 @@ use crate::{ type ChipletsTrace = [Vec; CHIPLETS_WIDTH]; +// HASHER TRACE LENGTH HELPERS +// ================================================================================================ + +/// Computes the total hasher trace length given the number of controller rows and unique +/// permutations. +/// +/// The controller region (including padding) is rounded up to the next multiple of +/// HASH_CYCLE_LEN, then the perm segment appends `unique_perms * HASH_CYCLE_LEN` rows. +fn hasher_trace_len(controller_rows: usize, unique_perms: usize) -> usize { + let controller_padded = controller_rows.next_multiple_of(HASH_CYCLE_LEN); + let perm_segment = unique_perms * HASH_CYCLE_LEN; + controller_padded + perm_segment +} + +// TESTS +// ================================================================================================ + #[test] fn hasher_chiplet_trace() { - // --- single hasher permutation with no stack manipulation ----------------------------------- + // --- single hasher permutation with no stack manipulation --- + // The program is a single basic block containing HPerm. + // This produces: + // - 1 span hash (LINEAR_HASH input + RETURN_HASH output) = 2 controller rows, 1 perm + // - 1 HPERM (RETURN_STATE input + RETURN_STATE output) = 2 controller rows, 1 perm + // Total: 4 controller rows padded to 16, 2 unique perms (32 perm rows) = 48 hasher rows. let stack = [2, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0]; let operations = vec![Operation::HPerm]; - let (chiplets_trace, trace_len) = build_trace(&stack, operations, Kernel::default()); + let (chiplets_trace, _trace_len) = build_trace(&stack, operations, Kernel::default()); - // Skip the hash of the span block generated while building the trace to check only the HPerm. - let hasher_start = HASH_CYCLE_LEN; - let hasher_end = hasher_start + HASH_CYCLE_LEN; - validate_hasher_trace(&chiplets_trace, hasher_start, hasher_end); + let controller_rows = 2 * CONTROLLER_ROWS_PER_PERMUTATION; // span hash + HPerm + let unique_perms = 2; + let hasher_len = hasher_trace_len(controller_rows, unique_perms); + assert_eq!(hasher_len, 48); - // Validate that the trace was padded correctly. - validate_padding(&chiplets_trace, hasher_end, trace_len); + validate_hasher_trace(&chiplets_trace, hasher_len, controller_rows, unique_perms); } #[test] fn bitwise_chiplet_trace() { - // --- single bitwise operation with no stack manipulation ------------------------------------ + // --- single bitwise operation with no stack manipulation --- + // This produces: 1 span hash (2 controller rows, 1 perm) = 32 hasher rows, then 8 bitwise. let stack = [4, 8]; let operations = vec![Operation::U32xor]; - let (chiplets_trace, trace_len) = build_trace(&stack, operations, Kernel::default()); + let (chiplets_trace, _trace_len) = build_trace(&stack, operations, Kernel::default()); - let bitwise_end = HASH_CYCLE_LEN + OP_CYCLE_LEN; - validate_bitwise_trace(&chiplets_trace, HASH_CYCLE_LEN, bitwise_end); + let controller_rows = CONTROLLER_ROWS_PER_PERMUTATION; // span hash only + let unique_perms = 1; + let hasher_len = hasher_trace_len(controller_rows, unique_perms); + assert_eq!(hasher_len, 32); - // Validate that the trace was padded correctly. - validate_padding(&chiplets_trace, bitwise_end, trace_len - 1); + let bitwise_start = hasher_len; + let bitwise_end = bitwise_start + OP_CYCLE_LEN; + validate_bitwise_trace(&chiplets_trace, bitwise_start, bitwise_end); } #[test] fn memory_chiplet_trace() { - // --- single memory operation with no stack manipulation ------------------------------------- + // --- single memory operation with no stack manipulation --- + // This produces: 1 span hash (32 hasher rows), then 1 memory row. let addr = Felt::from_u32(4); let stack = [1, 2, 3, 4]; let operations = vec![Operation::Push(addr), Operation::MStoreW]; - let (chiplets_trace, trace_len) = build_trace(&stack, operations, Kernel::default()); - let memory_trace_len = 1; + let (chiplets_trace, _trace_len) = build_trace(&stack, operations, Kernel::default()); - // Skip the hash cycle created by the span block when building the trace. - // Check the memory trace. - let memory_end = HASH_CYCLE_LEN + memory_trace_len; - validate_memory_trace(&chiplets_trace, HASH_CYCLE_LEN, memory_end); + let controller_rows = CONTROLLER_ROWS_PER_PERMUTATION; + let unique_perms = 1; + let hasher_len = hasher_trace_len(controller_rows, unique_perms); + assert_eq!(hasher_len, 32); - // Validate that the trace was padded correctly. - validate_padding(&chiplets_trace, memory_end, trace_len); + let memory_start = hasher_len; + validate_memory_trace(&chiplets_trace, memory_start, memory_start + 1); } #[test] fn stacked_chiplet_trace() { - // --- operations in hasher, bitwise, and memory processors without stack manipulation -------- + // --- operations in hasher, bitwise, and memory processors --- + // Operations: U32xor, Push(0), MStoreW, HPerm + // This produces: + // - 1 span hash (2 controller rows, 1 perm) for the basic block + // - 1 HPerm (2 controller rows, 1 perm) + // Total hasher: 4 controller rows padded to 16, 2 unique perms = 48 rows + // Then: 8 bitwise rows (U32xor), then 1 memory row (MStoreW) let stack = [8, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 1]; let ops = vec![Operation::U32xor, Operation::Push(ZERO), Operation::MStoreW, Operation::HPerm]; let kernel = build_kernel(); - let (chiplets_trace, trace_len) = build_trace(&stack, ops, kernel); - let memory_len = 1; - let ace_len = 0; - let kernel_rom_len = 2; - - // Skip the hash of the span block generated while building the trace to check only the HPerm. - let hasher_start = HASH_CYCLE_LEN; - let hasher_end = hasher_start + HASH_CYCLE_LEN; - validate_hasher_trace(&chiplets_trace, hasher_start, hasher_end); - - // Expect 1 operation cycle in the bitwise trace - let bitwise_end = hasher_end + OP_CYCLE_LEN; - validate_bitwise_trace(&chiplets_trace, hasher_end, bitwise_end); - - // expect 1 row of memory trace - let memory_end = bitwise_end + memory_len; - validate_memory_trace(&chiplets_trace, bitwise_end, memory_end); - - let ace_end = memory_end + ace_len; - let kernel_rom_end = memory_end + ace_len + kernel_rom_len; - validate_kernel_rom_trace(&chiplets_trace, ace_end, kernel_rom_end); - - // Validate that the trace was padded correctly. - validate_padding(&chiplets_trace, kernel_rom_end, trace_len); + let (chiplets_trace, _trace_len) = build_trace(&stack, ops, kernel); + + let controller_rows = 2 * CONTROLLER_ROWS_PER_PERMUTATION; // span hash + HPerm + let unique_perms = 2; + let hasher_len = hasher_trace_len(controller_rows, unique_perms); + assert_eq!(hasher_len, 48); + + // Validate hasher region + validate_hasher_trace(&chiplets_trace, hasher_len, controller_rows, unique_perms); + + // Bitwise starts right after hasher + let bitwise_start = hasher_len; + let bitwise_end = bitwise_start + OP_CYCLE_LEN; + validate_bitwise_trace(&chiplets_trace, bitwise_start, bitwise_end); + + // Memory starts right after bitwise + let memory_start = bitwise_end; + validate_memory_trace(&chiplets_trace, memory_start, memory_start + 1); + + // After memory comes kernel ROM (2 entries from build_kernel) then padding + let kernel_rom_start = memory_start + 1; + let kernel_rom_end = kernel_rom_start + 2; // 2 kernel procedures + validate_kernel_rom_trace(&chiplets_trace, kernel_rom_start, kernel_rom_end); + + // Padding fills the remainder + let padding_start = kernel_rom_end; + let trace_rows = chiplets_trace[0].len(); + validate_padding(&chiplets_trace, padding_start, trace_rows); +} + +#[test] +fn regression_trace_build_does_not_panic_when_first_memory_access_clk_is_zero() { + let processor = FastProcessor::new(StackInputs::default()); + let mut host = DefaultHost::default(); + + // A CALL entrypoint records the callee frame pointer write before the processor clock is + // incremented, so the first memory access is captured at clk = 0. + let program = { + let mut forest = MastForest::new(); + + let callee = BasicBlockNodeBuilder::new(vec![Operation::Noop], Vec::new()) + .add_to_forest(&mut forest) + .unwrap(); + forest.make_root(callee); + + let entry = CallNodeBuilder::new(callee).add_to_forest(&mut forest).unwrap(); + forest.make_root(entry); + + Program::with_kernel(forest.into(), entry, Kernel::default()) + }; + + let trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); + + let _trace = crate::trace::build_trace(trace_inputs).unwrap(); } // HELPER FUNCTIONS // ================================================================================================ -/// Creates a kernel with two dummy procedures fn build_kernel() -> Kernel { let proc_hash1 = Word::from([1_u32, 0, 1, 0]); let proc_hash2 = Word::from([1_u32, 1, 1, 1]); Kernel::new(&[proc_hash1, proc_hash2]).unwrap() } -/// Builds a sample trace by executing a span block containing the specified operations. This -/// results in 1 additional hash cycle (8 rows) at the beginning of the hash chiplet. fn build_trace( stack_inputs: &[u64], operations: Vec, @@ -129,23 +186,17 @@ fn build_trace( let mut host = DefaultHost::default(); let program = { let mut mast_forest = MastForest::new(); - let basic_block_id = BasicBlockNodeBuilder::new(operations, Vec::new()) .add_to_forest(&mut mast_forest) .unwrap(); mast_forest.make_root(basic_block_id); - Program::with_kernel(mast_forest.into(), basic_block_id, kernel) }; - let (execution_output, trace_generation_context) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); - let trace = - crate::trace::build_trace(execution_output, trace_generation_context, program.to_info()) - .unwrap(); + let trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); + let trace = crate::trace::build_trace(trace_inputs).unwrap(); let trace_len = trace.get_trace_len(); - ( trace .get_column_range(CHIPLETS_RANGE) @@ -155,109 +206,213 @@ fn build_trace( ) } -/// Validate the hasher trace output by the hperm operation. The full hasher trace is tested in -/// the Hasher module, so this just tests the ChipletsTrace selectors and the initial columns -/// of the hasher trace. -#[expect(clippy::needless_range_loop)] -fn validate_hasher_trace(trace: &ChipletsTrace, start: usize, end: usize) { - // The selectors should match the hasher selectors - for row in start..end { - // The selectors should match the selectors for the hasher segment - assert_eq!(ZERO, trace[0][row]); - - match row % HASH_CYCLE_LEN { - 0 => { - // in the first row, the expected start of the trace should hold the initial - // selectors - assert_eq!(LINEAR_HASH, [trace[1][row], trace[2][row], trace[3][row]]); +// VALIDATION FUNCTIONS +// ================================================================================================ + +/// Validates the hasher region of the chiplets trace. +/// +/// Checks: +/// - s_ctrl (column 0) = 1 on controller rows, 0 on permutation rows +/// - s_perm (column 20) = 0 on controller rows, 1 on permutation rows +/// - Controller rows (s_perm=0): correct selectors for operation type, is_start/is_final flags +/// - Padding rows: selectors [0, 1, 0], non-selector columns are zero +/// - Perm segment rows (s_perm=1): selectors are zero (don't-care), s_perm=1 +fn validate_hasher_trace( + trace: &ChipletsTrace, + expected_len: usize, + controller_rows: usize, + unique_perms: usize, +) { + // Column indices within chiplets trace. + // Column 0 = s_ctrl, column 20 = s_perm. Hasher internal columns start at column 1. + let s0_col = 1; // hasher selector s0 + let s1_col = 2; // hasher selector s1 + let s2_col = 3; // hasher selector s2 + let s_perm_col = 1 + S_PERM_COL_IDX; // s_perm in chiplets trace (= column 20) + + let controller_padded = controller_rows.next_multiple_of(HASH_CYCLE_LEN); + let perm_segment_start = controller_padded; + let perm_segment_len = unique_perms * HASH_CYCLE_LEN; + + assert_eq!(expected_len, controller_padded + perm_segment_len); + + // --- Check s_ctrl and s_perm for all hasher rows --- + // Controller rows (including padding): s_ctrl=1, s_perm=0 + for row in 0..controller_padded { + assert_eq!(trace[0][row], ONE, "s_ctrl should be 1 for controller row {row}"); + assert_eq!(trace[s_perm_col][row], ZERO, "s_perm should be 0 for controller row {row}"); + } + // Permutation rows: s_ctrl=0, s_perm=1 + for row in perm_segment_start..expected_len { + assert_eq!(trace[0][row], ZERO, "s_ctrl should be 0 for perm row {row}"); + assert_eq!(trace[s_perm_col][row], ONE, "s_perm should be 1 for perm row {row}"); + } + + // --- Check controller rows (s_perm = 0) --- + // Controller rows come in pairs: input row (is_start varies) + output row (is_final varies). + // For a span hash: input has LINEAR_HASH selectors, output has RETURN_HASH selectors. + // For HPerm: input has LINEAR_HASH selectors, output has RETURN_STATE selectors. + for row in 0..controller_rows { + let is_input_row = row % CONTROLLER_ROWS_PER_PERMUTATION == 0; + if is_input_row { + // Input rows have s0=1 (LINEAR_HASH[0]) + assert_eq!( + trace[s0_col][row], LINEAR_HASH[0], + "controller input row {row}: s0 should be {} (LINEAR_HASH)", + LINEAR_HASH[0] + ); + } else { + // Output rows have s0=0 (RETURN_HASH or RETURN_STATE) + assert_eq!( + trace[s0_col][row], ZERO, + "controller output row {row}: s0 should be 0 (RETURN_*)" + ); + } + } + + // --- Check padding rows --- + // Padding rows fill from controller_rows to controller_padded. + // Padding selectors are [0, 1, 0] (matching PERM_STEP pattern but in controller region). + let padding_start = controller_rows; + for row in padding_start..controller_padded { + // Padding selectors: s0=0, s1=1, s2=0 + assert_eq!(trace[s0_col][row], ZERO, "padding row {row}: s0 should be 0"); + assert_eq!(trace[s1_col][row], ONE, "padding row {row}: s1 should be 1"); + assert_eq!(trace[s2_col][row], ZERO, "padding row {row}: s2 should be 0"); + + // Non-selector hasher columns should be zero on padding rows. + // Hasher state columns (indices 4..16 in chiplets trace = hasher cols 3..15) + for col in 4..=CHIPLETS_WIDTH - 1 { + assert_eq!(trace[col][row], ZERO, "padding row {row}, col {col} should be zero"); + } + } + + // --- Check perm segment rows (s_perm = 1) --- + for row in perm_segment_start..expected_len { + // On perm rows, s0/s1/s2 serve as witness columns for packed internal rounds. + // They are zero on external/boundary rows (offsets 0-3, 12-15 within each cycle), + // and hold S-box witnesses on packed-internal rows (offsets 4-10) and the int+ext + // row (offset 11, s0 only). + let offset_in_cycle = (row - perm_segment_start) % HASH_CYCLE_LEN; + match offset_in_cycle { + 0..=3 | 12..=15 => { + assert_eq!(trace[s0_col][row], ZERO, "perm row {row}: s0 should be 0"); + assert_eq!(trace[s1_col][row], ZERO, "perm row {row}: s1 should be 0"); + assert_eq!(trace[s2_col][row], ZERO, "perm row {row}: s2 should be 0"); }, - r if r == LAST_CYCLE_ROW => { - // in the last row, the expected start of the trace should hold the final selectors - assert_eq!(RETURN_STATE, [trace[1][row], trace[2][row], trace[3][row]]); + 4..=10 => { + // Packed internal: all 3 witnesses may be nonzero (no assertion on value) }, - _ => { - // in the other rows, the expected start of the trace should hold the mid selectors - assert_eq!( - [ZERO, LINEAR_HASH[1], LINEAR_HASH[2]], - [trace[1][row], trace[2][row], trace[3][row]] - ); + 11 => { + // Int+ext: s0 holds witness, s1 and s2 are zero + assert_eq!(trace[s1_col][row], ZERO, "perm row {row}: s1 should be 0"); + assert_eq!(trace[s2_col][row], ZERO, "perm row {row}: s2 should be 0"); }, + _ => unreachable!(), } } } -/// Validate the bitwise trace output by the u32xor operation. The full bitwise trace is tested in -/// the Bitwise module, so this just tests the ChipletsTrace selectors, the initial columns -/// of the bitwise trace, and the final columns after the bitwise trace. +/// Validates the bitwise region of the chiplets trace. +/// +/// Checks: +/// - Chiplet selectors: s_ctrl=0, s1=0, s_perm=0 +/// - Bitwise operation selector = XOR +/// - Columns beyond bitwise trace width + selectors are zero fn validate_bitwise_trace(trace: &ChipletsTrace, start: usize, end: usize) { - // The selectors should match the bitwise selectors - for row in start..end { - // The selectors should match the selectors for the bitwise segment - assert_eq!(ONE, trace[0][row]); - assert_eq!(ZERO, trace[1][row]); - - // the expected start of the bitwise trace should hold the expected bitwise op selectors - assert_eq!(BITWISE_XOR, trace[2][row]); + // Bitwise uses NUM_BITWISE_SELECTORS (2) chiplet selector columns + bitwise::TRACE_WIDTH (13) + // internal columns = 15 columns total. Columns 15..CHIPLETS_WIDTH should be zero. + let bitwise_used_cols = NUM_BITWISE_SELECTORS + bitwise::TRACE_WIDTH; - // the final columns should be padded - for column in trace.iter().skip(BITWISE_TRACE_WIDTH + NUM_BITWISE_SELECTORS) { - assert_eq!(ZERO, column[row]); + for row in start..end { + // Chiplet selectors: s_ctrl=0, s1=0 (active via virtual s0 * !s1) + assert_eq!(ZERO, trace[0][row], "bitwise s_ctrl at row {row}"); + assert_eq!(ZERO, trace[1][row], "bitwise s1 at row {row}"); + + // Internal bitwise operation selector (XOR) + assert_eq!(BITWISE_XOR, trace[NUM_BITWISE_SELECTORS][row], "bitwise op at row {row}"); + + // Columns beyond bitwise trace should be zero + for col in bitwise_used_cols..CHIPLETS_WIDTH { + assert_eq!( + trace[col][row], ZERO, + "bitwise padding col {col} at row {row} should be zero" + ); } } } -/// Validate the bitwise trace output by the storew operation. The full memory trace is tested in -/// the Memory module, so this just tests the ChipletsTrace selectors and the final columns after -/// the memory trace. +/// Validates the memory region of the chiplets trace. +/// +/// Checks: +/// - Chiplet selectors: s_ctrl=0, s1=1, s2=0, s_perm=0 +/// - Column beyond memory trace width + selectors is zero fn validate_memory_trace(trace: &ChipletsTrace, start: usize, end: usize) { + // Memory uses NUM_MEMORY_SELECTORS (3) chiplet selector columns + memory::TRACE_WIDTH (17) + // internal columns = 20 columns total. Column 20 should be zero. + let memory_used_cols = NUM_MEMORY_SELECTORS + memory::TRACE_WIDTH; + for row in start..end { - // The selectors should match the memory selectors - assert_eq!(ONE, trace[0][row]); - assert_eq!(ONE, trace[1][row]); - assert_eq!(ZERO, trace[2][row]); - - // the final columns should be padded - for column in trace.iter().skip(MEMORY_TRACE_WIDTH + NUM_MEMORY_SELECTORS) { - assert_eq!(ZERO, column[row]); + // Chiplet selectors: s_ctrl=0, s1=1, s2=0 (active via virtual s0 * s1 * !s2) + assert_eq!(ZERO, trace[0][row], "memory s_ctrl at row {row}"); + assert_eq!(ONE, trace[1][row], "memory s1 at row {row}"); + assert_eq!(ZERO, trace[2][row], "memory s2 at row {row}"); + + // Columns beyond memory trace should be zero + for col in memory_used_cols..CHIPLETS_WIDTH { + assert_eq!( + trace[col][row], ZERO, + "memory padding col {col} at row {row} should be zero" + ); } } } -/// Validate the kernel ROM trace output for a kernel with two procedures and no access calls. The -/// full kernel ROM trace is tested in the KernelRom module, so this just tests the ChipletsTrace -/// selectors, the first column of the trace, and the final columns after the kernel ROM trace. +/// Validates the kernel ROM region of the chiplets trace. +/// +/// Checks: +/// - Chiplet selectors: s_ctrl=0, s1=1, s2=1, s3=1, s4=0, s_perm=0 +/// - Columns beyond kernel ROM trace width + selectors are zero fn validate_kernel_rom_trace(trace: &ChipletsTrace, start: usize, end: usize) { + // Kernel ROM uses NUM_KERNEL_ROM_SELECTORS (5) chiplet selector columns + + // kernel_rom::TRACE_WIDTH (5) internal columns = 10 columns total. + let kernel_rom_used_cols = NUM_KERNEL_ROM_SELECTORS + kernel_rom::TRACE_WIDTH; + for row in start..end { - // The selectors should match the kernel selectors - assert_eq!(ONE, trace[0][row]); - assert_eq!(ONE, trace[1][row]); - assert_eq!(ONE, trace[2][row]); - assert_eq!(ONE, trace[3][row]); - - // the s0 column of kernel ROM must be set to ZERO as there were no kernel accesses - assert_eq!(ZERO, trace[4][row]); - - // the final columns should be padded - for column in trace.iter().skip(KERNEL_ROM_TRACE_WIDTH + NUM_KERNEL_ROM_SELECTORS) { - assert_eq!(ZERO, column[row]); + // Chiplet selectors: s_ctrl=0, s1=1, s2=1, s3=1, s4=0 + // (active via virtual s0 * s1 * s2 * s3 * !s4) + assert_eq!(ZERO, trace[0][row], "kernel_rom s_ctrl at row {row}"); + assert_eq!(ONE, trace[1][row], "kernel_rom s1 at row {row}"); + assert_eq!(ONE, trace[2][row], "kernel_rom s2 at row {row}"); + assert_eq!(ONE, trace[3][row], "kernel_rom s3 at row {row}"); + assert_eq!(ZERO, trace[4][row], "kernel_rom s4 at row {row}"); + + // Columns beyond kernel ROM trace should be zero + for col in kernel_rom_used_cols..CHIPLETS_WIDTH { + assert_eq!( + trace[col][row], ZERO, + "kernel_rom padding col {col} at row {row} should be zero" + ); } } } -/// Checks that the final section of the chiplets module's trace after the kernel ROM chiplet is -/// padded and has the correct selectors. +/// Validates the padding region at the end of the chiplets trace. +/// +/// Checks: +/// - s_ctrl (column 0) = 0, s1..s4 (columns 1-4) = 1, s_perm (column 20) = 0 +/// - All remaining columns (5..CHIPLETS_WIDTH) are zero fn validate_padding(trace: &ChipletsTrace, start: usize, end: usize) { for row in start..end { - // selectors - assert_eq!(ONE, trace[0][row]); - assert_eq!(ONE, trace[1][row]); - assert_eq!(ONE, trace[2][row]); - assert_eq!(ONE, trace[3][row]); - assert_eq!(ONE, trace[4][row]); - - // padding - trace.iter().skip(5).for_each(|column| { - assert_eq!(ZERO, column[row]); - }); + // s_ctrl = 0 on padding rows + assert_eq!(ZERO, trace[0][row], "padding s_ctrl at row {row}"); + // s1..s4 = 1 on padding rows + for col in 1..5 { + assert_eq!(ONE, trace[col][row], "padding s{col} at row {row}"); + } + // All non-selector columns should be zero (including s_perm at column 20) + for col in 5..CHIPLETS_WIDTH { + assert_eq!(ZERO, trace[col][row], "padding data col {col} at row {row} should be zero"); + } } } diff --git a/processor/src/trace/decoder/aux_trace/block_hash_table.rs b/processor/src/trace/decoder/aux_trace/block_hash_table.rs index 523f7ebbc8..88fc15782c 100644 --- a/processor/src/trace/decoder/aux_trace/block_hash_table.rs +++ b/processor/src/trace/decoder/aux_trace/block_hash_table.rs @@ -1,4 +1,4 @@ -use miden_air::trace::{Challenges, RowIndex}; +use miden_air::trace::{Challenges, RowIndex, bus_types::BLOCK_HASH_TABLE}; use miden_core::{Word, ZERO, field::ExtensionField, operations::opcodes}; use super::{AuxColumnBuilder, Felt, MainTrace, ONE}; @@ -235,15 +235,18 @@ impl BlockHashTableRow { pub fn collapse>(&self, challenges: &Challenges) -> E { let is_first_child = if self.is_first_child { ONE } else { ZERO }; let is_loop_body = if self.is_loop_body { ONE } else { ZERO }; - challenges.encode([ - self.parent_block_id, - self.child_block_hash[0], - self.child_block_hash[1], - self.child_block_hash[2], - self.child_block_hash[3], - is_first_child, - is_loop_body, - ]) + challenges.encode( + BLOCK_HASH_TABLE, + [ + self.parent_block_id, + self.child_block_hash[0], + self.child_block_hash[1], + self.child_block_hash[2], + self.child_block_hash[3], + is_first_child, + is_loop_body, + ], + ) } // TEST diff --git a/processor/src/trace/decoder/aux_trace/block_stack_table.rs b/processor/src/trace/decoder/aux_trace/block_stack_table.rs index 74b2d4cb83..38984142b0 100644 --- a/processor/src/trace/decoder/aux_trace/block_stack_table.rs +++ b/processor/src/trace/decoder/aux_trace/block_stack_table.rs @@ -1,4 +1,4 @@ -use miden_air::trace::{Challenges, RowIndex}; +use miden_air::trace::{Challenges, RowIndex, bus_types::BLOCK_STACK_TABLE}; use miden_core::{field::ExtensionField, operations::opcodes}; use super::{AuxColumnBuilder, Felt, MainTrace, ONE, ZERO}; @@ -78,7 +78,7 @@ fn get_block_stack_table_respan_multiplicand>( let parent_id = main_trace.decoder_hasher_state_element(1, i + 1); let is_loop = ZERO; - challenges.encode([block_id, parent_id, is_loop]) + challenges.encode(BLOCK_STACK_TABLE, [block_id, parent_id, is_loop]) } /// Computes the multiplicand representing the removal of a row from the block stack table when @@ -98,20 +98,23 @@ fn get_block_stack_table_end_multiplicand>( let parent_next_overflow_addr = main_trace.parent_overflow_address(i + 1); let parent_fn_hash = main_trace.fn_hash(i + 1); - challenges.encode([ - block_id, - parent_id, - is_loop, - parent_ctx, - parent_stack_depth, - parent_next_overflow_addr, - parent_fn_hash[0], - parent_fn_hash[1], - parent_fn_hash[2], - parent_fn_hash[3], - ]) + challenges.encode( + BLOCK_STACK_TABLE, + [ + block_id, + parent_id, + is_loop, + parent_ctx, + parent_stack_depth, + parent_next_overflow_addr, + parent_fn_hash[0], + parent_fn_hash[1], + parent_fn_hash[2], + parent_fn_hash[3], + ], + ) } else { - challenges.encode([block_id, parent_id, is_loop]) + challenges.encode(BLOCK_STACK_TABLE, [block_id, parent_id, is_loop]) } } @@ -139,36 +142,42 @@ fn get_block_stack_table_inclusion_multiplicand>( let parent_stack_depth = main_trace.stack_depth(i); let parent_next_overflow_addr = main_trace.parent_overflow_address(i); let parent_fn_hash = main_trace.fn_hash(i); - challenges.encode([ - block_id, - parent_id, - is_loop, - parent_ctx, - parent_stack_depth, - parent_next_overflow_addr, - parent_fn_hash[0], - parent_fn_hash[1], - parent_fn_hash[2], - parent_fn_hash[3], - ]) + challenges.encode( + BLOCK_STACK_TABLE, + [ + block_id, + parent_id, + is_loop, + parent_ctx, + parent_stack_depth, + parent_next_overflow_addr, + parent_fn_hash[0], + parent_fn_hash[1], + parent_fn_hash[2], + parent_fn_hash[3], + ], + ) } else if op_code == opcodes::DYNCALL { let parent_ctx = main_trace.ctx(i); let parent_stack_depth = main_trace.decoder_hasher_state_element(4, i); let parent_next_overflow_addr = main_trace.decoder_hasher_state_element(5, i); let parent_fn_hash = main_trace.fn_hash(i); - challenges.encode([ - block_id, - parent_id, - is_loop, - parent_ctx, - parent_stack_depth, - parent_next_overflow_addr, - parent_fn_hash[0], - parent_fn_hash[1], - parent_fn_hash[2], - parent_fn_hash[3], - ]) + challenges.encode( + BLOCK_STACK_TABLE, + [ + block_id, + parent_id, + is_loop, + parent_ctx, + parent_stack_depth, + parent_next_overflow_addr, + parent_fn_hash[0], + parent_fn_hash[1], + parent_fn_hash[2], + parent_fn_hash[3], + ], + ) } else { - challenges.encode([block_id, parent_id, is_loop]) + challenges.encode(BLOCK_STACK_TABLE, [block_id, parent_id, is_loop]) } } diff --git a/processor/src/trace/decoder/aux_trace/op_group_table.rs b/processor/src/trace/decoder/aux_trace/op_group_table.rs index 3e984ac24f..5520e1dad4 100644 --- a/processor/src/trace/decoder/aux_trace/op_group_table.rs +++ b/processor/src/trace/decoder/aux_trace/op_group_table.rs @@ -1,5 +1,6 @@ use miden_air::trace::{ Challenges, RowIndex, + bus_types::OP_GROUP_TABLE, decoder::{OP_BATCH_2_GROUPS, OP_BATCH_4_GROUPS, OP_BATCH_8_GROUPS}, }; use miden_core::{field::ExtensionField, operations::opcodes}; @@ -74,16 +75,18 @@ fn get_op_group_table_inclusion_multiplicand>( if op_batch_flag == OP_BATCH_8_GROUPS { let h = main_trace.decoder_hasher_state(i); (1..8_u8).fold(E::ONE, |acc, k| { - acc * challenges.encode([block_id, group_count - Felt::from_u8(k), h[k as usize]]) + acc * challenges + .encode(OP_GROUP_TABLE, [block_id, group_count - Felt::from_u8(k), h[k as usize]]) }) } else if op_batch_flag == OP_BATCH_4_GROUPS { let h = main_trace.decoder_hasher_state_first_half(i); (1..4_u8).fold(E::ONE, |acc, k| { - acc * challenges.encode([block_id, group_count - Felt::from_u8(k), h[k as usize]]) + acc * challenges + .encode(OP_GROUP_TABLE, [block_id, group_count - Felt::from_u8(k), h[k as usize]]) }) } else if op_batch_flag == OP_BATCH_2_GROUPS { let h = main_trace.decoder_hasher_state_first_half(i); - challenges.encode([block_id, group_count - ONE, h[1]]) + challenges.encode(OP_GROUP_TABLE, [block_id, group_count - ONE, h[1]]) } else { E::ONE } @@ -110,5 +113,5 @@ fn get_op_group_table_removal_multiplicand>( } }; - challenges.encode([block_id, group_count, group_value]) + challenges.encode(OP_GROUP_TABLE, [block_id, group_count, group_value]) } diff --git a/processor/src/trace/decoder/block_stack.rs b/processor/src/trace/decoder/block_stack.rs index af1e0565e8..901d917a6c 100644 --- a/processor/src/trace/decoder/block_stack.rs +++ b/processor/src/trace/decoder/block_stack.rs @@ -1,14 +1,19 @@ use alloc::vec::Vec; use miden_air::Felt; -use miden_core::{ONE, Word, ZERO}; +use miden_core::{Word, ZERO}; use crate::ContextId; // BLOCK STACK // ================================================================================================ -/// Keeps track of code blocks which are currently being executed by the VM. +/// Tracks per-block data needed for trace generation that the [`ContinuationStack`] does not +/// carry. Specifically, it stores the hasher chiplet addresses (`addr`, `parent_addr`) assigned +/// during execution, and for CALL/SYSCALL/DYNCALL blocks, the caller's execution context so it +/// can be restored on END. +/// +/// [`ContinuationStack`]: crate::continuation_stack::ContinuationStack #[derive(Debug, Default, Clone)] pub struct BlockStack { blocks: Vec, @@ -20,68 +25,24 @@ impl BlockStack { /// Pushes a new code block onto the block stack and returns the address of the block's parent. /// - /// The block is identified by its address, and we also need to know what type of a block this - /// is. Additionally, for CALL, SYSCALL and DYNCALL blocks, execution context info must be - /// provided. Other information (i.e., the block's parent, whether the block is a body of a loop - /// or a first child of a JOIN block) is determined from the information already on the stack. - pub fn push( - &mut self, - addr: Felt, - block_type: BlockType, - ctx_info: Option, - ) -> Felt { - // make sure execution context was provided for CALL, SYSCALL and DYNCALL blocks - if block_type == BlockType::Call - || block_type == BlockType::SysCall - || block_type == BlockType::Dyncall - { - debug_assert!(ctx_info.is_some(), "no execution context provided for a CALL block"); - } else { - debug_assert!(ctx_info.is_none(), "execution context provided for a non-CALL block"); - } - - // determine additional info about the new block based on its parent - let (parent_addr, is_loop_body, _is_first_child) = match self.blocks.last() { - Some(parent) => match parent.block_type { - // if the parent block is a LOOP block, the new block must be a loop body - BlockType::Loop(loop_entered) => { - debug_assert!(loop_entered, "parent is un-entered loop"); - (parent.addr, true, false) - }, - // if the parent block is a JOIN block, figure out if the new block is the first - // or the second child - BlockType::Join(first_child_executed) => { - (parent.addr, false, !first_child_executed) - }, - _ => (parent.addr, false, false), - }, - // if the block stack is empty, a new block is neither a body of a loop nor the first - // child of a JOIN block; also, we set the parent address to ZERO. - None => (ZERO, false, false), + /// The block is identified by its address. For CALL, SYSCALL and DYNCALL blocks, execution + /// context info must be provided so that the caller's context can be restored on END. + /// + /// When the block is later popped (on END), the flags for the trace row are fully reconstructed + /// from the continuation stack, and hence do not need to be stored in this data structure. + pub fn push(&mut self, addr: Felt, ctx_info: Option) -> Felt { + let parent_addr = match self.blocks.last() { + Some(parent) => parent.addr, + None => ZERO, }; - self.blocks.push(BlockInfo { - addr, - block_type, - parent_addr, - ctx_info, - is_loop_body, - }); + self.blocks.push(BlockInfo { addr, parent_addr, ctx_info }); parent_addr } /// Removes a block from the top of the stack and returns it. pub fn pop(&mut self) -> BlockInfo { - let block = self.blocks.pop().expect("block stack is empty"); - // if the parent block is a JOIN block (i.e., we just finished executing a child of a JOIN - // block) and if the first_child_executed hasn't been set to true yet, set it to true - if let Some(parent) = self.blocks.last_mut() - && let BlockType::Join(first_child_executed) = parent.block_type - && !first_child_executed - { - parent.block_type = BlockType::Join(true); - } - block + self.blocks.pop().expect("block stack is empty") } /// Returns true if the block stack is empty. @@ -107,43 +68,8 @@ impl BlockStack { #[derive(Debug, Clone)] pub struct BlockInfo { pub addr: Felt, - block_type: BlockType, pub parent_addr: Felt, pub ctx_info: Option, - pub is_loop_body: bool, -} - -impl BlockInfo { - /// Returns ONE if the this block is a LOOP block and the body of the loop was executed at - /// least once; otherwise, returns ZERO. - pub fn is_entered_loop(&self) -> Felt { - if self.block_type == BlockType::Loop(true) { - ONE - } else { - ZERO - } - } - - /// Returns ONE if this block is a body of a LOOP block; otherwise returns ZERO. - pub const fn is_loop_body(&self) -> Felt { - if self.is_loop_body { ONE } else { ZERO } - } - - /// Returns ONE if this block is a CALL or DYNCALL block; otherwise returns ZERO. - pub const fn is_call(&self) -> Felt { - match self.block_type { - BlockType::Call | BlockType::Dyncall => ONE, - _ => ZERO, - } - } - - /// Returns ONE if this block is a SYSCALL block; otherwise returns ZERO. - pub const fn is_syscall(&self) -> Felt { - match self.block_type { - BlockType::SysCall => ONE, - _ => ZERO, - } - } } // EXECUTION CONTEXT INFO @@ -180,19 +106,3 @@ impl ExecutionContextInfo { } } } - -// BLOCK TYPE -// ================================================================================================ - -/// Specifies type of a code block with additional info for some block types. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum BlockType { - Join(bool), // internal value set to true when the first child is fully executed - Split, - Loop(bool), // internal value set to false if the loop is never entered - Call, - Dyn, - Dyncall, - SysCall, - BasicBlock, -} diff --git a/processor/src/trace/execution_tracer.rs b/processor/src/trace/execution_tracer.rs index 6f167d7e3d..330f6ba9b9 100644 --- a/processor/src/trace/execution_tracer.rs +++ b/processor/src/trace/execution_tracer.rs @@ -1,16 +1,18 @@ use alloc::{sync::Arc, vec::Vec}; -use miden_air::trace::chiplets::hasher::{HASH_CYCLE_LEN, HASH_CYCLE_LEN_FELT, STATE_WIDTH}; +use miden_air::trace::chiplets::hasher::{ + CONTROLLER_ROWS_PER_PERM_FELT, CONTROLLER_ROWS_PER_PERMUTATION, STATE_WIDTH, +}; use miden_core::{FMP_ADDR, FMP_INIT_VALUE, operations::Operation}; use super::{ - decoder::block_stack::{BlockInfo, BlockStack, BlockType, ExecutionContextInfo}, + decoder::block_stack::{BlockInfo, BlockStack, ExecutionContextInfo}, stack::OverflowTable, trace_state::{ AceReplay, AdviceReplay, BitwiseReplay, BlockAddressReplay, BlockStackReplay, CoreTraceFragmentContext, CoreTraceState, DecoderState, ExecutionContextReplay, ExecutionContextSystemInfo, ExecutionReplay, HasherRequestReplay, HasherResponseReplay, - KernelReplay, MastForestResolutionReplay, MemoryReadsReplay, MemoryWritesReplay, NodeFlags, + KernelReplay, MastForestResolutionReplay, MemoryReadsReplay, MemoryWritesReplay, RangeCheckerReplay, StackOverflowReplay, StackState, SystemState, }, utils::split_u32_into_u16, @@ -42,6 +44,7 @@ struct StateSnapshot { // TRACE GENERATION CONTEXT // ================================================================================================ +#[derive(Debug)] pub struct TraceGenerationContext { /// The list of trace fragment contexts built during execution. pub core_trace_contexts: Vec, @@ -233,7 +236,7 @@ impl ExecutionTracer { processor: &P, current_forest: &MastForest, ) { - let (ctx_info, block_type) = match node { + let ctx_info = match node { MastNode::Join(node) => { let child1_hash = current_forest .get_node_by_id(node.first()) @@ -250,7 +253,7 @@ impl ExecutionTracer { node.digest(), ); - (None, BlockType::Join(false)) + None }, MastNode::Split(node) => { let child1_hash = current_forest @@ -268,7 +271,7 @@ impl ExecutionTracer { node.digest(), ); - (None, BlockType::Split) + None }, MastNode::Loop(node) => { let body_hash = current_forest @@ -283,12 +286,7 @@ impl ExecutionTracer { node.digest(), ); - let loop_entered = { - let condition = processor.stack().get(0); - condition == ONE - }; - - (None, BlockType::Loop(loop_entered)) + None }, MastNode::Call(node) => { let callee_hash = current_forest @@ -303,22 +301,13 @@ impl ExecutionTracer { node.digest(), ); - let exec_ctx = { - let overflow_addr = self.overflow_table.last_update_clk_in_current_ctx(); - ExecutionContextInfo::new( - processor.system().ctx(), - processor.system().caller_hash(), - processor.stack().depth(), - overflow_addr, - ) - }; - let block_type = if node.is_syscall() { - BlockType::SysCall - } else { - BlockType::Call - }; - - (Some(exec_ctx), block_type) + let overflow_addr = self.overflow_table.last_update_clk_in_current_ctx(); + Some(ExecutionContextInfo::new( + processor.system().ctx(), + processor.system().caller_hash(), + processor.stack().depth(), + overflow_addr, + )) }, MastNode::Dyn(dyn_node) => { self.hasher_for_chiplet.record_hash_control_block( @@ -329,27 +318,24 @@ impl ExecutionTracer { ); if dyn_node.is_dyncall() { - let exec_ctx = { - let overflow_addr = self.overflow_table.last_update_clk_in_current_ctx(); - // Note: the stack depth to record is the `current_stack_depth - 1` due to - // the semantics of DYNCALL. That is, the top of the - // stack contains the memory address to where the - // address to dynamically call is located. Then, the - // DYNCALL operation performs a drop, and - // records the stack depth after the drop as the beginning of - // the new context. For more information, look at the docs for how the - // constraints are designed; it's a bit tricky but it works. - let stack_depth_after_drop = processor.stack().depth() - 1; - ExecutionContextInfo::new( - processor.system().ctx(), - processor.system().caller_hash(), - stack_depth_after_drop, - overflow_addr, - ) - }; - (Some(exec_ctx), BlockType::Dyncall) + let overflow_addr = self.overflow_table.last_update_clk_in_current_ctx(); + // Note: the stack depth to record is the `current_stack_depth - 1` due to + // the semantics of DYNCALL. That is, the top of the + // stack contains the memory address to where the + // address to dynamically call is located. Then, the + // DYNCALL operation performs a drop, and + // records the stack depth after the drop as the beginning of + // the new context. For more information, look at the docs for how the + // constraints are designed; it's a bit tricky but it works. + let stack_depth_after_drop = processor.stack().depth() - 1; + Some(ExecutionContextInfo::new( + processor.system().ctx(), + processor.system().caller_hash(), + stack_depth_after_drop, + overflow_addr, + )) } else { - (None, BlockType::Dyn) + None } }, MastNode::Block(_) => panic!( @@ -361,31 +347,21 @@ impl ExecutionTracer { }; let block_addr = self.hasher_chiplet_shim.record_hash_control_block(); - let parent_addr = self.block_stack.push(block_addr, block_type, ctx_info); + let parent_addr = self.block_stack.push(block_addr, ctx_info); self.block_stack_replay.record_node_start_parent_addr(parent_addr); } - /// Records the block address and flags for an END operation based on the block being popped. + /// Records the block address for an END operation based on the block being popped. #[inline(always)] fn record_node_end(&mut self, block_info: &BlockInfo) { - let flags = NodeFlags::new( - block_info.is_loop_body() == ONE, - block_info.is_entered_loop() == ONE, - block_info.is_call() == ONE, - block_info.is_syscall() == ONE, - ); let (prev_addr, prev_parent_addr) = if self.block_stack.is_empty() { (ZERO, ZERO) } else { let prev_block = self.block_stack.peek(); (prev_block.addr, prev_block.parent_addr) }; - self.block_stack_replay.record_node_end( - block_info.addr, - flags, - prev_addr, - prev_parent_addr, - ); + self.block_stack_replay + .record_node_end(block_info.addr, prev_addr, prev_parent_addr); } /// Records the execution context system info for CALL/SYSCALL/DYNCALL operations. @@ -546,7 +522,7 @@ impl Tracer for ExecutionTracer { let block_addr = self.hasher_chiplet_shim.record_hash_basic_block(basic_block_node); let parent_addr = - self.block_stack.push(block_addr, BlockType::BasicBlock, None); + self.block_stack.push(block_addr, None); self.block_stack_replay.record_node_start_parent_addr(parent_addr); }, MastNode::External(_) => unreachable!( @@ -554,7 +530,7 @@ impl Tracer for ExecutionTracer { ), }, Continuation::Respan { node_id: _, batch_index: _ } => { - self.block_stack.peek_mut().addr += HASH_CYCLE_LEN_FELT; + self.block_stack.peek_mut().addr += CONTROLLER_ROWS_PER_PERM_FELT; }, Continuation::FinishLoop { node_id: _, was_entered } if was_entered && processor.stack_get(0) == ONE => @@ -703,7 +679,7 @@ impl Tracer for ExecutionTracer { clk: RowIndex, ) { self.memory_reads.record_read_word(words[0], addr, ctx, clk); - self.memory_reads.record_read_word(words[1], addr + Felt::new(4), ctx, clk); + self.memory_reads.record_read_word(words[1], addr + PTR_OFFSET_WORD, ctx, clk); } #[inline(always)] @@ -731,17 +707,17 @@ impl Tracer for ExecutionTracer { ) { self.memory_reads.record_read_word(plaintext[0], src_addr, ctx, clk); self.memory_reads - .record_read_word(plaintext[1], src_addr + Felt::new(4), ctx, clk); + .record_read_word(plaintext[1], src_addr + PTR_OFFSET_WORD, ctx, clk); self.memory_writes.record_write_word(ciphertext[0], dst_addr, ctx, clk); self.memory_writes - .record_write_word(ciphertext[1], dst_addr + Felt::new(4), ctx, clk); + .record_write_word(ciphertext[1], dst_addr + PTR_OFFSET_WORD, ctx, clk); } #[inline(always)] fn record_pipe(&mut self, words: [Word; 2], addr: Felt, ctx: ContextId, clk: RowIndex) { self.advice.record_pop_stack_dword(words); self.memory_writes.record_write_word(words[0], addr, ctx, clk); - self.memory_writes.record_write_word(words[1], addr + Felt::new(4), ctx, clk); + self.memory_writes.record_write_word(words[1], addr + PTR_OFFSET_WORD, ctx, clk); } #[inline(always)] @@ -842,9 +818,8 @@ impl Tracer for ExecutionTracer { // HASHER CHIPLET SHIM // ================================================================================================ -/// The number of hasher rows per permutation operation. This is used to compute the address for -/// the next operation in the hasher chiplet. -const NUM_HASHER_ROWS_PER_PERMUTATION: u32 = HASH_CYCLE_LEN as u32; +/// The number of controller rows per permutation request (input + output = 2), as u32. +const NUM_HASHER_ROWS_PER_PERMUTATION: u32 = CONTROLLER_ROWS_PER_PERMUTATION as u32; /// Implements a shim for the hasher chiplet, where the responses of the hasher chiplet are emulated /// and recorded for later replay. diff --git a/processor/src/trace/mod.rs b/processor/src/trace/mod.rs index 2315bb3ea2..4c2c65a315 100644 --- a/processor/src/trace/mod.rs +++ b/processor/src/trace/mod.rs @@ -2,21 +2,20 @@ use alloc::vec::Vec; #[cfg(any(test, feature = "testing"))] use core::ops::Range; -#[cfg(feature = "std")] -use miden_air::trace::PADDED_TRACE_WIDTH; use miden_air::{ AirWitness, AuxBuilder, ProcessorAir, PublicInputs, debug, trace::{ - DECODER_TRACE_OFFSET, MainTrace, STACK_TRACE_OFFSET, TRACE_WIDTH, + DECODER_TRACE_OFFSET, MainTrace, PADDED_TRACE_WIDTH, TRACE_WIDTH, decoder::{NUM_USER_OP_HELPERS, USER_OP_HELPERS_OFFSET}, }, }; +use miden_core::{crypto::hash::Blake3_256, serde::Serializable}; use crate::{ - AdviceProvider, Felt, MIN_STACK_DEPTH, ProgramInfo, StackInputs, StackOutputs, Word, ZERO, + Felt, MIN_STACK_DEPTH, Program, ProgramInfo, StackInputs, StackOutputs, Word, ZERO, fast::ExecutionOutput, field::{ExtensionField, QuadFelt}, - precompile::{PrecompileRequest, PrecompileTranscript}, + precompile::{PrecompileRequest, PrecompileTranscript, PrecompileTranscriptDigest}, utils::{ColMatrix, Matrix, RowMajorMatrix}, }; @@ -25,7 +24,7 @@ use miden_air::trace::Challenges; use utils::{AuxColumnBuilder, TraceFragment}; pub mod chiplets; -pub mod execution_tracer; +pub(crate) mod execution_tracer; mod decoder; mod parallel; @@ -39,10 +38,132 @@ mod tests; // RE-EXPORTS // ================================================================================================ +pub use execution_tracer::TraceGenerationContext; pub use miden_air::trace::RowIndex; pub use parallel::{CORE_TRACE_WIDTH, build_trace, build_trace_with_max_len}; pub use utils::{ChipletsLengths, TraceLenSummary}; +/// Inputs required to build an execution trace from pre-executed data. +#[derive(Debug)] +pub struct TraceBuildInputs { + trace_output: TraceBuildOutput, + trace_generation_context: TraceGenerationContext, + program_info: ProgramInfo, +} + +#[derive(Debug)] +pub(crate) struct TraceBuildOutput { + stack_outputs: StackOutputs, + final_precompile_transcript: PrecompileTranscript, + precompile_requests: Vec, + precompile_requests_digest: [u8; 32], +} + +impl TraceBuildOutput { + fn from_execution_output(execution_output: ExecutionOutput) -> Self { + let ExecutionOutput { + stack, + mut advice, + memory: _, + final_precompile_transcript, + } = execution_output; + + Self { + stack_outputs: stack, + final_precompile_transcript, + precompile_requests: advice.take_precompile_requests(), + precompile_requests_digest: [0; 32], + } + .with_precompile_requests_digest() + } + + fn with_precompile_requests_digest(mut self) -> Self { + self.precompile_requests_digest = + Blake3_256::hash(&self.precompile_requests.to_bytes()).into(); + self + } + + fn has_matching_precompile_requests_digest(&self) -> bool { + let expected_digest: [u8; 32] = + Blake3_256::hash(&self.precompile_requests.to_bytes()).into(); + self.precompile_requests_digest == expected_digest + } +} + +impl TraceBuildInputs { + pub(crate) fn from_execution( + program: &Program, + execution_output: ExecutionOutput, + trace_generation_context: TraceGenerationContext, + ) -> Self { + let trace_output = TraceBuildOutput::from_execution_output(execution_output); + let program_info = program.to_info(); + Self { + trace_output, + trace_generation_context, + program_info, + } + } + + /// Returns the stack outputs captured for the execution being replayed. + pub fn stack_outputs(&self) -> &StackOutputs { + &self.trace_output.stack_outputs + } + + /// Returns deferred precompile requests generated during execution. + pub fn precompile_requests(&self) -> &[PrecompileRequest] { + &self.trace_output.precompile_requests + } + + /// Returns the final precompile transcript observed during execution. + pub fn final_precompile_transcript(&self) -> &PrecompileTranscript { + &self.trace_output.final_precompile_transcript + } + + /// Returns the digest of the final precompile transcript observed during execution. + pub fn precompile_transcript_digest(&self) -> PrecompileTranscriptDigest { + self.final_precompile_transcript().finalize() + } + + /// Returns the program info captured for the execution being replayed. + pub fn program_info(&self) -> &ProgramInfo { + &self.program_info + } + + // Kept for mismatch and edge-case tests that mutate replay inputs directly. + #[cfg(any(test, feature = "testing"))] + #[cfg_attr(all(feature = "testing", not(test)), expect(dead_code))] + pub(crate) fn into_parts(self) -> (TraceBuildOutput, TraceGenerationContext, ProgramInfo) { + (self.trace_output, self.trace_generation_context, self.program_info) + } + + #[cfg(any(test, feature = "testing"))] + /// Returns the trace replay context captured during execution. + pub fn trace_generation_context(&self) -> &TraceGenerationContext { + &self.trace_generation_context + } + + // Kept for tests that force invalid replay contexts without widening the public API. + #[cfg(any(test, feature = "testing"))] + #[cfg_attr(all(feature = "testing", not(test)), expect(dead_code))] + pub(crate) fn trace_generation_context_mut(&mut self) -> &mut TraceGenerationContext { + &mut self.trace_generation_context + } + + #[cfg(test)] + pub(crate) fn from_parts( + trace_output: TraceBuildOutput, + trace_generation_context: TraceGenerationContext, + program_info: ProgramInfo, + ) -> Self { + Self { + trace_output, + trace_generation_context, + program_info, + } + } +} + // VM EXECUTION TRACE // ================================================================================================ @@ -52,7 +173,8 @@ pub use utils::{ChipletsLengths, TraceLenSummary}; /// - Main traces of System, Decoder, Operand Stack, Range Checker, and Chiplets. /// - Auxiliary trace builders. /// - Information about the program (program hash and the kernel). -/// - Information about execution outputs (stack state, advice provider, and precompile transcript). +/// - Information about execution outputs (stack state, deferred precompile requests, and the final +/// precompile transcript). /// - Summary of trace lengths of the main trace components. #[derive(Debug)] pub struct ExecutionTrace { @@ -60,8 +182,8 @@ pub struct ExecutionTrace { aux_trace_builders: AuxTraceBuilders, program_info: ProgramInfo, stack_outputs: StackOutputs, - advice: AdviceProvider, - final_pc_transcript: PrecompileTranscript, + precompile_requests: Vec, + final_precompile_transcript: PrecompileTranscript, trace_len_summary: TraceLenSummary, } @@ -69,20 +191,27 @@ impl ExecutionTrace { // CONSTRUCTOR // -------------------------------------------------------------------------------------------- - pub fn new_from_parts( + pub(crate) fn new_from_parts( program_info: ProgramInfo, - execution_output: ExecutionOutput, + trace_output: TraceBuildOutput, main_trace: MainTrace, aux_trace_builders: AuxTraceBuilders, trace_len_summary: TraceLenSummary, ) -> Self { + let TraceBuildOutput { + stack_outputs, + final_precompile_transcript, + precompile_requests, + .. + } = trace_output; + Self { main_trace, aux_trace_builders, program_info, - stack_outputs: execution_output.stack, - advice: execution_output.advice, - final_pc_transcript: execution_output.final_pc_transcript, + stack_outputs, + precompile_requests, + final_precompile_transcript, trace_len_summary, } } @@ -111,7 +240,7 @@ impl ExecutionTrace { self.program_info.clone(), self.init_stack_state(), self.stack_outputs, - self.final_pc_transcript.state(), + self.final_precompile_transcript.state(), ) } @@ -137,37 +266,40 @@ impl ExecutionTrace { /// Returns the precompile requests generated during program execution. pub fn precompile_requests(&self) -> &[PrecompileRequest] { - self.advice.precompile_requests() + &self.precompile_requests } - /// Moves all accumulated precompile requests out of the trace, leaving it empty. - /// - /// Intended for proof packaging, where requests are serialized into the proof and no longer - /// needed in the trace after consumption. - pub fn take_precompile_requests(&mut self) -> Vec { - self.advice.take_precompile_requests() + /// Returns the final precompile transcript observed during execution. + pub fn final_precompile_transcript(&self) -> PrecompileTranscript { + self.final_precompile_transcript } - /// Returns the final precompile transcript after executing all precompile requests. - pub fn final_precompile_transcript(&self) -> PrecompileTranscript { - self.final_pc_transcript + /// Returns the digest of the final precompile transcript observed during execution. + pub fn precompile_transcript_digest(&self) -> PrecompileTranscriptDigest { + self.final_precompile_transcript().finalize() + } + + /// Returns the owned execution outputs required for proof packaging. + pub fn into_outputs(self) -> (StackOutputs, Vec, PrecompileTranscript) { + (self.stack_outputs, self.precompile_requests, self.final_precompile_transcript) } /// Returns the initial state of the top 16 stack registers. pub fn init_stack_state(&self) -> StackInputs { let mut result = [ZERO; MIN_STACK_DEPTH]; + let row = RowIndex::from(0_u32); for (i, result) in result.iter_mut().enumerate() { - *result = self.main_trace.get_column(i + STACK_TRACE_OFFSET)[0]; + *result = self.main_trace.stack_element(i, row); } result.into() } /// Returns the final state of the top 16 stack registers. pub fn last_stack_state(&self) -> StackOutputs { - let last_step = self.last_step(); + let last_step = RowIndex::from(self.last_step()); let mut result = [ZERO; MIN_STACK_DEPTH]; for (i, result) in result.iter_mut().enumerate() { - *result = self.main_trace.get_column(i + STACK_TRACE_OFFSET)[last_step]; + *result = self.main_trace.stack_element(i, last_step); } result.into() } @@ -175,9 +307,9 @@ impl ExecutionTrace { /// Returns helper registers state at the specified `clk` of the VM pub fn get_user_op_helpers_at(&self, clk: u32) -> [Felt; NUM_USER_OP_HELPERS] { let mut result = [ZERO; NUM_USER_OP_HELPERS]; + let row = RowIndex::from(clk); for (i, result) in result.iter_mut().enumerate() { - *result = self.main_trace.get_column(DECODER_TRACE_OFFSET + USER_OP_HELPERS_OFFSET + i) - [clk as usize]; + *result = self.main_trace.get(row, DECODER_TRACE_OFFSET + USER_OP_HELPERS_OFFSET + i); } result } @@ -197,16 +329,6 @@ impl ExecutionTrace { &self.trace_len_summary } - /// Returns the final advice provider state. - pub fn advice_provider(&self) -> &AdviceProvider { - &self.advice - } - - /// Destructures this execution trace into the process’s final stack and advice states. - pub fn into_outputs(self) -> (StackOutputs, AdviceProvider) { - (self.stack_outputs, self.advice) - } - // DEBUG CONSTRAINT CHECKING // -------------------------------------------------------------------------------------------- @@ -239,20 +361,20 @@ impl ExecutionTrace { debug::check_constraints(&ProcessorAir, witness, &aux_builder, &challenges); } - /// Converts the main trace from column-major to row-major format. + /// Returns the main trace as a row-major matrix for proving. /// /// Only includes the first [`TRACE_WIDTH`] columns (excluding padding columns added for /// Poseidon2 rate alignment), which is the width expected by the AIR. // TODO: the padding columns can be removed once we use the lifted-stark's virtual trace // alignment, which pads to the required rate width without materializing extra columns. pub fn to_row_major_matrix(&self) -> RowMajorMatrix { - let trace_len = self.get_trace_len(); - let mut col_major_data = Vec::with_capacity(TRACE_WIDTH * trace_len); - for col_idx in 0..TRACE_WIDTH { - col_major_data.extend_from_slice(self.main_trace.get_column(col_idx)); + let stored_w = self.main_trace.width(); + if stored_w == TRACE_WIDTH { + return self.main_trace.to_row_major(); } - let col_major_matrix = RowMajorMatrix::new(col_major_data, trace_len); - col_major_matrix.transpose() + + assert_eq!(stored_w, PADDED_TRACE_WIDTH); + self.main_trace.to_row_major_stripped(TRACE_WIDTH) } // HELPER METHODS @@ -318,10 +440,27 @@ impl AuxTraceBuilders { // the expanded challenges to all sub-builders. let challenges = Challenges::::new(challenges[0], challenges[1]); - let decoder_cols = self.decoder.build_aux_columns(main_trace, &challenges); - let stack_cols = self.stack.build_aux_columns(main_trace, &challenges); - let range_cols = self.range.build_aux_columns(main_trace, &challenges); - let chiplets_cols = self.chiplets.build_aux_columns(main_trace, &challenges); + let (decoder_cols, stack_cols, range_cols, chiplets_cols) = { + let ((decoder_cols, stack_cols), (range_cols, chiplets_cols)) = rayon::join( + || { + rayon::join( + || self.decoder.build_aux_columns(main_trace, &challenges), + || self.stack.build_aux_columns(main_trace, &challenges), + ) + }, + || { + rayon::join( + || self.range.build_aux_columns(main_trace, &challenges), + || { + let [a, b, c] = + self.chiplets.build_aux_columns(main_trace, &challenges); + vec![a, b, c] + }, + ) + }, + ); + (decoder_cols, stack_cols, range_cols, chiplets_cols) + }; decoder_cols .into_iter() @@ -334,11 +473,6 @@ impl AuxTraceBuilders { // PLONKY3 AUX TRACE BUILDER // ================================================================================================ -// -// Implements the upstream `AuxBuilder` trait from `p3_miden_lifted_air` directly on -// `AuxTraceBuilders`. Plonky3 uses row-major matrices while our existing aux trace building logic -// uses column-major format. This impl adapts between the two by converting the main trace from -// row-major to column-major, delegating to the existing logic, and converting the result back. impl> AuxBuilder for AuxTraceBuilders { fn build_aux_trace( @@ -351,33 +485,48 @@ impl> AuxBuilder for AuxTraceBuilders { // Transpose the row-major main trace into column-major `MainTrace` needed by the // auxiliary trace builders. The last program row is the point where the clock // (column 0) stops incrementing. - let main_trace_col_major = { + let main_for_aux = { let num_rows = main.height(); - // Detect last program row from row-major layout using column 0 (clock). - let last_program_row = (1..num_rows) - .find(|&i| { - main.get(i, 0).expect("valid indices") - != main.get(i - 1, 0).expect("valid indices") + Felt::ONE - }) - .map_or(num_rows - 1, |i| i - 1); + // Find the last program row by binary search on the clock column. + let clk0 = main.get(0, 0).expect("valid indices"); + let last_program_row = if num_rows <= 1 { + 0 + } else if main.get(num_rows - 1, 0).expect("valid indices") + == clk0 + Felt::new((num_rows - 1) as u64) + { + num_rows - 1 + } else { + let mut lo = 1usize; + let mut hi = num_rows - 1; + while lo < hi { + let mid = lo + (hi - lo) / 2; + let expected = clk0 + Felt::new(mid as u64); + if main.get(mid, 0).expect("valid indices") == expected { + lo = mid + 1; + } else { + hi = mid; + } + } + lo - 1 + }; let transposed = main.transpose(); - let columns: Vec> = transposed.row_slices().map(|row| row.to_vec()).collect(); - MainTrace::new(ColMatrix::new(columns), last_program_row.into()) + MainTrace::from_transposed(transposed, RowIndex::from(last_program_row)) }; - // Build auxiliary columns in column-major format. - let aux_columns = self.build_aux_columns(&main_trace_col_major, challenges); + let aux_columns = self.build_aux_columns(&main_for_aux, challenges); assert!(!aux_columns.is_empty(), "aux columns should not be empty"); - // Flatten column-major aux columns into a contiguous buffer, then transpose - // to the row-major layout expected by the lifted prover. let trace_len = main.height(); let num_ef_cols = aux_columns.len(); - let mut col_major_data = Vec::with_capacity(trace_len * num_ef_cols); - for col in aux_columns { - col_major_data.extend_from_slice(&col); + for col in &aux_columns { + debug_assert_eq!(col.len(), trace_len, "aux column length must match main height"); + } + + let mut flat = Vec::with_capacity(trace_len * num_ef_cols); + for col in &aux_columns { + flat.extend_from_slice(col); } - let aux_trace = RowMajorMatrix::new(col_major_data, trace_len).transpose(); + let aux_trace = RowMajorMatrix::new(flat, trace_len).transpose(); // Extract the last row from the row-major aux trace for Fiat-Shamir. let last_row = aux_trace diff --git a/processor/src/trace/parallel/core_trace_fragment/mod.rs b/processor/src/trace/parallel/core_trace_fragment/mod.rs index 239182af8d..831bf101ba 100644 --- a/processor/src/trace/parallel/core_trace_fragment/mod.rs +++ b/processor/src/trace/parallel/core_trace_fragment/mod.rs @@ -1,24 +1,11 @@ use miden_air::{Felt, trace::decoder::NUM_OP_BITS}; use miden_core::{mast::BasicBlockNode, operations::opcodes}; -use super::CORE_TRACE_WIDTH; use crate::errors::OperationError; #[cfg(test)] mod tests; -// CORE TRACE FRAGMENT -// ================================================================================================ - -/// The columns of the main trace fragment. These consist of the system, decoder, and stack columns. -/// -/// A fragment is a collection of columns of length `fragment_size` or less. Only the last fragment -/// is allowed to be shorter than `fragment_size`. -#[derive(Debug)] -pub struct CoreTraceFragment<'a> { - pub columns: [&'a mut [Felt]; CORE_TRACE_WIDTH], -} - // BASIC BLOCK CONTEXT // ================================================================================================ diff --git a/processor/src/trace/parallel/core_trace_fragment/tests.rs b/processor/src/trace/parallel/core_trace_fragment/tests.rs index ec3818b612..a19718fbc9 100644 --- a/processor/src/trace/parallel/core_trace_fragment/tests.rs +++ b/processor/src/trace/parallel/core_trace_fragment/tests.rs @@ -2,7 +2,7 @@ use alloc::{sync::Arc, vec::Vec}; use miden_air::trace::{ CTX_COL_IDX, - chiplets::hasher::HASH_CYCLE_LEN_FELT, + chiplets::hasher::CONTROLLER_ROWS_PER_PERM_FELT, decoder::{ ADDR_COL_IDX, GROUP_COUNT_COL_IDX, HASHER_STATE_RANGE, IN_SPAN_COL_IDX, NUM_HASHER_COLUMNS, NUM_OP_BATCH_FLAGS, NUM_OP_BITS, OP_BATCH_1_GROUPS, OP_BATCH_2_GROUPS, OP_BATCH_4_GROUPS, @@ -23,8 +23,9 @@ use miden_core::{ use miden_utils_testing::rand::rand_value; use crate::{ - AdviceInputs, DefaultHost, ExecutionOptions, ExecutionTrace, FastProcessor, - event::NoopEventHandler, trace::build_trace, + AdviceInputs, DefaultHost, ExecutionOptions, FastProcessor, + event::NoopEventHandler, + trace::{ExecutionTrace, build_trace}, }; // CONSTANTS @@ -372,7 +373,7 @@ fn test_basic_block_with_respan_decoding() { // NOOP inserted by the processor to make sure the group doesn't end with a PUSH check_op_decoding(&trace, 8, INIT_ADDR, opcodes::NOOP, 4, 7, 1); // RESPAN since the previous batch is full - let batch1_addr = INIT_ADDR + HASH_CYCLE_LEN_FELT; + let batch1_addr = INIT_ADDR + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 9, INIT_ADDR, opcodes::RESPAN, 4, 0, 0); check_op_decoding_with_imm(&trace, 10, batch1_addr, iv[7], 1, 3, 0, 1); check_op_decoding(&trace, 11, batch1_addr, opcodes::ADD, 2, 1, 1); @@ -462,12 +463,12 @@ fn test_join_node_decoding() { // --- check block address, op_bits, group count, op_index, and in_span columns --------------- check_op_decoding(&trace, 0, ZERO, opcodes::JOIN, 0, 0, 0); // starting first span - let span1_addr = INIT_ADDR + HASH_CYCLE_LEN_FELT; + let span1_addr = INIT_ADDR + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 1, INIT_ADDR, opcodes::SPAN, 1, 0, 0); check_op_decoding(&trace, 2, span1_addr, opcodes::MUL, 0, 0, 1); check_op_decoding(&trace, 3, span1_addr, opcodes::END, 0, 0, 0); // starting second span - let span2_addr = span1_addr + HASH_CYCLE_LEN_FELT; + let span2_addr = span1_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 4, INIT_ADDR, opcodes::SPAN, 1, 0, 0); check_op_decoding(&trace, 5, span2_addr, opcodes::ADD, 0, 0, 1); check_op_decoding(&trace, 6, span2_addr, opcodes::END, 0, 0, 0); @@ -532,7 +533,7 @@ fn test_split_node_true_decoding() { let (trace, trace_len) = build_trace_helper(&[1], &program); // --- check block address, op_bits, group count, op_index, and in_span columns --------------- - let basic_block_addr = INIT_ADDR + HASH_CYCLE_LEN_FELT; + let basic_block_addr = INIT_ADDR + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 0, ZERO, opcodes::SPLIT, 0, 0, 0); check_op_decoding(&trace, 1, INIT_ADDR, opcodes::SPAN, 1, 0, 0); check_op_decoding(&trace, 2, basic_block_addr, opcodes::MUL, 0, 0, 1); @@ -591,7 +592,7 @@ fn test_split_node_false_decoding() { let (trace, trace_len) = build_trace_helper(&[0], &program); // --- check block address, op_bits, group count, op_index, and in_span columns --------------- - let basic_block_addr = INIT_ADDR + HASH_CYCLE_LEN_FELT; + let basic_block_addr = INIT_ADDR + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 0, ZERO, opcodes::SPLIT, 0, 0, 0); check_op_decoding(&trace, 1, INIT_ADDR, opcodes::SPAN, 1, 0, 0); check_op_decoding(&trace, 2, basic_block_addr, opcodes::ADD, 0, 0, 1); @@ -649,7 +650,7 @@ fn test_loop_node_decoding() { let (trace, trace_len) = build_trace_helper(&[1, 0], &program); // --- check block address, op_bits, group count, op_index, and in_span columns --------------- - let body_addr = INIT_ADDR + HASH_CYCLE_LEN_FELT; + let body_addr = INIT_ADDR + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 0, ZERO, opcodes::LOOP, 0, 0, 0); check_op_decoding(&trace, 1, INIT_ADDR, opcodes::SPAN, 1, 0, 0); check_op_decoding(&trace, 2, body_addr, opcodes::PAD, 0, 0, 1); @@ -754,8 +755,8 @@ fn test_loop_node_repeat_decoding() { let (trace, trace_len) = build_trace_helper(&[1, 1, 0], &program); // --- check block address, op_bits, group count, op_index, and in_span columns --------------- - let iter1_addr = INIT_ADDR + HASH_CYCLE_LEN_FELT; - let iter2_addr = iter1_addr + HASH_CYCLE_LEN_FELT; + let iter1_addr = INIT_ADDR + CONTROLLER_ROWS_PER_PERM_FELT; + let iter2_addr = iter1_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 0, ZERO, opcodes::LOOP, 0, 0, 0); check_op_decoding(&trace, 1, INIT_ADDR, opcodes::SPAN, 1, 0, 0); @@ -812,7 +813,6 @@ fn test_loop_node_repeat_decoding() { #[test] #[rustfmt::skip] -#[expect(clippy::needless_range_loop)] fn test_call_decoding() { // build a program which looks like this: @@ -892,11 +892,11 @@ fn test_call_decoding() { check_op_decoding(&dec_trace, row_idx, ZERO, opcodes::JOIN, 0, 0, 0); row_idx += 1; // starting the internal JOIN block - let inner_join_addr = INIT_ADDR + HASH_CYCLE_LEN_FELT; + let inner_join_addr = INIT_ADDR + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, INIT_ADDR, opcodes::JOIN, 0, 0, 0); row_idx += 1; // starting first SPAN block - let first_basic_block_addr = inner_join_addr + HASH_CYCLE_LEN_FELT; + let first_basic_block_addr = inner_join_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, inner_join_addr, opcodes::SPAN, 4, 0, 0); row_idx += 1; check_op_decoding_with_imm(&dec_trace, row_idx, first_basic_block_addr, ONE, 1, 3, 0, 1); @@ -911,15 +911,15 @@ fn test_call_decoding() { row_idx += 1; // starting CALL block for bar - let call_addr = first_basic_block_addr + HASH_CYCLE_LEN_FELT; + let call_addr = first_basic_block_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, inner_join_addr, opcodes::CALL, 0, 0, 0); row_idx += 1; // starting JOIN block inside bar - let bar_join_addr = call_addr + HASH_CYCLE_LEN_FELT; + let bar_join_addr = call_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, call_addr, opcodes::JOIN, 0, 0, 0); row_idx += 1; // starting SPAN block inside bar - let bar_basic_block_addr = bar_join_addr + HASH_CYCLE_LEN_FELT; + let bar_basic_block_addr = bar_join_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, bar_join_addr, opcodes::SPAN, 1, 0, 0); row_idx += 1; check_op_decoding(&dec_trace, row_idx, bar_basic_block_addr, opcodes::MUL, 0, 0, 1); @@ -928,11 +928,11 @@ fn test_call_decoding() { row_idx += 1; // starting CALL to foo - let syscall_addr = bar_basic_block_addr + HASH_CYCLE_LEN_FELT; + let syscall_addr = bar_basic_block_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, bar_join_addr, opcodes::CALL, 0, 0, 0); row_idx += 1; // starting SPAN block within syscall - let syscall_basic_block_addr = syscall_addr + HASH_CYCLE_LEN_FELT; + let syscall_basic_block_addr = syscall_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, syscall_addr, opcodes::SPAN, 1, 0, 0); row_idx += 1; check_op_decoding(&dec_trace, row_idx, syscall_basic_block_addr, opcodes::ADD, 0, 0, 1); @@ -954,7 +954,7 @@ fn test_call_decoding() { row_idx += 1; // starting the last SPAN block - let last_basic_block_addr = syscall_basic_block_addr + HASH_CYCLE_LEN_FELT; + let last_basic_block_addr = syscall_basic_block_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, INIT_ADDR, opcodes::SPAN, 1, 0, 0); row_idx += 1; check_op_decoding(&dec_trace, row_idx, last_basic_block_addr, opcodes::DROP, 0, 0, 1); @@ -1106,7 +1106,6 @@ fn test_call_decoding() { #[test] #[rustfmt::skip] -#[expect(clippy::needless_range_loop)] fn test_syscall_decoding() { // build a program which looks like this: @@ -1194,11 +1193,11 @@ fn test_syscall_decoding() { check_op_decoding(&dec_trace, row_idx, ZERO, opcodes::JOIN, 0, 0, 0); row_idx += 1; // starting the internal JOIN block - let inner_join_addr = INIT_ADDR + HASH_CYCLE_LEN_FELT; + let inner_join_addr = INIT_ADDR + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, INIT_ADDR, opcodes::JOIN, 0, 0, 0); row_idx += 1; // starting first SPAN block - let first_basic_block_addr = inner_join_addr + HASH_CYCLE_LEN_FELT; + let first_basic_block_addr = inner_join_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, inner_join_addr, opcodes::SPAN, 4, 0, 0); row_idx += 1; check_op_decoding_with_imm(&dec_trace, row_idx, first_basic_block_addr, ONE, 1, 3, 0, 1); @@ -1213,15 +1212,15 @@ fn test_syscall_decoding() { row_idx += 1; // starting CALL block for bar - let call_addr = first_basic_block_addr + HASH_CYCLE_LEN_FELT; + let call_addr = first_basic_block_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, inner_join_addr, opcodes::CALL, 0, 0, 0); row_idx += 1; // starting JOIN block inside bar - let bar_join_addr = call_addr + HASH_CYCLE_LEN_FELT; + let bar_join_addr = call_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, call_addr, opcodes::JOIN, 0, 0, 0); row_idx += 1; // starting SPAN block inside bar - let bar_basic_block_addr = bar_join_addr + HASH_CYCLE_LEN_FELT; + let bar_basic_block_addr = bar_join_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, bar_join_addr, opcodes::SPAN, 1, 0, 0); row_idx += 1; check_op_decoding(&dec_trace, row_idx, bar_basic_block_addr, opcodes::MUL, 0, 0, 1); @@ -1230,11 +1229,11 @@ fn test_syscall_decoding() { row_idx += 1; // starting SYSCALL block for bar - let syscall_addr = bar_basic_block_addr + HASH_CYCLE_LEN_FELT; + let syscall_addr = bar_basic_block_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, bar_join_addr, opcodes::SYSCALL, 0, 0, 0); row_idx += 1; // starting SPAN block within syscall - let syscall_basic_block_addr = syscall_addr + HASH_CYCLE_LEN_FELT; + let syscall_basic_block_addr = syscall_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, syscall_addr, opcodes::SPAN, 1, 0, 0); row_idx += 1; check_op_decoding(&dec_trace, row_idx, syscall_basic_block_addr, opcodes::ADD, 0, 0, 1); @@ -1256,7 +1255,7 @@ fn test_syscall_decoding() { row_idx += 1; // starting the last SPAN block - let last_basic_block_addr = syscall_basic_block_addr + HASH_CYCLE_LEN_FELT; + let last_basic_block_addr = syscall_basic_block_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&dec_trace, row_idx, INIT_ADDR, opcodes::SPAN, 1, 0, 0); row_idx += 1; check_op_decoding(&dec_trace, row_idx, last_basic_block_addr, opcodes::DROP, 0, 0, 1); @@ -1465,15 +1464,15 @@ fn test_dyn_node_decoding() { // --- check block address, op_bits, group count, op_index, and in_span columns --------------- check_op_decoding(&trace, 0, ZERO, opcodes::JOIN, 0, 0, 0); // starting inner join - let join_addr = INIT_ADDR + HASH_CYCLE_LEN_FELT; + let join_addr = INIT_ADDR + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 1, INIT_ADDR, opcodes::JOIN, 0, 0, 0); // starting first span - let mstorew_basic_block_addr = join_addr + HASH_CYCLE_LEN_FELT; + let mstorew_basic_block_addr = join_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 2, join_addr, opcodes::SPAN, 1, 0, 0); check_op_decoding(&trace, 3, mstorew_basic_block_addr, opcodes::MSTOREW, 0, 0, 1); check_op_decoding(&trace, 4, mstorew_basic_block_addr, opcodes::END, 0, 0, 0); // starting second span - let push_basic_block_addr = mstorew_basic_block_addr + HASH_CYCLE_LEN_FELT; + let push_basic_block_addr = mstorew_basic_block_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 5, join_addr, opcodes::SPAN, 2, 0, 0); check_op_decoding(&trace, 6, push_basic_block_addr, PUSH_40_OP.op_code(), 1, 0, 1); check_op_decoding(&trace, 7, push_basic_block_addr, opcodes::NOOP, 0, 1, 1); @@ -1483,8 +1482,8 @@ fn test_dyn_node_decoding() { // dyn check_op_decoding(&trace, 10, INIT_ADDR, opcodes::DYN, 0, 0, 0); // starting foo span - let dyn_addr = push_basic_block_addr + HASH_CYCLE_LEN_FELT; - let add_basic_block_addr = dyn_addr + HASH_CYCLE_LEN_FELT; + let dyn_addr = push_basic_block_addr + CONTROLLER_ROWS_PER_PERM_FELT; + let add_basic_block_addr = dyn_addr + CONTROLLER_ROWS_PER_PERM_FELT; check_op_decoding(&trace, 11, dyn_addr, opcodes::SPAN, 2, 0, 0); check_op_decoding_with_imm(&trace, 12, add_basic_block_addr, ONE, 1, 1, 0, 1); check_op_decoding(&trace, 13, add_basic_block_addr, opcodes::ADD, 0, 1, 1); @@ -1606,10 +1605,8 @@ fn build_trace_helper(stack_inputs: &[u64], program: &Program) -> (DecoderTrace, let mut host = DefaultHost::default(); host.register_handler(EMIT_EVENT, Arc::new(NoopEventHandler)).unwrap(); - let (execution_output, trace_generation_context) = - processor.execute_for_trace_sync(program, &mut host).unwrap(); - - let trace = build_trace(execution_output, trace_generation_context, program.to_info()).unwrap(); + let trace_inputs = processor.execute_trace_inputs_sync(program, &mut host).unwrap(); + let trace = build_trace(trace_inputs).unwrap(); // The trace_len_summary().main_trace_len() is the actual program row count (before padding) let trace_len = trace.trace_len_summary().main_trace_len(); @@ -1637,10 +1634,8 @@ fn build_call_trace_helper(program: &Program) -> (SystemTrace, DecoderTrace, usi ); let mut host = DefaultHost::default(); - let (execution_output, trace_generation_context) = - processor.execute_for_trace_sync(program, &mut host).unwrap(); - - let trace = build_trace(execution_output, trace_generation_context, program.to_info()).unwrap(); + let trace_inputs = processor.execute_trace_inputs_sync(program, &mut host).unwrap(); + let trace = build_trace(trace_inputs).unwrap(); // The trace_len_summary().main_trace_len() is the actual program row count (before padding) let trace_len = trace.trace_len_summary().main_trace_len(); diff --git a/processor/src/trace/parallel/mod.rs b/processor/src/trace/parallel/mod.rs index 696e6bc4b9..f70bbf696e 100644 --- a/processor/src/trace/parallel/mod.rs +++ b/processor/src/trace/parallel/mod.rs @@ -4,13 +4,11 @@ use itertools::Itertools; use miden_air::{ Felt, trace::{ - CLK_COL_IDX, CTX_COL_IDX, DECODER_TRACE_OFFSET, DECODER_TRACE_WIDTH, FN_HASH_RANGE, - MIN_TRACE_LEN, MainTrace, PADDED_TRACE_WIDTH, RowIndex, STACK_TRACE_OFFSET, - STACK_TRACE_WIDTH, SYS_TRACE_WIDTH, TRACE_WIDTH, + CLK_COL_IDX, DECODER_TRACE_OFFSET, DECODER_TRACE_WIDTH, MIN_TRACE_LEN, MainTrace, RowIndex, + STACK_TRACE_OFFSET, STACK_TRACE_WIDTH, SYS_TRACE_WIDTH, decoder::{ - ADDR_COL_IDX, GROUP_COUNT_COL_IDX, HASHER_STATE_OFFSET, IN_SPAN_COL_IDX, - NUM_HASHER_COLUMNS, NUM_OP_BATCH_FLAGS, NUM_OP_BITS, OP_BATCH_FLAGS_OFFSET, - OP_BITS_EXTRA_COLS_OFFSET, OP_BITS_OFFSET, OP_INDEX_COL_IDX, + HASHER_STATE_OFFSET, NUM_HASHER_COLUMNS, NUM_OP_BITS, OP_BITS_EXTRA_COLS_OFFSET, + OP_BITS_OFFSET, }, stack::{B0_COL_IDX, B1_COL_IDX, H0_COL_IDX, STACK_TOP_OFFSET}, }, @@ -20,8 +18,7 @@ use miden_core::{ field::batch_inversion_allow_zeros, mast::{MastForest, MastNode}, operations::opcodes, - program::{Kernel, MIN_STACK_DEPTH, ProgramInfo}, - utils::ColMatrix, + program::{Kernel, MIN_STACK_DEPTH}, }; use rayon::prelude::*; use tracing::instrument; @@ -30,11 +27,11 @@ use crate::{ ContextId, ExecutionError, continuation_stack::ContinuationStack, errors::MapExecErrNoCtx, - fast::ExecutionOutput, trace::{ - AuxTraceBuilders, ChipletsLengths, ExecutionTrace, TraceLenSummary, + AuxTraceBuilders, ChipletsLengths, ExecutionTrace, TraceBuildInputs, TraceLenSummary, parallel::{processor::ReplayProcessor, tracer::CoreTraceGenerationTracer}, range::RangeChecker, + utils::RowMajorTraceWriter, }, }; @@ -47,7 +44,6 @@ pub const CORE_TRACE_WIDTH: usize = SYS_TRACE_WIDTH + DECODER_TRACE_WIDTH + STAC const MAX_TRACE_LEN: usize = 1 << 29; pub(crate) mod core_trace_fragment; -use core_trace_fragment::CoreTraceFragment; mod processor; mod tracer; @@ -71,18 +67,25 @@ mod tests; // ================================================================================================ /// Builds the main trace from the provided trace states in parallel. +/// +/// # Example +/// ``` +/// use miden_assembly::Assembler; +/// use miden_processor::{DefaultHost, FastProcessor, StackInputs}; +/// +/// let program = Assembler::default().assemble_program("begin push.1 drop end").unwrap(); +/// let mut host = DefaultHost::default(); +/// +/// let trace_inputs = FastProcessor::new(StackInputs::default()) +/// .execute_trace_inputs_sync(&program, &mut host) +/// .unwrap(); +/// let trace = miden_processor::trace::build_trace(trace_inputs).unwrap(); +/// +/// assert_eq!(*trace.program_hash(), program.hash()); +/// ``` #[instrument(name = "build_trace", skip_all)] -pub fn build_trace( - execution_output: ExecutionOutput, - trace_generation_context: TraceGenerationContext, - program_info: ProgramInfo, -) -> Result { - build_trace_with_max_len( - execution_output, - trace_generation_context, - program_info, - MAX_TRACE_LEN, - ) +pub fn build_trace(inputs: TraceBuildInputs) -> Result { + build_trace_with_max_len(inputs, MAX_TRACE_LEN) } /// Same as [`build_trace`], but with a custom hard cap. @@ -90,11 +93,21 @@ pub fn build_trace( /// When the trace would go over `max_trace_len`, this returns /// [`ExecutionError::TraceLenExceeded`]. pub fn build_trace_with_max_len( - execution_output: ExecutionOutput, - trace_generation_context: TraceGenerationContext, - program_info: ProgramInfo, + inputs: TraceBuildInputs, max_trace_len: usize, ) -> Result { + let TraceBuildInputs { + trace_output, + trace_generation_context, + program_info, + } = inputs; + + if !trace_output.has_matching_precompile_requests_digest() { + return Err(ExecutionError::Internal( + "trace inputs do not match deferred precompile requests", + )); + } + let TraceGenerationContext { core_trace_contexts, range_checker_replay, @@ -140,14 +153,13 @@ pub fn build_trace_with_max_len( let range_checker = initialize_range_checker(range_checker_replay, &chiplets); - let mut core_trace_columns = generate_core_trace_columns( + let mut core_trace_data = generate_core_trace_row_major( core_trace_contexts, program_info.kernel().clone(), fragment_size, )?; - // Calculate trace length - let core_trace_len = core_trace_columns[0].len(); + let core_trace_len = core_trace_data.len() / CORE_TRACE_WIDTH; // Get the number of rows for the range checker let range_table_len = range_checker.get_number_range_checker_rows(); @@ -159,32 +171,26 @@ pub fn build_trace_with_max_len( let main_trace_len = compute_main_trace_length(core_trace_len, range_table_len, chiplets.trace_len()); - let ((), (range_checker_trace, chiplets_trace)) = rayon::join( - || pad_trace_columns(&mut core_trace_columns, main_trace_len), + let ((range_checker_trace, chiplets_trace), ()) = rayon::join( || { rayon::join( || range_checker.into_trace_with_table(range_table_len, main_trace_len), || chiplets.into_trace(main_trace_len), ) }, + || pad_core_row_major(&mut core_trace_data, main_trace_len), ); - // Padding to make the number of columns a multiple of 8 i.e., the Poseidon2 permutation rate - let padding_columns = vec![vec![ZERO; main_trace_len]; PADDED_TRACE_WIDTH - TRACE_WIDTH]; - - // Chain all trace columns together - let trace_columns: Vec> = core_trace_columns - .into_iter() - .chain(range_checker_trace.trace) - .chain(chiplets_trace.trace) - .chain(padding_columns) - .collect(); - // Create the MainTrace let main_trace = { let last_program_row = RowIndex::from((core_trace_len as u32).saturating_sub(1)); - let col_matrix = ColMatrix::new(trace_columns); - MainTrace::new(col_matrix, last_program_row) + MainTrace::from_parts( + core_trace_data, + chiplets_trace.trace, + range_checker_trace.trace, + main_trace_len, + last_program_row, + ) }; // Create aux trace builders @@ -197,7 +203,7 @@ pub fn build_trace_with_max_len( Ok(ExecutionTrace::new_from_parts( program_info, - execution_output, + trace_output, main_trace, aux_trace_builders, trace_len_summary, @@ -220,14 +226,16 @@ fn compute_main_trace_length( core::cmp::max(trace_len, MIN_TRACE_LEN) } -/// Generates core trace fragments in parallel from the provided trace fragment contexts. -fn generate_core_trace_columns( +/// Generates row-major core trace in parallel from the provided trace fragment contexts. +fn generate_core_trace_row_major( core_trace_contexts: Vec, kernel: Kernel, fragment_size: usize, -) -> Result>, ExecutionError> { - let mut core_trace_columns: Vec> = - vec![vec![ZERO; core_trace_contexts.len() * fragment_size]; CORE_TRACE_WIDTH]; +) -> Result, ExecutionError> { + let num_fragments = core_trace_contexts.len(); + let total_allocated_rows = num_fragments * fragment_size; + + let mut core_trace_data: Vec = vec![ZERO; total_allocated_rows * CORE_TRACE_WIDTH]; // Save the first stack top for initialization let first_stack_top = if let Some(first_context) = core_trace_contexts.first() { @@ -236,15 +244,18 @@ fn generate_core_trace_columns( vec![ZERO; MIN_STACK_DEPTH] }; - let mut fragments = create_fragments_from_trace_columns(&mut core_trace_columns, fragment_size); + let writers: Vec> = core_trace_data + .chunks_exact_mut(fragment_size * CORE_TRACE_WIDTH) + .map(|chunk| RowMajorTraceWriter::new(chunk, CORE_TRACE_WIDTH)) + .collect(); // Build the core trace fragments in parallel let fragment_results: Result, ExecutionError> = core_trace_contexts .into_par_iter() - .zip(fragments.par_iter_mut()) - .map(|(trace_state, fragment)| { + .zip(writers.into_par_iter()) + .map(|(trace_state, writer)| { let (mut processor, mut tracer, mut continuation_stack, mut current_forest) = - split_trace_fragment_context(trace_state, fragment, fragment_size); + split_trace_fragment_context(trace_state, writer, fragment_size); processor.execute( &mut continuation_stack, @@ -258,7 +269,6 @@ fn generate_core_trace_columns( .collect(); let fragment_results = fragment_results?; - // Separate fragments, stack_rows, and system_rows let mut stack_rows = Vec::new(); let mut system_rows = Vec::new(); let mut total_core_trace_rows = 0; @@ -271,7 +281,7 @@ fn generate_core_trace_columns( // Fix up stack and system rows fixup_stack_and_system_rows( - &mut core_trace_columns, + &mut core_trace_data, fragment_size, &stack_rows, &system_rows, @@ -282,19 +292,27 @@ fn generate_core_trace_columns( // This must be done after fixup_stack_and_system_rows since that function overwrites the first // row of each fragment with non-inverted values. { - let h0_column = &mut core_trace_columns[STACK_TRACE_OFFSET + H0_COL_IDX]; - h0_column[..total_core_trace_rows] - .par_chunks_mut(fragment_size) - .for_each(batch_inversion_allow_zeros); + let h0_col_offset = STACK_TRACE_OFFSET + H0_COL_IDX; + let w = CORE_TRACE_WIDTH; + core_trace_data[..total_core_trace_rows * w] + .par_chunks_mut(fragment_size * w) + .for_each(|fragment_chunk| { + let num_rows = fragment_chunk.len() / w; + let mut h0_vals: Vec = + (0..num_rows).map(|r| fragment_chunk[r * w + h0_col_offset]).collect(); + batch_inversion_allow_zeros(&mut h0_vals); + for (r, &val) in h0_vals.iter().enumerate() { + fragment_chunk[r * w + h0_col_offset] = val; + } + }); } // Truncate the core trace columns to the actual number of rows written. - for col in core_trace_columns.iter_mut() { - col.truncate(total_core_trace_rows); - } + core_trace_data.truncate(total_core_trace_rows * CORE_TRACE_WIDTH); push_halt_opcode_row( - &mut core_trace_columns, + &mut core_trace_data, + total_core_trace_rows, system_rows.last().ok_or(ExecutionError::Internal( "no trace fragments provided in the trace generation context", ))?, @@ -303,37 +321,7 @@ fn generate_core_trace_columns( ))?, ); - Ok(core_trace_columns) -} - -/// Splits the core trace columns into fragments of the specified size, returning a vector of -/// `CoreTraceFragment`s that each borrow from the original columns. -fn create_fragments_from_trace_columns( - core_trace_columns: &mut [Vec], - fragment_size: usize, -) -> Vec> { - let mut column_chunks: Vec<_> = core_trace_columns - .iter_mut() - .map(|col| col.chunks_exact_mut(fragment_size)) - .collect(); - let mut core_trace_fragments = Vec::new(); - - loop { - let fragment_cols: Vec<&mut [Felt]> = - column_chunks.iter_mut().filter_map(|col_chunk| col_chunk.next()).collect(); - assert!( - fragment_cols.is_empty() || fragment_cols.len() == CORE_TRACE_WIDTH, - "column chunks don't all have the same size" - ); - - if fragment_cols.is_empty() { - return core_trace_fragments; - } else { - core_trace_fragments.push(CoreTraceFragment { - columns: fragment_cols.try_into().expect("fragment has CORE_TRACE_WIDTH columns"), - }); - } - } + Ok(core_trace_data) } /// Initializing the first row of each fragment with the appropriate stack and system state. @@ -343,136 +331,91 @@ fn create_fragments_from_trace_columns( /// the last row of any given fragment cannot be written in parallel, since any given fragment /// filler doesn't have access to the next fragment's first row. fn fixup_stack_and_system_rows( - core_trace_columns: &mut [Vec], + core_trace_data: &mut [Felt], fragment_size: usize, stack_rows: &[[Felt; STACK_TRACE_WIDTH]], system_rows: &[[Felt; SYS_TRACE_WIDTH]], first_stack_top: &[Felt], ) { const MIN_STACK_DEPTH_FELT: Felt = Felt::new(MIN_STACK_DEPTH as u64); + let w = CORE_TRACE_WIDTH; - let system_state_first_row = [ - ZERO, // clk starts at 0 - ZERO, // ctx starts at 0 (root context) - ZERO, // fn_hash[0] starts as 0 - ZERO, // fn_hash[1] starts as 0 - ZERO, // fn_hash[2] starts as 0 - ZERO, // fn_hash[3] starts as 0 - ]; - - // Initialize the first fragment with first_stack_top + [16, 0, 0] and first_system_state { - // Set system state - for (col_idx, &value) in system_state_first_row.iter().enumerate() { - core_trace_columns[col_idx][0] = value; - } + let row = &mut core_trace_data[..w]; - // Set stack top (16 elements) - // Note: we call `rev()` here because the stack order is reversed in the trace. - // trace: [top, ..., bottom] vs stack: [bottom, ..., top] + // Stack order in the trace is reversed vs `first_stack_top`. for (stack_col_idx, &value) in first_stack_top.iter().rev().enumerate() { - core_trace_columns[STACK_TRACE_OFFSET + STACK_TOP_OFFSET + stack_col_idx][0] = value; + row[STACK_TRACE_OFFSET + STACK_TOP_OFFSET + stack_col_idx] = value; } - // Set stack helpers: [16, 0, 0] - core_trace_columns[STACK_TRACE_OFFSET + B0_COL_IDX][0] = MIN_STACK_DEPTH_FELT; - core_trace_columns[STACK_TRACE_OFFSET + B1_COL_IDX][0] = ZERO; - core_trace_columns[STACK_TRACE_OFFSET + H0_COL_IDX][0] = ZERO; + row[STACK_TRACE_OFFSET + B0_COL_IDX] = MIN_STACK_DEPTH_FELT; + row[STACK_TRACE_OFFSET + B1_COL_IDX] = ZERO; + row[STACK_TRACE_OFFSET + H0_COL_IDX] = ZERO; } - // Determine the starting row indices for each fragment after the first. - // We skip the first due to it already being initialized above. - let fragment_start_row_indices = { - let num_fragments = core_trace_columns[0].len() / fragment_size; + let total_rows = core_trace_data.len() / w; + let num_fragments = total_rows / fragment_size; - (0..).step_by(fragment_size).take(num_fragments).skip(1) - }; + for frag_idx in 1..num_fragments { + let row_idx = frag_idx * fragment_size; + let row_start = row_idx * w; + let system_row = &system_rows[frag_idx - 1]; + let stack_row = &stack_rows[frag_idx - 1]; - // Initialize subsequent fragments with their corresponding rows from the previous fragment - for (row_idx, (system_row, stack_row)) in - fragment_start_row_indices.zip(system_rows.iter().zip(stack_rows.iter())) - { - // Copy the system_row to the first row of this fragment - for (col_idx, &value) in system_row.iter().enumerate() { - core_trace_columns[col_idx][row_idx] = value; - } + core_trace_data[row_start..row_start + SYS_TRACE_WIDTH].copy_from_slice(system_row); - // Copy the stack_row to the first row of this fragment - for (col_idx, &value) in stack_row.iter().enumerate() { - core_trace_columns[STACK_TRACE_OFFSET + col_idx][row_idx] = value; - } + let stack_start = row_start + STACK_TRACE_OFFSET; + core_trace_data[stack_start..stack_start + STACK_TRACE_WIDTH].copy_from_slice(stack_row); } } -/// Appends a row with the HALT opcode to the end of the last fragment. +/// Appends a HALT row (`num_rows_before` is the row count before append). /// /// This ensures that the trace ends with at least one HALT operation, which is necessary to satisfy /// the constraints. fn push_halt_opcode_row( - core_trace_columns: &mut [Vec], + core_trace_data: &mut Vec, + num_rows_before: usize, last_system_state: &[Felt; SYS_TRACE_WIDTH], last_stack_state: &[Felt; STACK_TRACE_WIDTH], ) { + let w = CORE_TRACE_WIDTH; + let mut row = [ZERO; CORE_TRACE_WIDTH]; + // system columns // --------------------------------------------------------------------------------------- - for (col_idx, &value) in last_system_state.iter().enumerate() { - core_trace_columns[col_idx].push(value); - } + row[..SYS_TRACE_WIDTH].copy_from_slice(last_system_state); // stack columns // --------------------------------------------------------------------------------------- - for (col_idx, &value) in last_stack_state.iter().enumerate() { - core_trace_columns[STACK_TRACE_OFFSET + col_idx].push(value); - } - - // decoder columns: padding with final decoder state - // --------------------------------------------------------------------------------------- - // Pad addr trace (decoder block address column) with ZEROs - core_trace_columns[DECODER_TRACE_OFFSET + ADDR_COL_IDX].push(ZERO); + row[STACK_TRACE_OFFSET..STACK_TRACE_OFFSET + STACK_TRACE_WIDTH] + .copy_from_slice(last_stack_state); // Pad op_bits columns with HALT opcode bits let halt_opcode = opcodes::HALT; for bit_idx in 0..NUM_OP_BITS { - let bit_value = Felt::from_u8((halt_opcode >> bit_idx) & 1); - core_trace_columns[DECODER_TRACE_OFFSET + OP_BITS_OFFSET + bit_idx].push(bit_value); + row[DECODER_TRACE_OFFSET + OP_BITS_OFFSET + bit_idx] = + Felt::from_u8((halt_opcode >> bit_idx) & 1); } // Pad hasher state columns (8 columns) // - First 4 columns: copy the last value (to propagate program hash) // - Remaining 4 columns: fill with ZEROs - for hasher_col_idx in 0..NUM_HASHER_COLUMNS { - let col_idx = DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + hasher_col_idx; - if hasher_col_idx < 4 { - // For first 4 hasher columns, copy the last value to propagate program hash - let last_row_idx = core_trace_columns[col_idx].len() - 1; - let last_hasher_value = core_trace_columns[col_idx][last_row_idx]; - core_trace_columns[col_idx].push(last_hasher_value); - } else { - // For remaining 4 hasher columns, fill with ZEROs - core_trace_columns[col_idx].push(ZERO); + if num_rows_before > 0 { + let last_row_start = (num_rows_before - 1) * w; + // For first 4 hasher columns, copy the last value to propagate program hash + for hasher_col_idx in 0..4 { + let col_idx = DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + hasher_col_idx; + row[col_idx] = core_trace_data[last_row_start + col_idx]; } } - // Pad in_span column with ZEROs - core_trace_columns[DECODER_TRACE_OFFSET + IN_SPAN_COL_IDX].push(ZERO); - - // Pad group_count column with ZEROs - core_trace_columns[DECODER_TRACE_OFFSET + GROUP_COUNT_COL_IDX].push(ZERO); - - // Pad op_idx column with ZEROs - core_trace_columns[DECODER_TRACE_OFFSET + OP_INDEX_COL_IDX].push(ZERO); - - // Pad op_batch_flags columns (3 columns) with ZEROs - for batch_flag_idx in 0..NUM_OP_BATCH_FLAGS { - let col_idx = DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET + batch_flag_idx; - core_trace_columns[col_idx].push(ZERO); - } - // Pad op_bit_extra columns (2 columns) - // - First column: fill with ZEROs (HALT doesn't use this) + // - First column: do nothing (pre-filled with ZEROs, HALT doesn't use this) // - Second column: fill with ONEs (product of two most significant HALT bits, both are 1) - core_trace_columns[DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET].push(ZERO); - core_trace_columns[DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET + 1].push(ONE); + row[DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET + 1] = ONE; + + core_trace_data.extend_from_slice(&row); } /// Initializes the ranger checker from the recorded range checks during execution and returns it. @@ -658,80 +601,48 @@ fn initialize_chiplets( Ok(chiplets) } -fn pad_trace_columns(trace_columns: &mut [Vec], main_trace_len: usize) { - let total_program_rows = trace_columns[0].len(); +/// Pads the core trace to `main_trace_len` rows (HALT template, CLK incremented per row). +fn pad_core_row_major(core_trace_data: &mut Vec, main_trace_len: usize) { + let w = CORE_TRACE_WIDTH; + let total_program_rows = core_trace_data.len() / w; assert!(total_program_rows <= main_trace_len); + assert!(total_program_rows > 0); let num_padding_rows = main_trace_len - total_program_rows; - - // System columns - // ------------------------ - - // Pad CLK trace - fill with index values - for padding_row_idx in 0..num_padding_rows { - trace_columns[CLK_COL_IDX] - .push(Felt::from_u32((total_program_rows + padding_row_idx) as u32)); - } - - // Pad CTX trace - fill with ZEROs (root context) - trace_columns[CTX_COL_IDX].resize(main_trace_len, ZERO); - - // Pad FN_HASH traces (4 columns) - fill with ZEROs as program execution must always end in the - // root context. - for fn_hash_col_idx in FN_HASH_RANGE { - trace_columns[fn_hash_col_idx].resize(main_trace_len, ZERO); + if num_padding_rows == 0 { + return; } + let last_row_start = (total_program_rows - 1) * w; // Decoder columns // ------------------------ - // Pad addr trace (decoder block address column) with ZEROs - trace_columns[DECODER_TRACE_OFFSET + ADDR_COL_IDX].resize(main_trace_len, ZERO); - + let mut template = [ZERO; CORE_TRACE_WIDTH]; // Pad op_bits columns with HALT opcode bits let halt_opcode = opcodes::HALT; for i in 0..NUM_OP_BITS { let bit_value = Felt::from_u8((halt_opcode >> i) & 1); - trace_columns[DECODER_TRACE_OFFSET + OP_BITS_OFFSET + i].resize(main_trace_len, bit_value); + template[DECODER_TRACE_OFFSET + OP_BITS_OFFSET + i] = bit_value; } - // Pad hasher state columns (8 columns) // - First 4 columns: copy the last value (to propagate program hash) // - Remaining 4 columns: fill with ZEROs for i in 0..NUM_HASHER_COLUMNS { let col_idx = DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + i; - if i < 4 { + template[col_idx] = if i < 4 { // For first 4 hasher columns, copy the last value to propagate program hash // Safety: per our documented safety guarantees, we know that `total_program_rows > 0`, // and row `total_program_rows - 1` is initialized. - let last_hasher_value = trace_columns[col_idx][total_program_rows - 1]; - trace_columns[col_idx].resize(main_trace_len, last_hasher_value); + core_trace_data[last_row_start + col_idx] } else { - // For remaining 4 hasher columns, fill with ZEROs - trace_columns[col_idx].resize(main_trace_len, ZERO); - } - } - - // Pad in_span column with ZEROs - trace_columns[DECODER_TRACE_OFFSET + IN_SPAN_COL_IDX].resize(main_trace_len, ZERO); - - // Pad group_count column with ZEROs - trace_columns[DECODER_TRACE_OFFSET + GROUP_COUNT_COL_IDX].resize(main_trace_len, ZERO); - - // Pad op_idx column with ZEROs - trace_columns[DECODER_TRACE_OFFSET + OP_INDEX_COL_IDX].resize(main_trace_len, ZERO); - - // Pad op_batch_flags columns (3 columns) with ZEROs - for i in 0..NUM_OP_BATCH_FLAGS { - trace_columns[DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET + i] - .resize(main_trace_len, ZERO); + ZERO + }; } // Pad op_bit_extra columns (2 columns) - // - First column: fill with ZEROs (HALT doesn't use this) + // - First column: do nothing (filled with ZEROs, HALT doesn't use this) // - Second column: fill with ONEs (product of two most significant HALT bits, both are 1) - trace_columns[DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET].resize(main_trace_len, ZERO); - trace_columns[DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET + 1].resize(main_trace_len, ONE); + template[DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET + 1] = ONE; // Stack columns // ------------------------ @@ -741,8 +652,18 @@ fn pad_trace_columns(trace_columns: &mut [Vec], main_trace_len: usize) { let col_idx = STACK_TRACE_OFFSET + i; // Safety: per our documented safety guarantees, we know that `total_program_rows > 0`, // and row `total_program_rows - 1` is initialized. - let last_stack_value = trace_columns[col_idx][total_program_rows - 1]; - trace_columns[col_idx].resize(main_trace_len, last_stack_value); + template[col_idx] = core_trace_data[last_row_start + col_idx]; + } + + // System columns + // ------------------------ + + // Pad CLK trace - fill with index values + + core_trace_data.reserve(num_padding_rows * w); + for idx in 0..num_padding_rows { + template[CLK_COL_IDX] = Felt::from_u32((total_program_rows + idx) as u32); + core_trace_data.extend_from_slice(&template); } } @@ -750,7 +671,7 @@ fn pad_trace_columns(trace_columns: &mut [Vec], main_trace_len: usize) { /// `CoreTraceGenerationTracer` that can be used to execute the fragment. fn split_trace_fragment_context<'a>( fragment_context: CoreTraceFragmentContext, - fragment: &'a mut CoreTraceFragment<'a>, + writer: RowMajorTraceWriter<'a, Felt>, fragment_size: usize, ) -> ( ReplayProcessor, @@ -787,7 +708,7 @@ fn split_trace_fragment_context<'a>( fragment_size.into(), ); let tracer = - CoreTraceGenerationTracer::new(fragment, decoder, block_address_replay, block_stack_replay); + CoreTraceGenerationTracer::new(writer, decoder, block_address_replay, block_stack_replay); (processor, tracer, continuation, initial_mast_forest) } diff --git a/processor/src/trace/parallel/processor.rs b/processor/src/trace/parallel/processor.rs index 2ad9504a1d..4007e7b88c 100644 --- a/processor/src/trace/parallel/processor.rs +++ b/processor/src/trace/parallel/processor.rs @@ -16,7 +16,7 @@ use super::super::trace_state::{ MemoryReadsReplay, StackOverflowReplay, StackState, SystemState, }; use crate::{ - BreakReason, ContextId, ExecutionError, Host, Stopper, + BaseHost, BreakReason, ContextId, ExecutionError, Stopper, continuation_stack::{Continuation, ContinuationStack}, errors::OperationError, execution::{ @@ -41,8 +41,8 @@ use crate::{ /// maximum clock cycle, at which point it stops execution (due to the [`ReplayStopper`]). /// /// The replay structures and initial system and stack state are built by the -/// [`crate::execution_tracer::ExecutionTracer`] in conjunction with -/// [`crate::FastProcessor::execute_for_trace`]. +/// [`crate::trace::execution_tracer::ExecutionTracer`] in conjunction with +/// [`crate::FastProcessor::execute_trace_inputs`]. #[derive(Debug)] pub(crate) struct ReplayProcessor { pub system: SystemState, @@ -62,8 +62,8 @@ impl ReplayProcessor { /// Creates a new instance of the [`ReplayProcessor`]. /// /// The parameters are expected to be built by the - /// [`crate::execution_tracer::ExecutionTracer`] when used in conjunction with - /// [`crate::FastProcessor::execute_for_trace`]. + /// [`crate::trace::execution_tracer::ExecutionTracer`] when used in conjunction with + /// [`crate::FastProcessor::execute_trace_inputs`]. pub fn new( initial_system: SystemState, initial_stack: StackState, @@ -443,7 +443,7 @@ impl Processor for ReplayProcessor { &self, _node_id: MastNodeId, _current_forest: &MastForest, - _host: &mut impl Host, + _host: &mut impl BaseHost, ) -> ControlFlow { // do nothing - we don't execute decorators in this processor ControlFlow::Continue(()) @@ -453,7 +453,7 @@ impl Processor for ReplayProcessor { &self, _node_id: MastNodeId, _current_forest: &MastForest, - _host: &mut impl Host, + _host: &mut impl BaseHost, ) -> ControlFlow { // do nothing - we don't execute decorators in this processor ControlFlow::Continue(()) @@ -464,7 +464,7 @@ impl Processor for ReplayProcessor { _node_id: MastNodeId, _op_idx_in_block: usize, _current_forest: &MastForest, - _host: &mut impl Host, + _host: &mut impl BaseHost, ) -> ControlFlow { // do nothing - we don't execute decorators in this processor ControlFlow::Continue(()) @@ -475,7 +475,7 @@ impl Processor for ReplayProcessor { _basic_block_node: &BasicBlockNode, _node_id: MastNodeId, _current_forest: &Arc, - _host: &mut impl Host, + _host: &mut impl BaseHost, ) -> ControlFlow { // do nothing - we don't execute decorators in this processor ControlFlow::Continue(()) diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_01.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_01.snap index 7bb8930453..6bddb9766b 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_01.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_01.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 1, 65, 97, 97, 65, 129, 129, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11959214793721861949, 35, 0, 11959214793721861949, 5598651459581075585, 34, 0, 5598651459581075585, 8, 0, 3358534066525179769, 4141253528664299662, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273], [11044849754686238278, 0, 1, 11044849754686238278, 7804753453550466256, 0, 65, 7804753453550466256, 0, 65, 9365253138981608257, 4690506171811599662, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113], [5121401795821831283, 0, 0, 5121401795821831283, 17777748786253636403, 0, 0, 17777748786253636403, 0, 0, 4243893038989355703, 7471531250255239926, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602], [3548930057165921670, 0, 0, 3548930057165921670, 9435312778805252724, 0, 0, 9435312778805252724, 0, 0, 2372900269115514267, 16928201695930024468, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552], [4141253528664299662, 0, 0, 0, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4690506171811599662, 0, 0, 0, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7471531250255239926, 0, 0, 0, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16928201695930024468, 0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 2, 2, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2, 2, 2, 3, 3, 3, 3, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], [3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11959214793721861949, 11724006094392302789, 18248966067159614734, 14997726253538871503, 8817287785847965336, 7563891540952433248, 4929456476937587212, 11106581516038722988, 13463537305496517162, 10651632781918411385, 9981866502219755654, 3808288102601471056, 4944845091089272806, 14634692017250583903, 4938442710501308657, 15019076788922615346, 12046519037910030840, 12002553001135911279, 6648246339606676671, 13611030331766854764, 10789879208843041511, 6935978728922643823, 7357466921077553394, 7069639777384924144, 10796630853015597058, 9600475765342551835, 15539063566397429438, 694626006296126791, 10333172214933120836, 3750356548306982137, 12302499613655276109, 6116677274871151273, 35, 350, 5140376474314663948, 5151077999657789073, 16885380856972561696, 4396313619195267116, 5306671686393489364, 7956822041329119795, 17818361021916066381, 14033097286562039884, 7821625366477940937, 16833029552007335772, 8428385927199104618, 1983549081678798610, 9947044966489369966, 13964889898869345750, 11121186483480785338, 9818108804633787874, 4883454229697807874, 7144378034515727713, 4313511094695098159, 3382507463453404844, 1457665291681272839, 12934070243418782738, 1587788786427634902, 8220166220981689928, 1303361134214255144, 15371623169605597371, 17525379757599431696, 15824846667317041360, 8992618192991263654, 11959214793721861949, 5598651459581075585, 644336023812026242, 8962397996249942813, 6385487366266632060, 15421658280337698465, 10565312036761368185, 12143712587225756222, 17266990262046250797, 10756948069435380801, 13737908976648726909, 17026264676264380541, 7825754886390455440, 16047304773895114845, 2736732063999892145, 13983789395651571583, 13470168189302134725, 1436972360246592622, 3363240447642516424, 11460348809250776143, 6982982338498759911, 7828293012926775020, 16631334376547321750, 3136253412904926398, 12922287692448102380, 9001750416037636327, 9873548594897521512, 12362167187142713720, 12998286769972940151, 14911169987988052811, 15100444854223162361, 7731918223558949955, 4141253528664299662, 34, 340, 14059267169109730234, 15746924929585133009, 471985631500087772, 16946433723443173275, 4595135147820207091, 2053997855496151567, 18402496786565368100, 387609426153233273, 8469665991798416914, 7881354678273462636, 11816560343993810599, 9054561158700241520, 7881520773741268125, 1631726701000003728, 9048332065221759951, 11440521690988525934, 11399562976973524004, 5295775600298609171, 16854936978988550164, 4555566089436281371, 8045874719633055695, 11420674364099598202, 11942861833844189240, 15820096964950298640, 4263756598719013378, 7647209523022736387, 13465875315346524402, 17464705757459592393, 14751425303934963720, 5598651459581075585, 8, 80, 16253482711025978099, 16690839578921925157, 11755424915479552417, 17934377671577204140, 15509754874715907467, 6426721221030580337, 11049594146888643723, 14912334368661229147, 17657273147290084056, 9105126057127804171, 13430225876739607206, 3614830725909060912, 14569284676797348998, 4705513459362295944, 424917224365117418, 2835737623710330612, 1964100172858915134, 14896843043547784767, 15482419984058848245, 18437547705335910066, 3162257106529980441, 5297995970636059087, 9661978795293871188, 10128143329575104151, 770728251595531533, 9782965673735423214, 1347942901513492691, 12086966446141742548, 10239457018222882008, 3358534066525179769, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11044849754686238278, 1065714023649388913, 13590585102940813084, 13603816939964373123, 3385249563011961849, 112536514236739072, 1106452645962150895, 10661905560677698362, 15195193333392427571, 1271054956149481152, 2058632847676165296, 14347073347558249169, 9693072255291891063, 14859780105168189871, 5613057382731574150, 5623448817324608138, 7997999549850776178, 5693866887050036020, 14258871931331407358, 2547009721703928454, 4107508461331672257, 5068231609320466245, 14744046358319534345, 364669749717258, 12759453666142542994, 15815678790725651452, 17691418632824774891, 5288331248614959742, 15557683662491153084, 12209140182523723096, 17383410983291524378, 10392133002436897113, 0, 280, 3739327994472119619, 9855163346786806166, 7272719153662087111, 10277182995998348622, 1557779935350354179, 12598977243905958375, 5757159540459665691, 3544925687412308625, 4454290108164189834, 10562329593955594288, 13328511337210905323, 12548482778894690532, 18303351465385086236, 10622473817836825208, 10391858004672883604, 9244678019206311862, 4905634085052053166, 12384227405658404185, 5878623689014611519, 5361442612107937799, 5203395718336603194, 12505885186641282427, 1657982123928418916, 14802316224598370353, 17429829341045194126, 12187663825740955518, 8834060796313238365, 856881534780831669, 8614320689815223473, 11044849754686238278, 7804753453550466256, 10860407685663036622, 13564283360082851490, 16294057552644672316, 6097183689626534496, 5142791099649335720, 16773516463636660187, 10484693517503369961, 15510754792097734964, 5061563839137660876, 2683909803925041834, 7997738108478273878, 5467755257223357975, 14923583333953915684, 13294611871319191983, 10569196959361608760, 13906642922547692513, 2845656992888419272, 13828314707091500290, 2951356764607352638, 4406743315212729130, 16360792604504139514, 4146070061564888443, 16122102826540224213, 623220105874852865, 3573414414778802861, 7652433402428128865, 1221918952773084874, 9684204095164476815, 17702995505216793489, 10675603116079282076, 4690506171811599662, 0, 272, 15833028045737259664, 379315838026506093, 8581974592770288933, 17442451301272882541, 16579750051606898066, 5674487159031204202, 1541891846645406613, 8209041782659254452, 11966225502153548517, 9096730616149686024, 15618906860941665577, 14146738543483816160, 1119526938685078607, 8710432271010401746, 13282504786121257878, 1858131981777548381, 12223656597910297554, 11826686549344788050, 4472804247539583969, 7599118004690938513, 8277718642341650597, 8460103377465445883, 4568736565087160671, 4933680726900799861, 16645964836945405904, 3680609073412509534, 16176623117443515258, 15081244610133230814, 6410948793715747581, 7804753453550466256, 0, 64, 5751576643258238090, 7830268710878889486, 4868320831660690795, 7042762868047858013, 1028615964620729689, 12270587957620579653, 7267371538363991280, 16125626865182516658, 16950134439933558852, 13427183447069512151, 16117382505273595827, 2222792985740553749, 6517696895688418945, 15516128650333221731, 6357034143715229949, 12960707821770488929, 12451444460344609421, 8786747128188560390, 7634329044629047826, 7741107824034642016, 10975559322169081956, 6007758954686348362, 13971256108093330407, 16868860295450858142, 434120282701603474, 11571634562637977474, 5581285869985960561, 6581368197537384623, 17661012293298952642, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5121401795821831283, 14666269722110737492, 9590621322847534573, 12932191302609726157, 17918869724719667108, 14326240507681405072, 13067917358519389481, 6815648073963386989, 12352345465945418691, 11261296525909619502, 7689378518287963220, 10584893895333648109, 1804101714182174693, 14360593671180620787, 10105110162171772438, 12398505852787426318, 9692172226490565230, 11964900944541509452, 13385745375779151291, 2217858628481308506, 4621662715196065678, 16647480880251479677, 2589374608845270941, 6809248840077290249, 5129749784462500037, 3245840590205743440, 1922074210551113159, 14644738552419224397, 1598739907793205518, 14526700523373973306, 16517594411296145407, 10134148635057625602, 0, 70, 12197195286374413309, 10427073607190553707, 533047373605454411, 10580779234737523528, 15741781055361060589, 7164202101070087014, 9765809951316535147, 1782081390036413323, 8331595035611127917, 9697859497182376308, 7215394876392616273, 6137901882901182614, 6110992258367195164, 9375455911463634413, 2858682112359859723, 11530371422565574919, 14558386734229473932, 5193748514123930238, 4405616242805307371, 7842663293116063328, 13893940361375217996, 78901366432993105, 3701164965690212066, 3898705475678625899, 4285338701077916719, 1106459456301114152, 8610620161032996227, 1345962755312618543, 5938021660540313570, 5121401795821831283, 17777748786253636403, 12906637371964794674, 15320836901220842229, 9687580313089453282, 4646487368895915296, 14821642720711744364, 8047695355547001029, 10749686584146612549, 2375067891701857361, 12672901980323560015, 13290437551032339902, 11956271016055823946, 12186036345271050649, 10541464479696610661, 5847635127357093482, 2710785219086425297, 13630517663920473907, 16007826574763812566, 8148616449491580734, 458107884374711321, 17819043892120276345, 12445943926803700033, 9955553630570974315, 1387322623565652732, 4082304616394368279, 14346319199041833303, 13848956826511295359, 18438638174686917351, 10202942699122698773, 7439539809669146478, 13477200069544690909, 7471531250255239926, 0, 68, 4457596741936238930, 12529581077675993243, 303974201734355881, 13345903392866909652, 9586267930884889862, 5178817950472007665, 6608322246477847509, 4070515537963445793, 9312477480709452614, 8889792067304111866, 11078425489498232713, 636055309231688517, 8580323529307502020, 12246954824275240956, 13948398243979685168, 14683551372837095812, 4744943918536266830, 10091391594533925883, 11270159100715194202, 16104697287955959682, 2983615207234436698, 10804815118997327370, 139420663301414639, 11145521977996788455, 1535579717520953536, 14470422183799365804, 208588932528011586, 11685358340804306780, 2822178276157738566, 17777748786253636403, 0, 16, 7110029021941723513, 10115409991715085575, 11428668827299215140, 4015039023438705588, 3732466887400149035, 5870841944205588609, 8421627027326523148, 8231214549142439222, 10318470559229280016, 15171283498151438808, 12477430934852872037, 3853779543897991795, 14662750186533371679, 7423988381383082226, 13549468426633458145, 11079168775731474830, 12471207782095033761, 17595325414333663547, 7042468264080735391, 17650115337646869205, 14946074228061446423, 4655654314239637986, 11187552516160183253, 18115881480442018545, 899748567092010447, 14020868337400209874, 15417366235984526759, 3331301994171189600, 15814677761660135474, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3548930057165921670, 11599182054654736187, 4885112663983886856, 12798756157498171562, 8555258669059245167, 12593636579411959551, 1751015532861688472, 13019009039270359101, 10174923844635011062, 15012513810591484516, 16650490536433444505, 1428273348489524024, 5693483119278040520, 12915240062722269861, 8183805712769991021, 1654142869540548129, 8049024691721442269, 8293446604021081650, 3020690079986249537, 9829005565890494186, 3079504282059755968, 4458043056162108579, 751694847316855704, 17801775841166869486, 9610894500726595609, 11754871869039418305, 3106011472540779982, 5534818333558495963, 6265664197169483681, 9801143914278062154, 2114471287922017076, 12864813595450034552, 0, 70, 8260931550665656557, 11893740670479805498, 1829926574142237762, 1594484475404924132, 6975828079371970675, 6084696993723509491, 9595530987647092729, 15971750173693346214, 11203921366229716627, 4563063455320265667, 11788904100176198733, 5330429808657306820, 7735824317535531109, 320993418766884621, 17183008147454152591, 12480600709687621128, 10013781853527055299, 10535753745093412026, 1262088577389795166, 11216661268945885709, 139199134922249731, 5046795949307964432, 17871092368823791710, 11987849509093694665, 2910522803612995552, 8688806902442064031, 9527459414368740643, 17392858720163980888, 500779098360895522, 3548930057165921670, 9435312778805252724, 12594665258064570664, 7059236745058640735, 9552556216292266897, 4246851900171193724, 14051544049298817271, 11784642469202829877, 7043511220559324099, 2923239127151948080, 3593801949375944745, 12822730519972797871, 8453074578285752653, 9394265395193498181, 2676701676156012803, 9897038047323897370, 13273146919350422539, 8734416771856167315, 10836844319802726945, 164526851958521730, 17195525663426568111, 10288960109250570842, 10886225029528628150, 17237759664671057052, 295310595529849583, 1818311521513634717, 289062595793298208, 5959646737238852401, 13643407453100925757, 9822906574365710103, 17892016949428967969, 9033576496544593982, 16928201695930024468, 0, 68, 8186419089203192999, 15318603549361168513, 7911471416782656233, 14239435248344205979, 2133634484310994464, 8097913535946941412, 113263425049039362, 248987352426060274, 10939256691674299939, 17358468187481791647, 12423884741952977957, 56617284060232395, 1868806426895026968, 222259776750343599, 15059516987340721081, 8741184015917561905, 2066403566980848459, 3696239822839219697, 15367181090448289261, 8349149003644261348, 10280553347796952088, 7301079719327054003, 6885778115777578237, 12504375544103392076, 9288443086735636960, 4503182154932177101, 17461402434481489861, 10152174670869705735, 6117144343302310887, 9435312778805252724, 0, 16, 3208043314804619251, 6920597847411412414, 17985619796195836408, 11907191178709112742, 16377455862733420451, 15572876043608056600, 9466912758182965715, 17480763791598773801, 15029113851915312964, 1953587265841775225, 7175742902791404624, 6820764940134875350, 16069841829669607101, 15548451706938320654, 11760680638795846495, 1560700914733041660, 762367990279432470, 2603436428456411224, 6200990949184863170, 11673627333152839295, 7804486006334068097, 1006207264024395366, 11193609705356653459, 5704515878100803393, 14918729158665343812, 10658508130485449873, 380737719356524599, 12870561906904032245, 6984680585936259437, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4141253528664299662, 7535227198536906721, 13157788436891508553, 12242844110543519517, 14956019708245712821, 10570950564294000321, 17480412968160901529, 4150746739043008211, 7668476027270202579, 16656590512852921222, 6540695355644326389, 2062361183656478066, 6992883056491326847, 11699589910980507023, 15900656105857229467, 6696171278998449226, 13168835889056955304, 12256719005104851107, 3837048139847179361, 3160764979077625659, 260627379830442974, 11253217769249016375, 12385338833843346575, 13819086418675951632, 685348230246056503, 8109480959271599370, 15257531885396120213, 3680188101282186784, 7206583663178666402, 18199569338713260127, 11998802949255523211, 8214490973132607971, 0, 175, 18424611315455665672, 8660762125905589832, 17127340306827455573, 2784948507084849054, 3893738632331286853, 3285198522433859694, 8347633294012310580, 1716176048133035367, 17973624234065242957, 16459952452199547026, 16037889673287918578, 10274502539576810724, 8768898256362256567, 9056849240288317429, 5470591020023050699, 4574304056007112162, 8410472682472513857, 16137982984163538210, 17597264692962831013, 15736663856375030006, 17727370521374436910, 8474944897236640626, 637885636686826709, 14676123610051724022, 6045066589466757281, 14903105088638349433, 9178488780906183949, 572497659895507109, 14724337405152116499, 12030454825456445148, 3358534066525179769, 2539641719046213740, 14597771066871753553, 5977340097238271765, 7707653349895837404, 750410385838623118, 17202523259145509542, 9826125054086633997, 10704182720413467090, 14182542421389276936, 1208823412034618259, 17538680525690853062, 16486686521840942874, 14299802542131844724, 4141923705337186001, 15072716099695791702, 13709137995402237101, 1759841724041652075, 8081765454289246423, 8476759162841806182, 8627241529856509742, 4347076460454100596, 1495131601817209461, 626496362396505138, 12905076793136293016, 7898562997016536225, 4051444777808751499, 10985547818594749595, 14333518987829918669, 17843924827166978222, 10647867748676596435, 8523492539397344614, 0, 170, 13502722698945446624, 10582364865337924932, 8264438684589566467, 7775924941916048886, 7506941477585260226, 13559643900430805558, 14624701183045087851, 16810498729905278091, 3617722030424605287, 12209401598010007429, 14622001497128700788, 7124074456411373593, 11046353624103181594, 16506916834573600874, 2763493011778369288, 4381652925229768341, 9935322272824673857, 864619558035150967, 1868429356172715569, 6908757966622831414, 14123318794287563052, 4877497612363750655, 2105400693641679480, 8941132592749341698, 12124737918817624189, 15847492668873519030, 7578220797847929864, 9410406960468072857, 4811333449307081983, 5256913258227871425, 0, 40, 18130890293586930078, 18252951749527557342, 4460903658820341507, 859505755654562117, 5961685480015386121, 12134776249586726543, 11174658189737631113, 18385152961050631924, 9881471501704199804, 9636744945302995714, 12323181865658998064, 14903454669611502952, 1490539036394497080, 11688514875590095153, 16093513520259190726, 7731471377060742735, 5247500963110975116, 5269361527156951110, 13733877647296302634, 11865469401112846356, 7643242142337524006, 15572658687280648106, 9345628789826937825, 3291248301730279223, 16808111015808513609, 16274730253017522022, 12243901590027926887, 6559275936659510680, 17224785255700525855, 1390310476158884261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4690506171811599662, 2737440767612572473, 11521696315622895181, 1112809250875085271, 12021362864117640865, 18151871077622688335, 9897941768997576086, 4026157395886157229, 10359334248806725290, 4146117248162417047, 17246235733851217304, 10866279963718241802, 11383920474028743559, 6348426772268882755, 4713833248608103744, 10090565134847963788, 10865777585291872469, 3995119331147317584, 1039809878544438546, 9281899713308431529, 894389675194381154, 14912731377283108791, 2518971765323930332, 14554524254203776994, 14524699810240327783, 2026981110418907406, 12320900210322448034, 6520538036510347086, 6198597980723382916, 7473328648066901490, 1026110231435118088, 4584625016228750380, 0, 140, 8710514240711102938, 3087828367487460915, 8550318671602553781, 4930631020140393563, 1021301660011942544, 3073595205709678428, 2828555514110129215, 4454529496924239314, 4850807088481902893, 8327420331623942113, 5731477673914408028, 9865807300278005609, 453077352291409865, 12820055819705071946, 17847152132518767621, 8150970536507693114, 4592469706020729085, 8591936306357206220, 9734673703119078710, 11269239869586993393, 13212629127542823790, 8294118794714299790, 18005585695632222469, 5850018245424229562, 3823107055299292863, 11302847087529014346, 6890858608219888881, 10680339138669917038, 9892588909603237147, 14743087584632180635, 9365253138981608257, 9113412038486870528, 12891440258701617795, 10322300200196682981, 17715988767376665360, 12529577197437921705, 6552591582707442459, 4758921283651545108, 2473371596923514175, 4508995650639757747, 8913958469585669066, 3583695132258196536, 12251718655020006238, 17851199719794441593, 8176730118494162678, 9396959786745583185, 3556146813643685764, 10220987366360269577, 875353240064010198, 3230914141298165225, 12763806424191572386, 13303243524843396217, 6289147021348404787, 12692366118122891151, 8285789034090944076, 14023237997722359599, 17743718519616976296, 14731468822320978999, 2543793480285047170, 17021793130360212806, 11915740833798992018, 13282343245327117747, 0, 136, 16864340361327671903, 2636070061904000825, 1539270658943308645, 8663103496298937284, 797155414931197277, 7929222985705309752, 5418421295167202847, 16520350781038259800, 11697635461652845634, 10326065236143981873, 4672452207442160023, 9236109584144478544, 2355139499180822246, 7782053902926446231, 2620978815438101291, 3668923621194401622, 246363526423127035, 10353083146864436335, 3430895131654614161, 12564495361718767183, 4982750975383300564, 14559648290526166949, 6242143746593499460, 11140632426269699329, 3028234720115016827, 6653412960111738263, 17564919688262005304, 284282844772359316, 7938696543505248162, 17100537000217132265, 0, 32, 10452764368937945515, 6969997263492352670, 15570786589164252178, 16136993048454358354, 16378352067056606124, 11747573379431147483, 12296464969648251345, 8155132212936940581, 2470200969414032680, 18126939303114916528, 16736276280592238734, 15549342782445497049, 9033882039108268313, 5121596298161079296, 14336897502470956191, 6301009824137139871, 16614860627935231068, 10383378433371415142, 10330363517752279308, 10937466001850040595, 16305844076412050396, 7189713532379018536, 7568236447715590536, 10805187342082326609, 7424874700566577356, 13861219118264849665, 7052270251739242825, 17586339544079318164, 14071176523136369481, 12282546735285148319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7471531250255239926, 957106104872100553, 8426354436255247671, 14696972132215546141, 16692922442306646447, 8874979589420119367, 875297058086066175, 17626443192502070146, 10085921208436197132, 7288928467232887868, 17085775336106720298, 2718833903563323199, 7078253443595954934, 13309456694532316914, 5975284652827254996, 4866716465241707365, 9487238857935659569, 17181552195820469706, 8127338887120154462, 11933049108483241248, 179996691661177615, 3374573212837962242, 4025363669025839136, 8885320358009245035, 7362303317308040642, 10721260413929615658, 11637817792474845578, 13461475369693849006, 10395653141429564317, 12120812098909026742, 14623333492544617469, 7448701979965755247, 0, 35, 13745802786964652170, 10807941376803729065, 11967821891194701924, 2468953284439066013, 14003176497724809129, 4195286142867428231, 16235476345222743147, 16311400958482462738, 1275416753317277649, 7827742839669371295, 15144275993610658984, 17059326124115937407, 1609065912712094319, 1953375973007785317, 4662315141802736133, 2648588484571064605, 10314135606564051297, 17798108062832293769, 17976467869316326526, 10521545375054979384, 5478438738361095924, 4079016485765258670, 6409557376003924138, 9751499496869829327, 17630322765550216924, 17889552338200421323, 13578840114630190185, 2119568863265536467, 8158174533637128652, 804908825530740834, 4243893038989355703, 8922317147540258088, 7976296880270099068, 279851189829800217, 1629791578136936575, 9250281207577685312, 16325213226883592903, 14233424972710589898, 1150752289248225959, 13420723953151700222, 13103867886586495168, 10246367578585743447, 9749713722270402553, 17275110341684860619, 6783090395235209659, 17969645096023124419, 4121935965911645088, 4288337514646499477, 7084144568226748800, 6029442255508906403, 10924085850925815890, 8369007777733896382, 8232780781393445755, 9118931780992437842, 3679317166559661163, 5036788400317364302, 4470738656604083779, 8115411932938273702, 6422638912707970220, 16012433424607683700, 6326608805282345628, 16657610054734022844, 0, 34, 6567391571487826395, 5204289601743072522, 3431536436519013066, 18098398151169262506, 7669185665212226764, 5455708142000104069, 9902960937688969164, 16439153306838678161, 9116909952501731628, 259487815978835763, 11207509487307725092, 13598970521047669184, 13294225392413433281, 17974846784869714720, 1531979193630020279, 8742633689618768661, 12951219828222672250, 1272063647175062154, 1015593294205135440, 1601391529726059156, 6891640398393941397, 9120291006888379304, 10474372360890458437, 5584077426972546342, 6680864214558642932, 2419346771478639592, 9600963709893327666, 7733975108380115257, 3435995547523177385, 10362535235958450122, 0, 8, 9114363797835460134, 5446076396314160376, 12863008906537145423, 10008421878335836436, 9952321233871043669, 12872379155893703237, 7266552182027361169, 1266036355585216796, 2621902104176569009, 8791105532651972211, 6351975813451610601, 11821139808280113179, 11281913023757770338, 3277134497757048289, 13219080767636598429, 10181825490691565485, 2766637533497216499, 5527857141123489970, 8463471033597650592, 16863468430858262436, 4521466714741486225, 2112404415880305855, 6776665887355979100, 4283028800297139078, 17448147405455891940, 2672696094870261596, 654959311657763753, 15404879372302137522, 458610335793450516, 11708893791522292939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16928201695930024468, 13316048579382449360, 2713831240363482992, 17933860786448377030, 12140276230850597158, 1606372307127613897, 3188770991194636906, 14438001176756564964, 16448487398099419345, 9918214746375746352, 18110219924373985313, 7493603045769629260, 745957266720787386, 208949971747081929, 17140128915513269672, 10592811345979549626, 17407028959895176066, 8512417397041248917, 7287596669447050848, 9095813259348077504, 12193512270869861572, 13556169973586801756, 14690878971952130243, 3851130964131028937, 5140683189548028765, 4356298339163646871, 3363935513258073239, 6101475308358905031, 15929576060773374367, 9238706649514600628, 6772806779673451094, 12849137552501188796, 0, 35, 6548375970637655697, 12966884757436832352, 8617173377985249829, 14369692677316723198, 7988737883003214917, 199454479220437296, 16488861457711574881, 7336046662918934307, 15030081564191678849, 2458019052558535305, 3971043898284956979, 169011925839529283, 247484960726213991, 11098826393785027594, 6337173918784738400, 11606973446973456199, 1842388487495083111, 3843434841734991971, 17692030742991723124, 11518912608009699621, 12820002738657995668, 7568893198878892067, 7859209399338136233, 14455157706277846466, 4973217863350539721, 16132832657712782617, 18189457662137520245, 17447468029829501860, 5366612376176920228, 15978537433270792071, 2372900269115514267, 7638869850317184912, 9869196225863171361, 6918765821995287137, 1369739146488483681, 1289422996858358477, 3642389184556912711, 3891108637149977246, 15140294830527696728, 5009228872137272209, 7715172072574760928, 1421290680685617214, 14403164863632503479, 10265245098090210711, 7174788237318142123, 6381427654975252574, 7602994898079563251, 15302356383007635999, 15586805931977175637, 18437766594761332377, 11240603387110570141, 15093603048951386807, 7035853470370737247, 1835696655621331722, 8169021299801629244, 14781376510855187932, 9409022898528060781, 10695296899698374978, 17063170837522968299, 3702512996340883595, 2628586313169132635, 10245076951199455280, 0, 34, 13313027311321423572, 9192034959170904294, 14701500658652215925, 3854356596578551734, 5718692378574184090, 17501390179378757090, 8526809416150489728, 6507550884061463423, 7814960517829781662, 2939637999200097803, 780950602796552578, 4118107554308446430, 8555475415255527439, 14714307830357033751, 15614510648083677054, 17171454789201612359, 15897739400545916002, 5578273266312075011, 10191353484336583572, 2940473809902205523, 14962502826274181007, 2115641271859045975, 7064236544478437245, 10824702985925635247, 12931918488324919856, 8429882718924461151, 11244752067809188397, 2111913529644288504, 6112640616610282754, 6599190416745833044, 0, 8, 6104172690014223231, 3119855977255645286, 2700229040680838768, 4228220371303630837, 12976691418076017877, 15391527008624099592, 15522155400452634037, 17655908650961725957, 5157987610310047621, 13664486701019622043, 12908699189677656287, 14840926611057477527, 6092037682822283700, 15181448373122947619, 2083722204849270202, 1893419523737526751, 11329911669537538562, 12331432886354737271, 9636585409664050258, 5131588463040403759, 10248116973079783912, 2136665268102207704, 17448444978654544666, 11945433761064128885, 4462464721020457233, 17579935132869425842, 7098417589530391109, 15343623253038912080, 7762335122892638892, 10310226363807226654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 6419744430976403982, 3447697248540225808, 10044864192452182412, 7058340312231756422, 11424300291678555912, 15031231631039778878, 2669622821021436503, 14911345319478414189, 5914533097243323078, 8371470863620210867, 2533220603754125879, 14376937495131853153, 8539659581227571270, 10662827764253743390, 17166726581641984506, 11280387487817815677, 15742094452256624479, 8912948444301774054, 14703675557715690630, 7196421200244503747, 2515843481723679483, 9280041324473036738, 9451078778045131871, 18129703980105207203, 16085683684539047157, 7181119043238227738, 17090649967623261857, 7951988307407900542, 13025686387588160039, 10950281275289859162, 677561570464011141, 0, 175, 14697063750404833549, 5887611756450648665, 4390455106880745190, 12605921110673978057, 3909247147397492340, 9689010753727301488, 9581721436999738864, 16354053311311796732, 7989095941327388146, 15260860572373553109, 9500012181060025316, 18019646022591970627, 9649122197052954943, 2900327270128075, 14086650041861556859, 3689293233291605771, 13498186418617526222, 15088669255793884845, 8596529378407272747, 16168113363552219541, 15854163065073538636, 9399437128660150397, 7202708241142113012, 14757940169676147698, 6949143047896273946, 15186394770637938057, 3979322074577621357, 5317810489943751161, 13663234493876910991, 12876040067831025585, 0, 1061325914286080806, 16723391107514202352, 9754566926160679801, 12819365845000407643, 9991664912056245947, 9847657839340877601, 9218945951971409528, 17937489760159731410, 6898590972078729604, 8642762389205548177, 5286310130352931456, 3192683419970405684, 7291895670920337828, 9471733465477014135, 5916843872480033571, 15161469576939421414, 10084364066798723299, 8948842015142234828, 11061922567205483533, 4596163035992380964, 16524077373781301709, 3948990276587207306, 17492638446874188318, 14193096602587779175, 7319641733964937743, 8739778943225234768, 5782681438096211376, 11891715600478694595, 5580010029452924235, 1761218265234642115, 11605105809497505058, 0, 170, 946461078672821334, 16281780351388912901, 2935418863412242354, 14713353090133347394, 1791207195906381248, 1092415958346704160, 8319785044806982194, 11182822967626325795, 16809587424157045315, 2244733962249620937, 16303706249485479712, 845878992383212753, 5921002467687226204, 4434027484725189444, 15967620315457307754, 17386925554974145101, 13158427748622481094, 6196246176234489731, 8582026933349467190, 611778401982756412, 16288180016347524015, 16434619985909351985, 1145514137751095479, 5160952971387430527, 8451565207539691282, 5967893180517848182, 7714774968702541161, 14978023560208702638, 18014742166879778909, 5450578834500306709, 0, 40, 1560947813056021755, 6935064976442414148, 9999441144135002932, 10354700837586583171, 6040781227937012106, 4698117391978117444, 4735711626023545756, 11217844833019453026, 3130590714605394722, 2809204122464618686, 10935232469327759448, 18335893537613898174, 10868401885487323501, 15799177281014635734, 17187052562019754838, 4027411046406207040, 11879721967266924677, 3613659344771632047, 1846469577394958972, 14668357323201408029, 14939045883642543835, 2885718226990976376, 4969257074069595075, 10824274197210729467, 13212275138420405274, 10563919532671437398, 12234598862193668129, 14653607410806008848, 2498958194485300229, 3512215170452429648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 7416632953558849265, 17594999963544064287, 12743397052876062010, 16793498368204377302, 11520998711037823747, 7102906674716336449, 5413886510672963560, 1869688954383701255, 2779549538868222645, 2240230247124034957, 1133217540165824186, 15083342046854437444, 16448963681750067902, 1360814798563974092, 10806646336881251745, 7783394201341070849, 3435210620583322514, 6672417563265002316, 8185266593862172618, 11336008056438129603, 11885558902631228328, 2880459223621017435, 5581858847773628805, 5641110601962994164, 11691200044195449244, 18247981403702122132, 5440276046356043250, 17479206923733922587, 8202861560648587401, 6069495537705640, 6253001344519856608, 0, 140, 11345515238018223131, 2946171615755015016, 10503353101665672276, 15589073729373314001, 13718116689255862703, 4274061922998936105, 6661690865570834646, 2350105156607890338, 11848223112496568240, 575220748088635860, 14463381670682493434, 6239522938056088373, 5225807468457901577, 5430077683379130363, 2608178208619376380, 17198482303941924567, 3796686867992995838, 13906033972215271083, 16841535128816011006, 3862251867639640526, 2035529259540079632, 9756998763275612257, 1710277459229142915, 16231968704214022931, 11354865285620231158, 2004972393153402371, 12504370868862613699, 7450671729747196018, 11869180945716319347, 10995045216798627929, 87, 6657939908049969746, 18076794411180476280, 205142327694293412, 16544719539062425474, 2678151302770396230, 4629674588184701527, 4756922096433783348, 6601966437239502772, 11244080601096335225, 6649199742327408095, 1784797448120793789, 14231596045603977911, 4619347748135638900, 670946413872621524, 9168306336221214796, 2712598845436515249, 4708938355998137236, 12719783652674704119, 17571986815953822221, 10053747442208350154, 9541903258826307302, 16365489308483642755, 9446845463763503898, 12491857199480659906, 8850778807446174241, 10733909952514206486, 15234998934151879467, 9571493212894702614, 4393284534245665333, 7926227231583287531, 15430453444364458588, 0, 136, 10841411014448826746, 10924324070009278511, 4390811061445162297, 10665404042695900090, 11148796663006115025, 16584177158338467512, 15369021590994653978, 13860609558593370204, 3837193053542887320, 7652640894347806080, 683219561750944695, 4006536353767232614, 4047796662675347846, 1149920536684206111, 1698301089048909092, 6224704259817574157, 4439284651749775339, 16476516570230330168, 10834199646006576067, 16282481854654492091, 6659294847490221927, 12242894720083399562, 7156478509869523727, 9996508607909856718, 17045153176928915002, 4097937233975335255, 13892339685592049122, 3881709886225480466, 10446442293007407525, 1539493896147927159, 0, 32, 9302012295643728416, 424328237663665361, 17748121622218558811, 6681769685034042719, 10907932526941371789, 14996603190997478665, 13982878080104642188, 3336783822228111865, 7403528606603453519, 7309352233404946366, 11509327586943808925, 6803943428138467537, 12870260590513220077, 3798257798625653324, 15652192157997003684, 8260391000410661595, 9099897743400681933, 16067207775248165408, 7640841583197908852, 16739199083410292994, 1998275509994500625, 10688417071827877337, 16160081185811655577, 2725954513011781037, 3040692668058239811, 15097072321276989567, 7813293313258815644, 15261763399945716285, 2258772319189190202, 6756061023037720295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11356706632132474470, 2358849405739495388, 8252049255686697090, 1550389821256969487, 6750324157015485381, 604741251465830172, 17676294546444101345, 1421326959851451806, 16490161619089770695, 7767675836373196892, 2198451335895548750, 14472480345778371117, 4528209626244081470, 18204665069024529476, 11966881683411871471, 15889763672746314463, 4160946893194356300, 15047282824503396386, 16648027271626045172, 17326536692088196432, 13311336675659068295, 10920522191757572329, 6554220297842488502, 5028468445182081313, 10053567802826673403, 9039178885558385498, 8545236135635685226, 10069135081496908116, 4751010459333335795, 15084214110056267454, 1607381721595724854, 0, 35, 809326793687057962, 13043350793597586415, 3445826420292422918, 15832983954926147440, 13006453459232495210, 6690439008924914176, 14925506152061129229, 7686554446337042304, 1386567235067272296, 18336554683084823555, 13461715534861002386, 6450595223101539903, 16347954830762298502, 15583422763378897975, 5985288376766257087, 9084874200639035992, 17711582701900015634, 865108223448999540, 16640836306313302925, 2841702098020816448, 10239653893689953177, 16135446855619161594, 14211710812292436619, 4482236293883987028, 7541264006304433571, 12592463296509852982, 9966350562627740919, 10317133817946706776, 2674823044861603020, 8201489714833429310, 0, 13425232862973212709, 7318735608001207147, 2870457579998112786, 8435616415860238896, 196396598284240198, 15030346739460637318, 11783104108423427368, 6893308270453759366, 1186051241082879855, 5410658890137048512, 10911572374110245694, 3704568930318998699, 15085014690020902180, 10285804549311169869, 9214751878561195125, 10949533612894576728, 4512217941150685160, 3355391310977906543, 2378656381642692957, 1495035938694254211, 1628981830846711491, 1657549910326762005, 2033490153416681362, 15310508516972009936, 9202695474221693202, 2288182338723422425, 1229088437375601266, 2390601416181918661, 7303237900174645421, 2453521579710367516, 11406074192870264875, 0, 34, 8422262931452347509, 13885570107923725144, 235244799151795110, 17975760300270072840, 21645088928215528, 13378438338434245321, 11260622121353286786, 13136688320626048612, 17881560939567828117, 16601834208041636644, 2350599886583381643, 3676641047171560447, 2612703737764640459, 6165448709088710825, 9702561415374819789, 14396227383672448392, 2871975363154349452, 13084396173640101372, 15953404371899770169, 14377272925308367884, 5291380804534138171, 576711179775643850, 11287382459948400014, 9324129603955102500, 10503620158827014837, 6130889055094603538, 5442709211693844142, 2968563472347562608, 10528964699829495885, 358459342719025633, 0, 8, 7519454690376123692, 7627104070861575574, 17604686071836489236, 14277148259130460564, 8312218486680706135, 8395439642754559152, 17307771294890409643, 9298206908486537717, 3027629924013931359, 2933551330348935458, 1450485994192951386, 8585052201707081835, 10624425952582111111, 16773523322999621677, 13337622149287916761, 17874287708894504070, 14164897610403484003, 11216401648549709020, 911970190394256131, 3202853507803349037, 14616902435260689479, 14924823153427050614, 4881022900440414264, 9723366934152472594, 16335725686098559697, 8087897843744270993, 11437013713086863200, 7627258546495067733, 18044191572661655945, 16490279521751489469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2156162188207533858, 1652445317709542069, 9710174156710538584, 3687395741963426550, 18198216273587752711, 1838753262326158154, 17157485573110166020, 15957089851173678739, 18249894041959305436, 4865827667628828701, 13002397426121818840, 2056311725258650732, 10926587116602338049, 5861292583325103670, 7147743639536563769, 17793738412709433040, 7010314501210327907, 14741490826925726048, 11016711855241315519, 2381487671462803904, 2201441872551078055, 12296957712116650503, 10199495361398762521, 17597473646777692775, 8352767355705497400, 6369472266524549650, 3523683736119512174, 16946656379378628774, 5583968744804760129, 12827986113643603592, 11319208922614274152, 0, 35, 8353595870573531205, 2540346347559199959, 15905617593867500462, 15206447585345432360, 9587574406720228419, 13962042635878587483, 12647708209366536631, 5660351957917038651, 2686094179381860856, 6724344971643611017, 7730484900119681480, 17496531794766962548, 9582673736768413052, 5090730089788327507, 16316669523444224399, 15180713067843619854, 3366467649642622206, 3781233238795801028, 5780865724855930643, 4603482683901152330, 6284610136599748777, 5490240700537832368, 3009248399805477246, 6182266765615504635, 10157260196426992044, 11702418701530435943, 16215780421699068990, 12595602375369553246, 14007226435224111078, 13655239822733173662, 0, 595597012989057201, 17139781905758323226, 3995355680811906625, 8414041561969840147, 6056580584982795553, 2275917558381110739, 1213850852525589804, 12621557274381914353, 8183226668403108743, 3186362008740620984, 13198139370097152194, 2958463820434100861, 6175120933459995736, 605479756900086202, 9130478176053651155, 5046313161028350213, 6401077792884902899, 6554586936759661283, 17551059730726512380, 4149682069832499543, 18155642743356144121, 7818664772328532886, 10601663807010949823, 13981378283476746869, 8981534628391844134, 12415014162240143946, 12267765271876857143, 16738431774071597762, 639602489095149029, 13916262071165774844, 6409620289494267476, 0, 34, 9168769012195838974, 8757246072351383525, 15819587373362991575, 6330331124468459419, 17594449485955496857, 5094615699180819390, 10468588157075103568, 17500241837984025274, 12590769989805218521, 10257339134394161483, 6020533408585278677, 9887559600989616103, 17174772404727048357, 8260989830322406645, 15331894718426588199, 13817494132369433237, 7270842089806116389, 14464987003178196376, 12856235623981550070, 6446968933011398838, 4625298604721424009, 7537989708572581312, 8773062848621227780, 7997392847552644982, 12295542285792207282, 2236820296563710856, 6411496154095679628, 96618257160083950, 2708395562256972928, 13820925760592258770, 0, 8, 17781582622500481192, 12847902632736061277, 12021499907877242591, 16751519355106661703, 9062087890172095618, 3834953580385337540, 2969703856153678454, 11604562295556139307, 10447912046373566534, 12987934619706800857, 12352596220492768030, 14816150974992525275, 2172600571554701126, 18086375044546604023, 16313093185369681775, 14997664071320688070, 347950016295486690, 9206182676441692601, 3566552483989599402, 4925983231752336365, 1728701557101400581, 7087476601458867917, 9759961360999781392, 12569092891286895547, 14206292953735333262, 16422952955631166803, 6294107725304445883, 9537940691512987143, 15535806100011306333, 7080716573279759555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(13) }, program_info: ProgramInfo { program_hash: Word([6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 14, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 160, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 7, 0, 1, 0, 0, 0, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 1, 1, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 8214490973132607971, 4584625016228750380, 7448701979965755247, 12849137552501188796, 677561570464011141, 6253001344519856608, 1607381721595724854, 11319208922614274152, 0, 0, 1, 0, 0, 1, 1, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 12030454825456445148, 14743087584632180635, 804908825530740834, 15978537433270792071, 12876040067831025585, 10995045216798627929, 8201489714833429310, 13655239822733173662, 0, 0, 1, 0, 0, 1, 1, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 8523492539397344614, 13282343245327117747, 16657610054734022844, 10245076951199455280, 11605105809497505058, 15430453444364458588, 11406074192870264875, 6409620289494267476, 0, 0, 1, 0, 0, 1, 1, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 5256913258227871425, 17100537000217132265, 10362535235958450122, 6599190416745833044, 5450578834500306709, 1539493896147927159, 358459342719025633, 13820925760592258770, 0, 0, 1, 0, 0, 1, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16253482711025978099, 5751576643258238090, 7110029021941723513, 3208043314804619251, 18130890293586930078, 10452764368937945515, 9114363797835460134, 6104172690014223231, 1560947813056021755, 9302012295643728416, 7519454690376123692, 17781582622500481192, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16690839578921925157, 7830268710878889486, 10115409991715085575, 6920597847411412414, 18252951749527557342, 6969997263492352670, 5446076396314160376, 3119855977255645286, 6935064976442414148, 424328237663665361, 7627104070861575574, 12847902632736061277, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11755424915479552417, 4868320831660690795, 11428668827299215140, 17985619796195836408, 4460903658820341507, 15570786589164252178, 12863008906537145423, 2700229040680838768, 9999441144135002932, 17748121622218558811, 17604686071836489236, 12021499907877242591, 1, 0, 0, 0, 1, 0, 4447686994046778179, 11785000236654418865, 10679155400143926564, 17934377671577204140, 7042762868047858013, 4015039023438705588, 11907191178709112742, 859505755654562117, 16136993048454358354, 10008421878335836436, 4228220371303630837, 10354700837586583171, 6681769685034042719, 14277148259130460564, 16751519355106661703, 1, 0, 0, 0, 1, 0, 217106376514171653, 11707313943908545641, 15092932467239161061, 11049594146888643723, 7267371538363991280, 8421627027326523148, 9466912758182965715, 11174658189737631113, 12296464969648251345, 7266552182027361169, 15522155400452634037, 4735711626023545756, 13982878080104642188, 17307771294890409643, 2969703856153678454, 1, 0, 0, 0, 1, 0, 11044550050665632476, 8958367422149199561, 16497379967830959424, 9105126057127804171, 13427183447069512151, 15171283498151438808, 1953587265841775225, 9636744945302995714, 18126939303114916528, 8791105532651972211, 13664486701019622043, 2809204122464618686, 7309352233404946366, 2933551330348935458, 12987934619706800857, 1, 0, 0, 0, 1, 0, 1877907417051268915, 6151364593092129113, 13049072304454003157, 14569284676797348998, 6517696895688418945, 14662750186533371679, 16069841829669607101, 1490539036394497080, 9033882039108268313, 11281913023757770338, 6092037682822283700, 10868401885487323501, 12870260590513220077, 10624425952582111111, 2172600571554701126, 1, 0, 0, 0, 1, 0, 10197860193367132813, 18317591232122268101, 11864893253666570624, 2835737623710330612, 12960707821770488929, 11079168775731474830, 1560700914733041660, 7731471377060742735, 6301009824137139871, 10181825490691565485, 1893419523737526751, 4027411046406207040, 8260391000410661595, 17874287708894504070, 14997664071320688070, 1, 0, 0, 0, 1, 0, 7903888723576875237, 18382523577454102436, 13167437966520740716, 15482419984058848245, 7634329044629047826, 7042468264080735391, 6200990949184863170, 13733877647296302634, 10330363517752279308, 8463471033597650592, 9636585409664050258, 1846469577394958972, 7640841583197908852, 911970190394256131, 3566552483989599402, 1, 0, 0, 0, 1, 0, 2186301169863059887, 6122215293275160143, 16696916221087249943, 5297995970636059087, 6007758954686348362, 4655654314239637986, 1006207264024395366, 15572658687280648106, 7189713532379018536, 2112404415880305855, 2136665268102207704, 2885718226990976376, 10688417071827877337, 14924823153427050614, 7087476601458867917, 1, 0, 0, 0, 1, 0, 4350099661540135647, 0, 0, 770728251595531533, 434120282701603474, 899748567092010447, 14918729158665343812, 16808111015808513609, 7424874700566577356, 17448147405455891940, 4462464721020457233, 13212275138420405274, 3040692668058239811, 16335725686098559697, 14206292953735333262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1347942901513492691, 5581285869985960561, 15417366235984526759, 380737719356524599, 12243901590027926887, 7052270251739242825, 654959311657763753, 7098417589530391109, 12234598862193668129, 7813293313258815644, 11437013713086863200, 6294107725304445883, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12086966446141742548, 6581368197537384623, 3331301994171189600, 12870561906904032245, 6559275936659510680, 17586339544079318164, 15404879372302137522, 15343623253038912080, 14653607410806008848, 15261763399945716285, 7627258546495067733, 9537940691512987143, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10239457018222882008, 17661012293298952642, 15814677761660135474, 6984680585936259437, 17224785255700525855, 14071176523136369481, 458610335793450516, 7762335122892638892, 2498958194485300229, 2258772319189190202, 18044191572661655945, 15535806100011306333, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 1, 0, 0, 0, 1, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14059267169109730234, 15833028045737259664, 4457596741936238930, 8186419089203192999, 13502722698945446624, 16864340361327671903, 6567391571487826395, 13313027311321423572, 946461078672821334, 10841411014448826746, 8422262931452347509, 9168769012195838974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15746924929585133009, 379315838026506093, 12529581077675993243, 15318603549361168513, 10582364865337924932, 2636070061904000825, 5204289601743072522, 9192034959170904294, 16281780351388912901, 10924324070009278511, 13885570107923725144, 8757246072351383525, 1, 0, 0, 0, 1, 0, 0, 0, 0, 471985631500087772, 8581974592770288933, 303974201734355881, 7911471416782656233, 8264438684589566467, 1539270658943308645, 3431536436519013066, 14701500658652215925, 2935418863412242354, 4390811061445162297, 235244799151795110, 15819587373362991575, 1, 0, 0, 0, 1, 0, 12803581155021505789, 1617229089722186747, 11821086028219467787, 16946433723443173275, 17442451301272882541, 13345903392866909652, 14239435248344205979, 7775924941916048886, 8663103496298937284, 18098398151169262506, 3854356596578551734, 14713353090133347394, 10665404042695900090, 17975760300270072840, 6330331124468459419, 1, 0, 0, 0, 1, 0, 4117165326757319536, 1434871395181292700, 5147296384675574401, 18402496786565368100, 1541891846645406613, 6608322246477847509, 113263425049039362, 14624701183045087851, 5418421295167202847, 9902960937688969164, 8526809416150489728, 8319785044806982194, 15369021590994653978, 11260622121353286786, 10468588157075103568, 1, 0, 0, 0, 1, 0, 10779284519276237242, 5207917218557150537, 17102744930422995322, 7881354678273462636, 9096730616149686024, 8889792067304111866, 17358468187481791647, 12209401598010007429, 10326065236143981873, 259487815978835763, 2939637999200097803, 2244733962249620937, 7652640894347806080, 16601834208041636644, 10257339134394161483, 1, 0, 0, 0, 1, 0, 15007735984166481726, 2893692142669467166, 5586756186106745240, 7881520773741268125, 1119526938685078607, 8580323529307502020, 1868806426895026968, 11046353624103181594, 2355139499180822246, 13294225392413433281, 8555475415255527439, 5921002467687226204, 4047796662675347846, 2612703737764640459, 17174772404727048357, 1, 0, 0, 0, 1, 0, 11641703905547654953, 13518861492744284220, 13602438854947769427, 11440521690988525934, 1858131981777548381, 14683551372837095812, 8741184015917561905, 4381652925229768341, 3668923621194401622, 8742633689618768661, 17171454789201612359, 17386925554974145101, 6224704259817574157, 14396227383672448392, 13817494132369433237, 1, 0, 0, 0, 1, 0, 17007411413036910904, 6937272254859089520, 3345146633011014675, 16854936978988550164, 4472804247539583969, 11270159100715194202, 15367181090448289261, 1868429356172715569, 3430895131654614161, 1015593294205135440, 10191353484336583572, 8582026933349467190, 10834199646006576067, 15953404371899770169, 12856235623981550070, 1, 0, 0, 0, 1, 0, 6583655571084272508, 1064174383094762843, 14004531006300423026, 11420674364099598202, 8460103377465445883, 10804815118997327370, 7301079719327054003, 4877497612363750655, 14559648290526166949, 9120291006888379304, 2115641271859045975, 16434619985909351985, 12242894720083399562, 576711179775643850, 7537989708572581312, 1, 0, 0, 0, 1, 0, 9177904733833547672, 0, 0, 4263756598719013378, 16645964836945405904, 1535579717520953536, 9288443086735636960, 12124737918817624189, 3028234720115016827, 6680864214558642932, 12931918488324919856, 8451565207539691282, 17045153176928915002, 10503620158827014837, 12295542285792207282, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13465875315346524402, 16176623117443515258, 208588932528011586, 17461402434481489861, 7578220797847929864, 17564919688262005304, 9600963709893327666, 11244752067809188397, 7714774968702541161, 13892339685592049122, 5442709211693844142, 6411496154095679628, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17464705757459592393, 15081244610133230814, 11685358340804306780, 10152174670869705735, 9410406960468072857, 284282844772359316, 7733975108380115257, 2111913529644288504, 14978023560208702638, 3881709886225480466, 2968563472347562608, 96618257160083950, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14751425303934963720, 6410948793715747581, 2822178276157738566, 6117144343302310887, 4811333449307081983, 7938696543505248162, 3435995547523177385, 6112640616610282754, 18014742166879778909, 10446442293007407525, 10528964699829495885, 2708395562256972928, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 5256913258227871425, 17100537000217132265, 10362535235958450122, 6599190416745833044, 5450578834500306709, 1539493896147927159, 358459342719025633, 13820925760592258770, 1, 0, 0, 0, 1, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5140376474314663948, 3739327994472119619, 12197195286374413309, 8260931550665656557, 18424611315455665672, 8710514240711102938, 13745802786964652170, 6548375970637655697, 14697063750404833549, 11345515238018223131, 809326793687057962, 8353595870573531205, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5151077999657789073, 9855163346786806166, 10427073607190553707, 11893740670479805498, 8660762125905589832, 3087828367487460915, 10807941376803729065, 12966884757436832352, 5887611756450648665, 2946171615755015016, 13043350793597586415, 2540346347559199959, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16885380856972561696, 7272719153662087111, 533047373605454411, 1829926574142237762, 17127340306827455573, 8550318671602553781, 11967821891194701924, 8617173377985249829, 4390455106880745190, 10503353101665672276, 3445826420292422918, 15905617593867500462, 1, 0, 0, 0, 1, 0, 14015495768979275110, 14880246136006978483, 2370383909586342854, 4396313619195267116, 10277182995998348622, 10580779234737523528, 1594484475404924132, 2784948507084849054, 4930631020140393563, 2468953284439066013, 14369692677316723198, 12605921110673978057, 15589073729373314001, 15832983954926147440, 15206447585345432360, 1, 0, 0, 0, 1, 0, 11655043985748250296, 10699504707431232516, 9467299864033965285, 17818361021916066381, 5757159540459665691, 9765809951316535147, 9595530987647092729, 8347633294012310580, 2828555514110129215, 16235476345222743147, 16488861457711574881, 9581721436999738864, 6661690865570834646, 14925506152061129229, 12647708209366536631, 1, 0, 0, 0, 1, 0, 17354386000029748168, 1615091744629199786, 6126471050563264586, 16833029552007335772, 10562329593955594288, 9697859497182376308, 4563063455320265667, 16459952452199547026, 8327420331623942113, 7827742839669371295, 2458019052558535305, 15260860572373553109, 575220748088635860, 18336554683084823555, 6724344971643611017, 1, 0, 0, 0, 1, 0, 10761244172272014098, 18186939778341908967, 9856938012656986962, 9947044966489369966, 18303351465385086236, 6110992258367195164, 7735824317535531109, 8768898256362256567, 453077352291409865, 1609065912712094319, 247484960726213991, 9649122197052954943, 5225807468457901577, 16347954830762298502, 9582673736768413052, 1, 0, 0, 0, 1, 0, 15683239765212415917, 12949077672553569346, 6136438285021512441, 9818108804633787874, 9244678019206311862, 11530371422565574919, 12480600709687621128, 4574304056007112162, 8150970536507693114, 2648588484571064605, 11606973446973456199, 3689293233291605771, 17198482303941924567, 9084874200639035992, 15180713067843619854, 1, 0, 0, 0, 1, 0, 13352191639049950502, 1781612529695982717, 17940295799223377801, 4313511094695098159, 5878623689014611519, 4405616242805307371, 1262088577389795166, 17597264692962831013, 9734673703119078710, 17976467869316326526, 17692030742991723124, 8596529378407272747, 16841535128816011006, 16640836306313302925, 5780865724855930643, 1, 0, 0, 0, 1, 0, 14809719365593713010, 10532643948327499097, 11726590278216945558, 12934070243418782738, 12505885186641282427, 78901366432993105, 5046795949307964432, 8474944897236640626, 8294118794714299790, 4079016485765258670, 7568893198878892067, 9399437128660150397, 9756998763275612257, 16135446855619161594, 5490240700537832368, 1, 0, 0, 0, 1, 0, 1825940038334452510, 0, 0, 1303361134214255144, 17429829341045194126, 4285338701077916719, 2910522803612995552, 6045066589466757281, 3823107055299292863, 17630322765550216924, 4973217863350539721, 6949143047896273946, 11354865285620231158, 7541264006304433571, 10157260196426992044, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17525379757599431696, 8834060796313238365, 8610620161032996227, 9527459414368740643, 9178488780906183949, 6890858608219888881, 13578840114630190185, 18189457662137520245, 3979322074577621357, 12504370868862613699, 9966350562627740919, 16215780421699068990, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15824846667317041360, 856881534780831669, 1345962755312618543, 17392858720163980888, 572497659895507109, 10680339138669917038, 2119568863265536467, 17447468029829501860, 5317810489943751161, 7450671729747196018, 10317133817946706776, 12595602375369553246, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8992618192991263654, 8614320689815223473, 5938021660540313570, 500779098360895522, 14724337405152116499, 9892588909603237147, 8158174533637128652, 5366612376176920228, 13663234493876910991, 11869180945716319347, 2674823044861603020, 14007226435224111078, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 12030454825456445148, 14743087584632180635, 804908825530740834, 15978537433270792071, 12876040067831025585, 10995045216798627929, 8201489714833429310, 13655239822733173662, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8962397996249942813, 13564283360082851490, 15320836901220842229, 7059236745058640735, 14597771066871753553, 12891440258701617795, 7976296880270099068, 9869196225863171361, 16723391107514202352, 18076794411180476280, 7318735608001207147, 17139781905758323226, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6385487366266632060, 16294057552644672316, 9687580313089453282, 9552556216292266897, 5977340097238271765, 10322300200196682981, 279851189829800217, 6918765821995287137, 9754566926160679801, 205142327694293412, 2870457579998112786, 3995355680811906625, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15421658280337698465, 6097183689626534496, 4646487368895915296, 4246851900171193724, 7707653349895837404, 17715988767376665360, 1629791578136936575, 1369739146488483681, 12819365845000407643, 16544719539062425474, 8435616415860238896, 8414041561969840147, 1, 0, 0, 0, 1, 0, 4454659362488555244, 897257401795782847, 1442741355132240277, 10565312036761368185, 5142791099649335720, 14821642720711744364, 14051544049298817271, 750410385838623118, 12529577197437921705, 9250281207577685312, 1289422996858358477, 9991664912056245947, 2678151302770396230, 196396598284240198, 6056580584982795553, 1, 0, 0, 0, 1, 0, 17078534924241776339, 15440110056678900200, 18208650451735606208, 10756948069435380801, 15510754792097734964, 2375067891701857361, 2923239127151948080, 10704182720413467090, 2473371596923514175, 1150752289248225959, 15140294830527696728, 17937489760159731410, 6601966437239502772, 6893308270453759366, 12621557274381914353, 1, 0, 0, 0, 1, 0, 316614558845336509, 2878699202280611836, 4275560082084202144, 7825754886390455440, 7997738108478273878, 11956271016055823946, 8453074578285752653, 17538680525690853062, 3583695132258196536, 10246367578585743447, 1421290680685617214, 5286310130352931456, 1784797448120793789, 10911572374110245694, 13198139370097152194, 1, 0, 0, 0, 1, 0, 12678676945213092865, 15246741769098836296, 15584605922953436007, 13983789395651571583, 13294611871319191983, 5847635127357093482, 9897038047323897370, 4141923705337186001, 8176730118494162678, 6783090395235209659, 7174788237318142123, 9471733465477014135, 670946413872621524, 10285804549311169869, 605479756900086202, 1, 0, 0, 0, 1, 0, 16568523364350885487, 15819937544318835786, 1810889556141981899, 3363240447642516424, 2845656992888419272, 16007826574763812566, 10836844319802726945, 1759841724041652075, 10220987366360269577, 4288337514646499477, 15302356383007635999, 10084364066798723299, 4708938355998137236, 4512217941150685160, 6401077792884902899, 1, 0, 0, 0, 1, 0, 443828493241314088, 17479115015136738827, 16807605577473118694, 7828293012926775020, 4406743315212729130, 17819043892120276345, 10288960109250570842, 8627241529856509742, 12763806424191572386, 10924085850925815890, 11240603387110570141, 4596163035992380964, 10053747442208350154, 1495035938694254211, 4149682069832499543, 1, 0, 0, 0, 1, 0, 3238559664072884360, 9979572324819437588, 9676585927660439650, 12922287692448102380, 16122102826540224213, 1387322623565652732, 295310595529849583, 626496362396505138, 12692366118122891151, 9118931780992437842, 1835696655621331722, 17492638446874188318, 9446845463763503898, 2033490153416681362, 10601663807010949823, 1, 0, 0, 0, 1, 0, 12833432460597635146, 0, 0, 12362167187142713720, 7652433402428128865, 13848956826511295359, 5959646737238852401, 4051444777808751499, 17743718519616976296, 4470738656604083779, 9409022898528060781, 8739778943225234768, 10733909952514206486, 2288182338723422425, 12415014162240143946, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14911169987988052811, 9684204095164476815, 10202942699122698773, 9822906574365710103, 14333518987829918669, 2543793480285047170, 6422638912707970220, 17063170837522968299, 11891715600478694595, 9571493212894702614, 2390601416181918661, 16738431774071597762, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15100444854223162361, 17702995505216793489, 7439539809669146478, 17892016949428967969, 17843924827166978222, 17021793130360212806, 16012433424607683700, 3702512996340883595, 5580010029452924235, 4393284534245665333, 7303237900174645421, 639602489095149029, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7731918223558949955, 10675603116079282076, 13477200069544690909, 9033576496544593982, 10647867748676596435, 11915740833798992018, 6326608805282345628, 2628586313169132635, 1761218265234642115, 7926227231583287531, 2453521579710367516, 13916262071165774844, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 8523492539397344614, 13282343245327117747, 16657610054734022844, 10245076951199455280, 11605105809497505058, 15430453444364458588, 11406074192870264875, 6409620289494267476, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18248966067159614734, 13590585102940813084, 9590621322847534573, 4885112663983886856, 13157788436891508553, 11521696315622895181, 8426354436255247671, 2713831240363482992, 3447697248540225808, 17594999963544064287, 2358849405739495388, 1652445317709542069, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14997726253538871503, 13603816939964373123, 12932191302609726157, 12798756157498171562, 12242844110543519517, 1112809250875085271, 14696972132215546141, 17933860786448377030, 10044864192452182412, 12743397052876062010, 8252049255686697090, 9710174156710538584, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8817287785847965336, 3385249563011961849, 17918869724719667108, 8555258669059245167, 14956019708245712821, 12021362864117640865, 16692922442306646447, 12140276230850597158, 7058340312231756422, 16793498368204377302, 1550389821256969487, 3687395741963426550, 1, 0, 0, 0, 1, 0, 13889646877547174618, 5867013684002937049, 3874077199438956671, 7563891540952433248, 112536514236739072, 14326240507681405072, 12593636579411959551, 10570950564294000321, 18151871077622688335, 8874979589420119367, 1606372307127613897, 11424300291678555912, 11520998711037823747, 6750324157015485381, 18198216273587752711, 1, 0, 0, 0, 1, 0, 16236403493045129867, 8532135944457515917, 17647636734684350457, 13463537305496517162, 15195193333392427571, 12352345465945418691, 10174923844635011062, 7668476027270202579, 10359334248806725290, 10085921208436197132, 16448487398099419345, 14911345319478414189, 1869688954383701255, 1421326959851451806, 15957089851173678739, 1, 0, 0, 0, 1, 0, 13764650897714891563, 17810684478882660202, 14031148050915831965, 3808288102601471056, 14347073347558249169, 10584893895333648109, 1428273348489524024, 2062361183656478066, 10866279963718241802, 2718833903563323199, 7493603045769629260, 2533220603754125879, 1133217540165824186, 2198451335895548750, 13002397426121818840, 1, 0, 0, 0, 1, 0, 17725409119032852267, 11323941782055916015, 16251673015114650089, 4938442710501308657, 5613057382731574150, 10105110162171772438, 8183805712769991021, 15900656105857229467, 4713833248608103744, 5975284652827254996, 17140128915513269672, 10662827764253743390, 1360814798563974092, 18204665069024529476, 5861292583325103670, 1, 0, 0, 0, 1, 0, 14914053581161264238, 2620801595702286526, 11717666498402108632, 12002553001135911279, 5693866887050036020, 11964900944541509452, 8293446604021081650, 12256719005104851107, 3995119331147317584, 17181552195820469706, 8512417397041248917, 15742094452256624479, 3435210620583322514, 4160946893194356300, 7010314501210327907, 1, 0, 0, 0, 1, 0, 3562234265760858029, 4769670971948134199, 13385330306078539868, 10789879208843041511, 4107508461331672257, 4621662715196065678, 3079504282059755968, 260627379830442974, 894389675194381154, 179996691661177615, 12193512270869861572, 7196421200244503747, 11336008056438129603, 17326536692088196432, 2381487671462803904, 1, 0, 0, 0, 1, 0, 5906557576131351225, 13293454763685280754, 9930431347496206092, 7069639777384924144, 364669749717258, 6809248840077290249, 17801775841166869486, 13819086418675951632, 14554524254203776994, 8885320358009245035, 3851130964131028937, 9451078778045131871, 5581858847773628805, 6554220297842488502, 10199495361398762521, 1, 0, 0, 0, 1, 0, 2656770040929279434, 0, 0, 15539063566397429438, 17691418632824774891, 1922074210551113159, 3106011472540779982, 15257531885396120213, 12320900210322448034, 11637817792474845578, 3363935513258073239, 7181119043238227738, 18247981403702122132, 9039178885558385498, 6369472266524549650, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10333172214933120836, 15557683662491153084, 1598739907793205518, 6265664197169483681, 7206583663178666402, 6198597980723382916, 10395653141429564317, 15929576060773374367, 7951988307407900542, 17479206923733922587, 10069135081496908116, 16946656379378628774, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3750356548306982137, 12209140182523723096, 14526700523373973306, 9801143914278062154, 18199569338713260127, 7473328648066901490, 12120812098909026742, 9238706649514600628, 13025686387588160039, 8202861560648587401, 4751010459333335795, 5583968744804760129, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12302499613655276109, 17383410983291524378, 16517594411296145407, 2114471287922017076, 11998802949255523211, 1026110231435118088, 14623333492544617469, 6772806779673451094, 10950281275289859162, 6069495537705640, 15084214110056267454, 12827986113643603592, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 8214490973132607971, 4584625016228750380, 7448701979965755247, 12849137552501188796, 677561570464011141, 6253001344519856608, 1607381721595724854, 11319208922614274152, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(13) }, program_info: ProgramInfo { program_hash: Word([6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 14, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 96, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_02.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_02.snap index 7bb8930453..6bddb9766b 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_02.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_02.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 1, 65, 97, 97, 65, 129, 129, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11959214793721861949, 35, 0, 11959214793721861949, 5598651459581075585, 34, 0, 5598651459581075585, 8, 0, 3358534066525179769, 4141253528664299662, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273, 6116677274871151273], [11044849754686238278, 0, 1, 11044849754686238278, 7804753453550466256, 0, 65, 7804753453550466256, 0, 65, 9365253138981608257, 4690506171811599662, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113, 10392133002436897113], [5121401795821831283, 0, 0, 5121401795821831283, 17777748786253636403, 0, 0, 17777748786253636403, 0, 0, 4243893038989355703, 7471531250255239926, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602, 10134148635057625602], [3548930057165921670, 0, 0, 3548930057165921670, 9435312778805252724, 0, 0, 9435312778805252724, 0, 0, 2372900269115514267, 16928201695930024468, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552, 12864813595450034552], [4141253528664299662, 0, 0, 0, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4690506171811599662, 0, 0, 0, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7471531250255239926, 0, 0, 0, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16928201695930024468, 0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 2, 2, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2, 2, 2, 3, 3, 3, 3, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], [3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11959214793721861949, 11724006094392302789, 18248966067159614734, 14997726253538871503, 8817287785847965336, 7563891540952433248, 4929456476937587212, 11106581516038722988, 13463537305496517162, 10651632781918411385, 9981866502219755654, 3808288102601471056, 4944845091089272806, 14634692017250583903, 4938442710501308657, 15019076788922615346, 12046519037910030840, 12002553001135911279, 6648246339606676671, 13611030331766854764, 10789879208843041511, 6935978728922643823, 7357466921077553394, 7069639777384924144, 10796630853015597058, 9600475765342551835, 15539063566397429438, 694626006296126791, 10333172214933120836, 3750356548306982137, 12302499613655276109, 6116677274871151273, 35, 350, 5140376474314663948, 5151077999657789073, 16885380856972561696, 4396313619195267116, 5306671686393489364, 7956822041329119795, 17818361021916066381, 14033097286562039884, 7821625366477940937, 16833029552007335772, 8428385927199104618, 1983549081678798610, 9947044966489369966, 13964889898869345750, 11121186483480785338, 9818108804633787874, 4883454229697807874, 7144378034515727713, 4313511094695098159, 3382507463453404844, 1457665291681272839, 12934070243418782738, 1587788786427634902, 8220166220981689928, 1303361134214255144, 15371623169605597371, 17525379757599431696, 15824846667317041360, 8992618192991263654, 11959214793721861949, 5598651459581075585, 644336023812026242, 8962397996249942813, 6385487366266632060, 15421658280337698465, 10565312036761368185, 12143712587225756222, 17266990262046250797, 10756948069435380801, 13737908976648726909, 17026264676264380541, 7825754886390455440, 16047304773895114845, 2736732063999892145, 13983789395651571583, 13470168189302134725, 1436972360246592622, 3363240447642516424, 11460348809250776143, 6982982338498759911, 7828293012926775020, 16631334376547321750, 3136253412904926398, 12922287692448102380, 9001750416037636327, 9873548594897521512, 12362167187142713720, 12998286769972940151, 14911169987988052811, 15100444854223162361, 7731918223558949955, 4141253528664299662, 34, 340, 14059267169109730234, 15746924929585133009, 471985631500087772, 16946433723443173275, 4595135147820207091, 2053997855496151567, 18402496786565368100, 387609426153233273, 8469665991798416914, 7881354678273462636, 11816560343993810599, 9054561158700241520, 7881520773741268125, 1631726701000003728, 9048332065221759951, 11440521690988525934, 11399562976973524004, 5295775600298609171, 16854936978988550164, 4555566089436281371, 8045874719633055695, 11420674364099598202, 11942861833844189240, 15820096964950298640, 4263756598719013378, 7647209523022736387, 13465875315346524402, 17464705757459592393, 14751425303934963720, 5598651459581075585, 8, 80, 16253482711025978099, 16690839578921925157, 11755424915479552417, 17934377671577204140, 15509754874715907467, 6426721221030580337, 11049594146888643723, 14912334368661229147, 17657273147290084056, 9105126057127804171, 13430225876739607206, 3614830725909060912, 14569284676797348998, 4705513459362295944, 424917224365117418, 2835737623710330612, 1964100172858915134, 14896843043547784767, 15482419984058848245, 18437547705335910066, 3162257106529980441, 5297995970636059087, 9661978795293871188, 10128143329575104151, 770728251595531533, 9782965673735423214, 1347942901513492691, 12086966446141742548, 10239457018222882008, 3358534066525179769, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11044849754686238278, 1065714023649388913, 13590585102940813084, 13603816939964373123, 3385249563011961849, 112536514236739072, 1106452645962150895, 10661905560677698362, 15195193333392427571, 1271054956149481152, 2058632847676165296, 14347073347558249169, 9693072255291891063, 14859780105168189871, 5613057382731574150, 5623448817324608138, 7997999549850776178, 5693866887050036020, 14258871931331407358, 2547009721703928454, 4107508461331672257, 5068231609320466245, 14744046358319534345, 364669749717258, 12759453666142542994, 15815678790725651452, 17691418632824774891, 5288331248614959742, 15557683662491153084, 12209140182523723096, 17383410983291524378, 10392133002436897113, 0, 280, 3739327994472119619, 9855163346786806166, 7272719153662087111, 10277182995998348622, 1557779935350354179, 12598977243905958375, 5757159540459665691, 3544925687412308625, 4454290108164189834, 10562329593955594288, 13328511337210905323, 12548482778894690532, 18303351465385086236, 10622473817836825208, 10391858004672883604, 9244678019206311862, 4905634085052053166, 12384227405658404185, 5878623689014611519, 5361442612107937799, 5203395718336603194, 12505885186641282427, 1657982123928418916, 14802316224598370353, 17429829341045194126, 12187663825740955518, 8834060796313238365, 856881534780831669, 8614320689815223473, 11044849754686238278, 7804753453550466256, 10860407685663036622, 13564283360082851490, 16294057552644672316, 6097183689626534496, 5142791099649335720, 16773516463636660187, 10484693517503369961, 15510754792097734964, 5061563839137660876, 2683909803925041834, 7997738108478273878, 5467755257223357975, 14923583333953915684, 13294611871319191983, 10569196959361608760, 13906642922547692513, 2845656992888419272, 13828314707091500290, 2951356764607352638, 4406743315212729130, 16360792604504139514, 4146070061564888443, 16122102826540224213, 623220105874852865, 3573414414778802861, 7652433402428128865, 1221918952773084874, 9684204095164476815, 17702995505216793489, 10675603116079282076, 4690506171811599662, 0, 272, 15833028045737259664, 379315838026506093, 8581974592770288933, 17442451301272882541, 16579750051606898066, 5674487159031204202, 1541891846645406613, 8209041782659254452, 11966225502153548517, 9096730616149686024, 15618906860941665577, 14146738543483816160, 1119526938685078607, 8710432271010401746, 13282504786121257878, 1858131981777548381, 12223656597910297554, 11826686549344788050, 4472804247539583969, 7599118004690938513, 8277718642341650597, 8460103377465445883, 4568736565087160671, 4933680726900799861, 16645964836945405904, 3680609073412509534, 16176623117443515258, 15081244610133230814, 6410948793715747581, 7804753453550466256, 0, 64, 5751576643258238090, 7830268710878889486, 4868320831660690795, 7042762868047858013, 1028615964620729689, 12270587957620579653, 7267371538363991280, 16125626865182516658, 16950134439933558852, 13427183447069512151, 16117382505273595827, 2222792985740553749, 6517696895688418945, 15516128650333221731, 6357034143715229949, 12960707821770488929, 12451444460344609421, 8786747128188560390, 7634329044629047826, 7741107824034642016, 10975559322169081956, 6007758954686348362, 13971256108093330407, 16868860295450858142, 434120282701603474, 11571634562637977474, 5581285869985960561, 6581368197537384623, 17661012293298952642, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5121401795821831283, 14666269722110737492, 9590621322847534573, 12932191302609726157, 17918869724719667108, 14326240507681405072, 13067917358519389481, 6815648073963386989, 12352345465945418691, 11261296525909619502, 7689378518287963220, 10584893895333648109, 1804101714182174693, 14360593671180620787, 10105110162171772438, 12398505852787426318, 9692172226490565230, 11964900944541509452, 13385745375779151291, 2217858628481308506, 4621662715196065678, 16647480880251479677, 2589374608845270941, 6809248840077290249, 5129749784462500037, 3245840590205743440, 1922074210551113159, 14644738552419224397, 1598739907793205518, 14526700523373973306, 16517594411296145407, 10134148635057625602, 0, 70, 12197195286374413309, 10427073607190553707, 533047373605454411, 10580779234737523528, 15741781055361060589, 7164202101070087014, 9765809951316535147, 1782081390036413323, 8331595035611127917, 9697859497182376308, 7215394876392616273, 6137901882901182614, 6110992258367195164, 9375455911463634413, 2858682112359859723, 11530371422565574919, 14558386734229473932, 5193748514123930238, 4405616242805307371, 7842663293116063328, 13893940361375217996, 78901366432993105, 3701164965690212066, 3898705475678625899, 4285338701077916719, 1106459456301114152, 8610620161032996227, 1345962755312618543, 5938021660540313570, 5121401795821831283, 17777748786253636403, 12906637371964794674, 15320836901220842229, 9687580313089453282, 4646487368895915296, 14821642720711744364, 8047695355547001029, 10749686584146612549, 2375067891701857361, 12672901980323560015, 13290437551032339902, 11956271016055823946, 12186036345271050649, 10541464479696610661, 5847635127357093482, 2710785219086425297, 13630517663920473907, 16007826574763812566, 8148616449491580734, 458107884374711321, 17819043892120276345, 12445943926803700033, 9955553630570974315, 1387322623565652732, 4082304616394368279, 14346319199041833303, 13848956826511295359, 18438638174686917351, 10202942699122698773, 7439539809669146478, 13477200069544690909, 7471531250255239926, 0, 68, 4457596741936238930, 12529581077675993243, 303974201734355881, 13345903392866909652, 9586267930884889862, 5178817950472007665, 6608322246477847509, 4070515537963445793, 9312477480709452614, 8889792067304111866, 11078425489498232713, 636055309231688517, 8580323529307502020, 12246954824275240956, 13948398243979685168, 14683551372837095812, 4744943918536266830, 10091391594533925883, 11270159100715194202, 16104697287955959682, 2983615207234436698, 10804815118997327370, 139420663301414639, 11145521977996788455, 1535579717520953536, 14470422183799365804, 208588932528011586, 11685358340804306780, 2822178276157738566, 17777748786253636403, 0, 16, 7110029021941723513, 10115409991715085575, 11428668827299215140, 4015039023438705588, 3732466887400149035, 5870841944205588609, 8421627027326523148, 8231214549142439222, 10318470559229280016, 15171283498151438808, 12477430934852872037, 3853779543897991795, 14662750186533371679, 7423988381383082226, 13549468426633458145, 11079168775731474830, 12471207782095033761, 17595325414333663547, 7042468264080735391, 17650115337646869205, 14946074228061446423, 4655654314239637986, 11187552516160183253, 18115881480442018545, 899748567092010447, 14020868337400209874, 15417366235984526759, 3331301994171189600, 15814677761660135474, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3548930057165921670, 11599182054654736187, 4885112663983886856, 12798756157498171562, 8555258669059245167, 12593636579411959551, 1751015532861688472, 13019009039270359101, 10174923844635011062, 15012513810591484516, 16650490536433444505, 1428273348489524024, 5693483119278040520, 12915240062722269861, 8183805712769991021, 1654142869540548129, 8049024691721442269, 8293446604021081650, 3020690079986249537, 9829005565890494186, 3079504282059755968, 4458043056162108579, 751694847316855704, 17801775841166869486, 9610894500726595609, 11754871869039418305, 3106011472540779982, 5534818333558495963, 6265664197169483681, 9801143914278062154, 2114471287922017076, 12864813595450034552, 0, 70, 8260931550665656557, 11893740670479805498, 1829926574142237762, 1594484475404924132, 6975828079371970675, 6084696993723509491, 9595530987647092729, 15971750173693346214, 11203921366229716627, 4563063455320265667, 11788904100176198733, 5330429808657306820, 7735824317535531109, 320993418766884621, 17183008147454152591, 12480600709687621128, 10013781853527055299, 10535753745093412026, 1262088577389795166, 11216661268945885709, 139199134922249731, 5046795949307964432, 17871092368823791710, 11987849509093694665, 2910522803612995552, 8688806902442064031, 9527459414368740643, 17392858720163980888, 500779098360895522, 3548930057165921670, 9435312778805252724, 12594665258064570664, 7059236745058640735, 9552556216292266897, 4246851900171193724, 14051544049298817271, 11784642469202829877, 7043511220559324099, 2923239127151948080, 3593801949375944745, 12822730519972797871, 8453074578285752653, 9394265395193498181, 2676701676156012803, 9897038047323897370, 13273146919350422539, 8734416771856167315, 10836844319802726945, 164526851958521730, 17195525663426568111, 10288960109250570842, 10886225029528628150, 17237759664671057052, 295310595529849583, 1818311521513634717, 289062595793298208, 5959646737238852401, 13643407453100925757, 9822906574365710103, 17892016949428967969, 9033576496544593982, 16928201695930024468, 0, 68, 8186419089203192999, 15318603549361168513, 7911471416782656233, 14239435248344205979, 2133634484310994464, 8097913535946941412, 113263425049039362, 248987352426060274, 10939256691674299939, 17358468187481791647, 12423884741952977957, 56617284060232395, 1868806426895026968, 222259776750343599, 15059516987340721081, 8741184015917561905, 2066403566980848459, 3696239822839219697, 15367181090448289261, 8349149003644261348, 10280553347796952088, 7301079719327054003, 6885778115777578237, 12504375544103392076, 9288443086735636960, 4503182154932177101, 17461402434481489861, 10152174670869705735, 6117144343302310887, 9435312778805252724, 0, 16, 3208043314804619251, 6920597847411412414, 17985619796195836408, 11907191178709112742, 16377455862733420451, 15572876043608056600, 9466912758182965715, 17480763791598773801, 15029113851915312964, 1953587265841775225, 7175742902791404624, 6820764940134875350, 16069841829669607101, 15548451706938320654, 11760680638795846495, 1560700914733041660, 762367990279432470, 2603436428456411224, 6200990949184863170, 11673627333152839295, 7804486006334068097, 1006207264024395366, 11193609705356653459, 5704515878100803393, 14918729158665343812, 10658508130485449873, 380737719356524599, 12870561906904032245, 6984680585936259437, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4141253528664299662, 7535227198536906721, 13157788436891508553, 12242844110543519517, 14956019708245712821, 10570950564294000321, 17480412968160901529, 4150746739043008211, 7668476027270202579, 16656590512852921222, 6540695355644326389, 2062361183656478066, 6992883056491326847, 11699589910980507023, 15900656105857229467, 6696171278998449226, 13168835889056955304, 12256719005104851107, 3837048139847179361, 3160764979077625659, 260627379830442974, 11253217769249016375, 12385338833843346575, 13819086418675951632, 685348230246056503, 8109480959271599370, 15257531885396120213, 3680188101282186784, 7206583663178666402, 18199569338713260127, 11998802949255523211, 8214490973132607971, 0, 175, 18424611315455665672, 8660762125905589832, 17127340306827455573, 2784948507084849054, 3893738632331286853, 3285198522433859694, 8347633294012310580, 1716176048133035367, 17973624234065242957, 16459952452199547026, 16037889673287918578, 10274502539576810724, 8768898256362256567, 9056849240288317429, 5470591020023050699, 4574304056007112162, 8410472682472513857, 16137982984163538210, 17597264692962831013, 15736663856375030006, 17727370521374436910, 8474944897236640626, 637885636686826709, 14676123610051724022, 6045066589466757281, 14903105088638349433, 9178488780906183949, 572497659895507109, 14724337405152116499, 12030454825456445148, 3358534066525179769, 2539641719046213740, 14597771066871753553, 5977340097238271765, 7707653349895837404, 750410385838623118, 17202523259145509542, 9826125054086633997, 10704182720413467090, 14182542421389276936, 1208823412034618259, 17538680525690853062, 16486686521840942874, 14299802542131844724, 4141923705337186001, 15072716099695791702, 13709137995402237101, 1759841724041652075, 8081765454289246423, 8476759162841806182, 8627241529856509742, 4347076460454100596, 1495131601817209461, 626496362396505138, 12905076793136293016, 7898562997016536225, 4051444777808751499, 10985547818594749595, 14333518987829918669, 17843924827166978222, 10647867748676596435, 8523492539397344614, 0, 170, 13502722698945446624, 10582364865337924932, 8264438684589566467, 7775924941916048886, 7506941477585260226, 13559643900430805558, 14624701183045087851, 16810498729905278091, 3617722030424605287, 12209401598010007429, 14622001497128700788, 7124074456411373593, 11046353624103181594, 16506916834573600874, 2763493011778369288, 4381652925229768341, 9935322272824673857, 864619558035150967, 1868429356172715569, 6908757966622831414, 14123318794287563052, 4877497612363750655, 2105400693641679480, 8941132592749341698, 12124737918817624189, 15847492668873519030, 7578220797847929864, 9410406960468072857, 4811333449307081983, 5256913258227871425, 0, 40, 18130890293586930078, 18252951749527557342, 4460903658820341507, 859505755654562117, 5961685480015386121, 12134776249586726543, 11174658189737631113, 18385152961050631924, 9881471501704199804, 9636744945302995714, 12323181865658998064, 14903454669611502952, 1490539036394497080, 11688514875590095153, 16093513520259190726, 7731471377060742735, 5247500963110975116, 5269361527156951110, 13733877647296302634, 11865469401112846356, 7643242142337524006, 15572658687280648106, 9345628789826937825, 3291248301730279223, 16808111015808513609, 16274730253017522022, 12243901590027926887, 6559275936659510680, 17224785255700525855, 1390310476158884261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4690506171811599662, 2737440767612572473, 11521696315622895181, 1112809250875085271, 12021362864117640865, 18151871077622688335, 9897941768997576086, 4026157395886157229, 10359334248806725290, 4146117248162417047, 17246235733851217304, 10866279963718241802, 11383920474028743559, 6348426772268882755, 4713833248608103744, 10090565134847963788, 10865777585291872469, 3995119331147317584, 1039809878544438546, 9281899713308431529, 894389675194381154, 14912731377283108791, 2518971765323930332, 14554524254203776994, 14524699810240327783, 2026981110418907406, 12320900210322448034, 6520538036510347086, 6198597980723382916, 7473328648066901490, 1026110231435118088, 4584625016228750380, 0, 140, 8710514240711102938, 3087828367487460915, 8550318671602553781, 4930631020140393563, 1021301660011942544, 3073595205709678428, 2828555514110129215, 4454529496924239314, 4850807088481902893, 8327420331623942113, 5731477673914408028, 9865807300278005609, 453077352291409865, 12820055819705071946, 17847152132518767621, 8150970536507693114, 4592469706020729085, 8591936306357206220, 9734673703119078710, 11269239869586993393, 13212629127542823790, 8294118794714299790, 18005585695632222469, 5850018245424229562, 3823107055299292863, 11302847087529014346, 6890858608219888881, 10680339138669917038, 9892588909603237147, 14743087584632180635, 9365253138981608257, 9113412038486870528, 12891440258701617795, 10322300200196682981, 17715988767376665360, 12529577197437921705, 6552591582707442459, 4758921283651545108, 2473371596923514175, 4508995650639757747, 8913958469585669066, 3583695132258196536, 12251718655020006238, 17851199719794441593, 8176730118494162678, 9396959786745583185, 3556146813643685764, 10220987366360269577, 875353240064010198, 3230914141298165225, 12763806424191572386, 13303243524843396217, 6289147021348404787, 12692366118122891151, 8285789034090944076, 14023237997722359599, 17743718519616976296, 14731468822320978999, 2543793480285047170, 17021793130360212806, 11915740833798992018, 13282343245327117747, 0, 136, 16864340361327671903, 2636070061904000825, 1539270658943308645, 8663103496298937284, 797155414931197277, 7929222985705309752, 5418421295167202847, 16520350781038259800, 11697635461652845634, 10326065236143981873, 4672452207442160023, 9236109584144478544, 2355139499180822246, 7782053902926446231, 2620978815438101291, 3668923621194401622, 246363526423127035, 10353083146864436335, 3430895131654614161, 12564495361718767183, 4982750975383300564, 14559648290526166949, 6242143746593499460, 11140632426269699329, 3028234720115016827, 6653412960111738263, 17564919688262005304, 284282844772359316, 7938696543505248162, 17100537000217132265, 0, 32, 10452764368937945515, 6969997263492352670, 15570786589164252178, 16136993048454358354, 16378352067056606124, 11747573379431147483, 12296464969648251345, 8155132212936940581, 2470200969414032680, 18126939303114916528, 16736276280592238734, 15549342782445497049, 9033882039108268313, 5121596298161079296, 14336897502470956191, 6301009824137139871, 16614860627935231068, 10383378433371415142, 10330363517752279308, 10937466001850040595, 16305844076412050396, 7189713532379018536, 7568236447715590536, 10805187342082326609, 7424874700566577356, 13861219118264849665, 7052270251739242825, 17586339544079318164, 14071176523136369481, 12282546735285148319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7471531250255239926, 957106104872100553, 8426354436255247671, 14696972132215546141, 16692922442306646447, 8874979589420119367, 875297058086066175, 17626443192502070146, 10085921208436197132, 7288928467232887868, 17085775336106720298, 2718833903563323199, 7078253443595954934, 13309456694532316914, 5975284652827254996, 4866716465241707365, 9487238857935659569, 17181552195820469706, 8127338887120154462, 11933049108483241248, 179996691661177615, 3374573212837962242, 4025363669025839136, 8885320358009245035, 7362303317308040642, 10721260413929615658, 11637817792474845578, 13461475369693849006, 10395653141429564317, 12120812098909026742, 14623333492544617469, 7448701979965755247, 0, 35, 13745802786964652170, 10807941376803729065, 11967821891194701924, 2468953284439066013, 14003176497724809129, 4195286142867428231, 16235476345222743147, 16311400958482462738, 1275416753317277649, 7827742839669371295, 15144275993610658984, 17059326124115937407, 1609065912712094319, 1953375973007785317, 4662315141802736133, 2648588484571064605, 10314135606564051297, 17798108062832293769, 17976467869316326526, 10521545375054979384, 5478438738361095924, 4079016485765258670, 6409557376003924138, 9751499496869829327, 17630322765550216924, 17889552338200421323, 13578840114630190185, 2119568863265536467, 8158174533637128652, 804908825530740834, 4243893038989355703, 8922317147540258088, 7976296880270099068, 279851189829800217, 1629791578136936575, 9250281207577685312, 16325213226883592903, 14233424972710589898, 1150752289248225959, 13420723953151700222, 13103867886586495168, 10246367578585743447, 9749713722270402553, 17275110341684860619, 6783090395235209659, 17969645096023124419, 4121935965911645088, 4288337514646499477, 7084144568226748800, 6029442255508906403, 10924085850925815890, 8369007777733896382, 8232780781393445755, 9118931780992437842, 3679317166559661163, 5036788400317364302, 4470738656604083779, 8115411932938273702, 6422638912707970220, 16012433424607683700, 6326608805282345628, 16657610054734022844, 0, 34, 6567391571487826395, 5204289601743072522, 3431536436519013066, 18098398151169262506, 7669185665212226764, 5455708142000104069, 9902960937688969164, 16439153306838678161, 9116909952501731628, 259487815978835763, 11207509487307725092, 13598970521047669184, 13294225392413433281, 17974846784869714720, 1531979193630020279, 8742633689618768661, 12951219828222672250, 1272063647175062154, 1015593294205135440, 1601391529726059156, 6891640398393941397, 9120291006888379304, 10474372360890458437, 5584077426972546342, 6680864214558642932, 2419346771478639592, 9600963709893327666, 7733975108380115257, 3435995547523177385, 10362535235958450122, 0, 8, 9114363797835460134, 5446076396314160376, 12863008906537145423, 10008421878335836436, 9952321233871043669, 12872379155893703237, 7266552182027361169, 1266036355585216796, 2621902104176569009, 8791105532651972211, 6351975813451610601, 11821139808280113179, 11281913023757770338, 3277134497757048289, 13219080767636598429, 10181825490691565485, 2766637533497216499, 5527857141123489970, 8463471033597650592, 16863468430858262436, 4521466714741486225, 2112404415880305855, 6776665887355979100, 4283028800297139078, 17448147405455891940, 2672696094870261596, 654959311657763753, 15404879372302137522, 458610335793450516, 11708893791522292939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16928201695930024468, 13316048579382449360, 2713831240363482992, 17933860786448377030, 12140276230850597158, 1606372307127613897, 3188770991194636906, 14438001176756564964, 16448487398099419345, 9918214746375746352, 18110219924373985313, 7493603045769629260, 745957266720787386, 208949971747081929, 17140128915513269672, 10592811345979549626, 17407028959895176066, 8512417397041248917, 7287596669447050848, 9095813259348077504, 12193512270869861572, 13556169973586801756, 14690878971952130243, 3851130964131028937, 5140683189548028765, 4356298339163646871, 3363935513258073239, 6101475308358905031, 15929576060773374367, 9238706649514600628, 6772806779673451094, 12849137552501188796, 0, 35, 6548375970637655697, 12966884757436832352, 8617173377985249829, 14369692677316723198, 7988737883003214917, 199454479220437296, 16488861457711574881, 7336046662918934307, 15030081564191678849, 2458019052558535305, 3971043898284956979, 169011925839529283, 247484960726213991, 11098826393785027594, 6337173918784738400, 11606973446973456199, 1842388487495083111, 3843434841734991971, 17692030742991723124, 11518912608009699621, 12820002738657995668, 7568893198878892067, 7859209399338136233, 14455157706277846466, 4973217863350539721, 16132832657712782617, 18189457662137520245, 17447468029829501860, 5366612376176920228, 15978537433270792071, 2372900269115514267, 7638869850317184912, 9869196225863171361, 6918765821995287137, 1369739146488483681, 1289422996858358477, 3642389184556912711, 3891108637149977246, 15140294830527696728, 5009228872137272209, 7715172072574760928, 1421290680685617214, 14403164863632503479, 10265245098090210711, 7174788237318142123, 6381427654975252574, 7602994898079563251, 15302356383007635999, 15586805931977175637, 18437766594761332377, 11240603387110570141, 15093603048951386807, 7035853470370737247, 1835696655621331722, 8169021299801629244, 14781376510855187932, 9409022898528060781, 10695296899698374978, 17063170837522968299, 3702512996340883595, 2628586313169132635, 10245076951199455280, 0, 34, 13313027311321423572, 9192034959170904294, 14701500658652215925, 3854356596578551734, 5718692378574184090, 17501390179378757090, 8526809416150489728, 6507550884061463423, 7814960517829781662, 2939637999200097803, 780950602796552578, 4118107554308446430, 8555475415255527439, 14714307830357033751, 15614510648083677054, 17171454789201612359, 15897739400545916002, 5578273266312075011, 10191353484336583572, 2940473809902205523, 14962502826274181007, 2115641271859045975, 7064236544478437245, 10824702985925635247, 12931918488324919856, 8429882718924461151, 11244752067809188397, 2111913529644288504, 6112640616610282754, 6599190416745833044, 0, 8, 6104172690014223231, 3119855977255645286, 2700229040680838768, 4228220371303630837, 12976691418076017877, 15391527008624099592, 15522155400452634037, 17655908650961725957, 5157987610310047621, 13664486701019622043, 12908699189677656287, 14840926611057477527, 6092037682822283700, 15181448373122947619, 2083722204849270202, 1893419523737526751, 11329911669537538562, 12331432886354737271, 9636585409664050258, 5131588463040403759, 10248116973079783912, 2136665268102207704, 17448444978654544666, 11945433761064128885, 4462464721020457233, 17579935132869425842, 7098417589530391109, 15343623253038912080, 7762335122892638892, 10310226363807226654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 6419744430976403982, 3447697248540225808, 10044864192452182412, 7058340312231756422, 11424300291678555912, 15031231631039778878, 2669622821021436503, 14911345319478414189, 5914533097243323078, 8371470863620210867, 2533220603754125879, 14376937495131853153, 8539659581227571270, 10662827764253743390, 17166726581641984506, 11280387487817815677, 15742094452256624479, 8912948444301774054, 14703675557715690630, 7196421200244503747, 2515843481723679483, 9280041324473036738, 9451078778045131871, 18129703980105207203, 16085683684539047157, 7181119043238227738, 17090649967623261857, 7951988307407900542, 13025686387588160039, 10950281275289859162, 677561570464011141, 0, 175, 14697063750404833549, 5887611756450648665, 4390455106880745190, 12605921110673978057, 3909247147397492340, 9689010753727301488, 9581721436999738864, 16354053311311796732, 7989095941327388146, 15260860572373553109, 9500012181060025316, 18019646022591970627, 9649122197052954943, 2900327270128075, 14086650041861556859, 3689293233291605771, 13498186418617526222, 15088669255793884845, 8596529378407272747, 16168113363552219541, 15854163065073538636, 9399437128660150397, 7202708241142113012, 14757940169676147698, 6949143047896273946, 15186394770637938057, 3979322074577621357, 5317810489943751161, 13663234493876910991, 12876040067831025585, 0, 1061325914286080806, 16723391107514202352, 9754566926160679801, 12819365845000407643, 9991664912056245947, 9847657839340877601, 9218945951971409528, 17937489760159731410, 6898590972078729604, 8642762389205548177, 5286310130352931456, 3192683419970405684, 7291895670920337828, 9471733465477014135, 5916843872480033571, 15161469576939421414, 10084364066798723299, 8948842015142234828, 11061922567205483533, 4596163035992380964, 16524077373781301709, 3948990276587207306, 17492638446874188318, 14193096602587779175, 7319641733964937743, 8739778943225234768, 5782681438096211376, 11891715600478694595, 5580010029452924235, 1761218265234642115, 11605105809497505058, 0, 170, 946461078672821334, 16281780351388912901, 2935418863412242354, 14713353090133347394, 1791207195906381248, 1092415958346704160, 8319785044806982194, 11182822967626325795, 16809587424157045315, 2244733962249620937, 16303706249485479712, 845878992383212753, 5921002467687226204, 4434027484725189444, 15967620315457307754, 17386925554974145101, 13158427748622481094, 6196246176234489731, 8582026933349467190, 611778401982756412, 16288180016347524015, 16434619985909351985, 1145514137751095479, 5160952971387430527, 8451565207539691282, 5967893180517848182, 7714774968702541161, 14978023560208702638, 18014742166879778909, 5450578834500306709, 0, 40, 1560947813056021755, 6935064976442414148, 9999441144135002932, 10354700837586583171, 6040781227937012106, 4698117391978117444, 4735711626023545756, 11217844833019453026, 3130590714605394722, 2809204122464618686, 10935232469327759448, 18335893537613898174, 10868401885487323501, 15799177281014635734, 17187052562019754838, 4027411046406207040, 11879721967266924677, 3613659344771632047, 1846469577394958972, 14668357323201408029, 14939045883642543835, 2885718226990976376, 4969257074069595075, 10824274197210729467, 13212275138420405274, 10563919532671437398, 12234598862193668129, 14653607410806008848, 2498958194485300229, 3512215170452429648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 7416632953558849265, 17594999963544064287, 12743397052876062010, 16793498368204377302, 11520998711037823747, 7102906674716336449, 5413886510672963560, 1869688954383701255, 2779549538868222645, 2240230247124034957, 1133217540165824186, 15083342046854437444, 16448963681750067902, 1360814798563974092, 10806646336881251745, 7783394201341070849, 3435210620583322514, 6672417563265002316, 8185266593862172618, 11336008056438129603, 11885558902631228328, 2880459223621017435, 5581858847773628805, 5641110601962994164, 11691200044195449244, 18247981403702122132, 5440276046356043250, 17479206923733922587, 8202861560648587401, 6069495537705640, 6253001344519856608, 0, 140, 11345515238018223131, 2946171615755015016, 10503353101665672276, 15589073729373314001, 13718116689255862703, 4274061922998936105, 6661690865570834646, 2350105156607890338, 11848223112496568240, 575220748088635860, 14463381670682493434, 6239522938056088373, 5225807468457901577, 5430077683379130363, 2608178208619376380, 17198482303941924567, 3796686867992995838, 13906033972215271083, 16841535128816011006, 3862251867639640526, 2035529259540079632, 9756998763275612257, 1710277459229142915, 16231968704214022931, 11354865285620231158, 2004972393153402371, 12504370868862613699, 7450671729747196018, 11869180945716319347, 10995045216798627929, 87, 6657939908049969746, 18076794411180476280, 205142327694293412, 16544719539062425474, 2678151302770396230, 4629674588184701527, 4756922096433783348, 6601966437239502772, 11244080601096335225, 6649199742327408095, 1784797448120793789, 14231596045603977911, 4619347748135638900, 670946413872621524, 9168306336221214796, 2712598845436515249, 4708938355998137236, 12719783652674704119, 17571986815953822221, 10053747442208350154, 9541903258826307302, 16365489308483642755, 9446845463763503898, 12491857199480659906, 8850778807446174241, 10733909952514206486, 15234998934151879467, 9571493212894702614, 4393284534245665333, 7926227231583287531, 15430453444364458588, 0, 136, 10841411014448826746, 10924324070009278511, 4390811061445162297, 10665404042695900090, 11148796663006115025, 16584177158338467512, 15369021590994653978, 13860609558593370204, 3837193053542887320, 7652640894347806080, 683219561750944695, 4006536353767232614, 4047796662675347846, 1149920536684206111, 1698301089048909092, 6224704259817574157, 4439284651749775339, 16476516570230330168, 10834199646006576067, 16282481854654492091, 6659294847490221927, 12242894720083399562, 7156478509869523727, 9996508607909856718, 17045153176928915002, 4097937233975335255, 13892339685592049122, 3881709886225480466, 10446442293007407525, 1539493896147927159, 0, 32, 9302012295643728416, 424328237663665361, 17748121622218558811, 6681769685034042719, 10907932526941371789, 14996603190997478665, 13982878080104642188, 3336783822228111865, 7403528606603453519, 7309352233404946366, 11509327586943808925, 6803943428138467537, 12870260590513220077, 3798257798625653324, 15652192157997003684, 8260391000410661595, 9099897743400681933, 16067207775248165408, 7640841583197908852, 16739199083410292994, 1998275509994500625, 10688417071827877337, 16160081185811655577, 2725954513011781037, 3040692668058239811, 15097072321276989567, 7813293313258815644, 15261763399945716285, 2258772319189190202, 6756061023037720295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11356706632132474470, 2358849405739495388, 8252049255686697090, 1550389821256969487, 6750324157015485381, 604741251465830172, 17676294546444101345, 1421326959851451806, 16490161619089770695, 7767675836373196892, 2198451335895548750, 14472480345778371117, 4528209626244081470, 18204665069024529476, 11966881683411871471, 15889763672746314463, 4160946893194356300, 15047282824503396386, 16648027271626045172, 17326536692088196432, 13311336675659068295, 10920522191757572329, 6554220297842488502, 5028468445182081313, 10053567802826673403, 9039178885558385498, 8545236135635685226, 10069135081496908116, 4751010459333335795, 15084214110056267454, 1607381721595724854, 0, 35, 809326793687057962, 13043350793597586415, 3445826420292422918, 15832983954926147440, 13006453459232495210, 6690439008924914176, 14925506152061129229, 7686554446337042304, 1386567235067272296, 18336554683084823555, 13461715534861002386, 6450595223101539903, 16347954830762298502, 15583422763378897975, 5985288376766257087, 9084874200639035992, 17711582701900015634, 865108223448999540, 16640836306313302925, 2841702098020816448, 10239653893689953177, 16135446855619161594, 14211710812292436619, 4482236293883987028, 7541264006304433571, 12592463296509852982, 9966350562627740919, 10317133817946706776, 2674823044861603020, 8201489714833429310, 0, 13425232862973212709, 7318735608001207147, 2870457579998112786, 8435616415860238896, 196396598284240198, 15030346739460637318, 11783104108423427368, 6893308270453759366, 1186051241082879855, 5410658890137048512, 10911572374110245694, 3704568930318998699, 15085014690020902180, 10285804549311169869, 9214751878561195125, 10949533612894576728, 4512217941150685160, 3355391310977906543, 2378656381642692957, 1495035938694254211, 1628981830846711491, 1657549910326762005, 2033490153416681362, 15310508516972009936, 9202695474221693202, 2288182338723422425, 1229088437375601266, 2390601416181918661, 7303237900174645421, 2453521579710367516, 11406074192870264875, 0, 34, 8422262931452347509, 13885570107923725144, 235244799151795110, 17975760300270072840, 21645088928215528, 13378438338434245321, 11260622121353286786, 13136688320626048612, 17881560939567828117, 16601834208041636644, 2350599886583381643, 3676641047171560447, 2612703737764640459, 6165448709088710825, 9702561415374819789, 14396227383672448392, 2871975363154349452, 13084396173640101372, 15953404371899770169, 14377272925308367884, 5291380804534138171, 576711179775643850, 11287382459948400014, 9324129603955102500, 10503620158827014837, 6130889055094603538, 5442709211693844142, 2968563472347562608, 10528964699829495885, 358459342719025633, 0, 8, 7519454690376123692, 7627104070861575574, 17604686071836489236, 14277148259130460564, 8312218486680706135, 8395439642754559152, 17307771294890409643, 9298206908486537717, 3027629924013931359, 2933551330348935458, 1450485994192951386, 8585052201707081835, 10624425952582111111, 16773523322999621677, 13337622149287916761, 17874287708894504070, 14164897610403484003, 11216401648549709020, 911970190394256131, 3202853507803349037, 14616902435260689479, 14924823153427050614, 4881022900440414264, 9723366934152472594, 16335725686098559697, 8087897843744270993, 11437013713086863200, 7627258546495067733, 18044191572661655945, 16490279521751489469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2156162188207533858, 1652445317709542069, 9710174156710538584, 3687395741963426550, 18198216273587752711, 1838753262326158154, 17157485573110166020, 15957089851173678739, 18249894041959305436, 4865827667628828701, 13002397426121818840, 2056311725258650732, 10926587116602338049, 5861292583325103670, 7147743639536563769, 17793738412709433040, 7010314501210327907, 14741490826925726048, 11016711855241315519, 2381487671462803904, 2201441872551078055, 12296957712116650503, 10199495361398762521, 17597473646777692775, 8352767355705497400, 6369472266524549650, 3523683736119512174, 16946656379378628774, 5583968744804760129, 12827986113643603592, 11319208922614274152, 0, 35, 8353595870573531205, 2540346347559199959, 15905617593867500462, 15206447585345432360, 9587574406720228419, 13962042635878587483, 12647708209366536631, 5660351957917038651, 2686094179381860856, 6724344971643611017, 7730484900119681480, 17496531794766962548, 9582673736768413052, 5090730089788327507, 16316669523444224399, 15180713067843619854, 3366467649642622206, 3781233238795801028, 5780865724855930643, 4603482683901152330, 6284610136599748777, 5490240700537832368, 3009248399805477246, 6182266765615504635, 10157260196426992044, 11702418701530435943, 16215780421699068990, 12595602375369553246, 14007226435224111078, 13655239822733173662, 0, 595597012989057201, 17139781905758323226, 3995355680811906625, 8414041561969840147, 6056580584982795553, 2275917558381110739, 1213850852525589804, 12621557274381914353, 8183226668403108743, 3186362008740620984, 13198139370097152194, 2958463820434100861, 6175120933459995736, 605479756900086202, 9130478176053651155, 5046313161028350213, 6401077792884902899, 6554586936759661283, 17551059730726512380, 4149682069832499543, 18155642743356144121, 7818664772328532886, 10601663807010949823, 13981378283476746869, 8981534628391844134, 12415014162240143946, 12267765271876857143, 16738431774071597762, 639602489095149029, 13916262071165774844, 6409620289494267476, 0, 34, 9168769012195838974, 8757246072351383525, 15819587373362991575, 6330331124468459419, 17594449485955496857, 5094615699180819390, 10468588157075103568, 17500241837984025274, 12590769989805218521, 10257339134394161483, 6020533408585278677, 9887559600989616103, 17174772404727048357, 8260989830322406645, 15331894718426588199, 13817494132369433237, 7270842089806116389, 14464987003178196376, 12856235623981550070, 6446968933011398838, 4625298604721424009, 7537989708572581312, 8773062848621227780, 7997392847552644982, 12295542285792207282, 2236820296563710856, 6411496154095679628, 96618257160083950, 2708395562256972928, 13820925760592258770, 0, 8, 17781582622500481192, 12847902632736061277, 12021499907877242591, 16751519355106661703, 9062087890172095618, 3834953580385337540, 2969703856153678454, 11604562295556139307, 10447912046373566534, 12987934619706800857, 12352596220492768030, 14816150974992525275, 2172600571554701126, 18086375044546604023, 16313093185369681775, 14997664071320688070, 347950016295486690, 9206182676441692601, 3566552483989599402, 4925983231752336365, 1728701557101400581, 7087476601458867917, 9759961360999781392, 12569092891286895547, 14206292953735333262, 16422952955631166803, 6294107725304445883, 9537940691512987143, 15535806100011306333, 7080716573279759555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(13) }, program_info: ProgramInfo { program_hash: Word([6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 14, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 160, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 7, 0, 1, 0, 0, 0, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 1, 1, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 8214490973132607971, 4584625016228750380, 7448701979965755247, 12849137552501188796, 677561570464011141, 6253001344519856608, 1607381721595724854, 11319208922614274152, 0, 0, 1, 0, 0, 1, 1, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 12030454825456445148, 14743087584632180635, 804908825530740834, 15978537433270792071, 12876040067831025585, 10995045216798627929, 8201489714833429310, 13655239822733173662, 0, 0, 1, 0, 0, 1, 1, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 8523492539397344614, 13282343245327117747, 16657610054734022844, 10245076951199455280, 11605105809497505058, 15430453444364458588, 11406074192870264875, 6409620289494267476, 0, 0, 1, 0, 0, 1, 1, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 5256913258227871425, 17100537000217132265, 10362535235958450122, 6599190416745833044, 5450578834500306709, 1539493896147927159, 358459342719025633, 13820925760592258770, 0, 0, 1, 0, 0, 1, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16253482711025978099, 5751576643258238090, 7110029021941723513, 3208043314804619251, 18130890293586930078, 10452764368937945515, 9114363797835460134, 6104172690014223231, 1560947813056021755, 9302012295643728416, 7519454690376123692, 17781582622500481192, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16690839578921925157, 7830268710878889486, 10115409991715085575, 6920597847411412414, 18252951749527557342, 6969997263492352670, 5446076396314160376, 3119855977255645286, 6935064976442414148, 424328237663665361, 7627104070861575574, 12847902632736061277, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11755424915479552417, 4868320831660690795, 11428668827299215140, 17985619796195836408, 4460903658820341507, 15570786589164252178, 12863008906537145423, 2700229040680838768, 9999441144135002932, 17748121622218558811, 17604686071836489236, 12021499907877242591, 1, 0, 0, 0, 1, 0, 4447686994046778179, 11785000236654418865, 10679155400143926564, 17934377671577204140, 7042762868047858013, 4015039023438705588, 11907191178709112742, 859505755654562117, 16136993048454358354, 10008421878335836436, 4228220371303630837, 10354700837586583171, 6681769685034042719, 14277148259130460564, 16751519355106661703, 1, 0, 0, 0, 1, 0, 217106376514171653, 11707313943908545641, 15092932467239161061, 11049594146888643723, 7267371538363991280, 8421627027326523148, 9466912758182965715, 11174658189737631113, 12296464969648251345, 7266552182027361169, 15522155400452634037, 4735711626023545756, 13982878080104642188, 17307771294890409643, 2969703856153678454, 1, 0, 0, 0, 1, 0, 11044550050665632476, 8958367422149199561, 16497379967830959424, 9105126057127804171, 13427183447069512151, 15171283498151438808, 1953587265841775225, 9636744945302995714, 18126939303114916528, 8791105532651972211, 13664486701019622043, 2809204122464618686, 7309352233404946366, 2933551330348935458, 12987934619706800857, 1, 0, 0, 0, 1, 0, 1877907417051268915, 6151364593092129113, 13049072304454003157, 14569284676797348998, 6517696895688418945, 14662750186533371679, 16069841829669607101, 1490539036394497080, 9033882039108268313, 11281913023757770338, 6092037682822283700, 10868401885487323501, 12870260590513220077, 10624425952582111111, 2172600571554701126, 1, 0, 0, 0, 1, 0, 10197860193367132813, 18317591232122268101, 11864893253666570624, 2835737623710330612, 12960707821770488929, 11079168775731474830, 1560700914733041660, 7731471377060742735, 6301009824137139871, 10181825490691565485, 1893419523737526751, 4027411046406207040, 8260391000410661595, 17874287708894504070, 14997664071320688070, 1, 0, 0, 0, 1, 0, 7903888723576875237, 18382523577454102436, 13167437966520740716, 15482419984058848245, 7634329044629047826, 7042468264080735391, 6200990949184863170, 13733877647296302634, 10330363517752279308, 8463471033597650592, 9636585409664050258, 1846469577394958972, 7640841583197908852, 911970190394256131, 3566552483989599402, 1, 0, 0, 0, 1, 0, 2186301169863059887, 6122215293275160143, 16696916221087249943, 5297995970636059087, 6007758954686348362, 4655654314239637986, 1006207264024395366, 15572658687280648106, 7189713532379018536, 2112404415880305855, 2136665268102207704, 2885718226990976376, 10688417071827877337, 14924823153427050614, 7087476601458867917, 1, 0, 0, 0, 1, 0, 4350099661540135647, 0, 0, 770728251595531533, 434120282701603474, 899748567092010447, 14918729158665343812, 16808111015808513609, 7424874700566577356, 17448147405455891940, 4462464721020457233, 13212275138420405274, 3040692668058239811, 16335725686098559697, 14206292953735333262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1347942901513492691, 5581285869985960561, 15417366235984526759, 380737719356524599, 12243901590027926887, 7052270251739242825, 654959311657763753, 7098417589530391109, 12234598862193668129, 7813293313258815644, 11437013713086863200, 6294107725304445883, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12086966446141742548, 6581368197537384623, 3331301994171189600, 12870561906904032245, 6559275936659510680, 17586339544079318164, 15404879372302137522, 15343623253038912080, 14653607410806008848, 15261763399945716285, 7627258546495067733, 9537940691512987143, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10239457018222882008, 17661012293298952642, 15814677761660135474, 6984680585936259437, 17224785255700525855, 14071176523136369481, 458610335793450516, 7762335122892638892, 2498958194485300229, 2258772319189190202, 18044191572661655945, 15535806100011306333, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 1, 0, 0, 0, 1, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14059267169109730234, 15833028045737259664, 4457596741936238930, 8186419089203192999, 13502722698945446624, 16864340361327671903, 6567391571487826395, 13313027311321423572, 946461078672821334, 10841411014448826746, 8422262931452347509, 9168769012195838974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15746924929585133009, 379315838026506093, 12529581077675993243, 15318603549361168513, 10582364865337924932, 2636070061904000825, 5204289601743072522, 9192034959170904294, 16281780351388912901, 10924324070009278511, 13885570107923725144, 8757246072351383525, 1, 0, 0, 0, 1, 0, 0, 0, 0, 471985631500087772, 8581974592770288933, 303974201734355881, 7911471416782656233, 8264438684589566467, 1539270658943308645, 3431536436519013066, 14701500658652215925, 2935418863412242354, 4390811061445162297, 235244799151795110, 15819587373362991575, 1, 0, 0, 0, 1, 0, 12803581155021505789, 1617229089722186747, 11821086028219467787, 16946433723443173275, 17442451301272882541, 13345903392866909652, 14239435248344205979, 7775924941916048886, 8663103496298937284, 18098398151169262506, 3854356596578551734, 14713353090133347394, 10665404042695900090, 17975760300270072840, 6330331124468459419, 1, 0, 0, 0, 1, 0, 4117165326757319536, 1434871395181292700, 5147296384675574401, 18402496786565368100, 1541891846645406613, 6608322246477847509, 113263425049039362, 14624701183045087851, 5418421295167202847, 9902960937688969164, 8526809416150489728, 8319785044806982194, 15369021590994653978, 11260622121353286786, 10468588157075103568, 1, 0, 0, 0, 1, 0, 10779284519276237242, 5207917218557150537, 17102744930422995322, 7881354678273462636, 9096730616149686024, 8889792067304111866, 17358468187481791647, 12209401598010007429, 10326065236143981873, 259487815978835763, 2939637999200097803, 2244733962249620937, 7652640894347806080, 16601834208041636644, 10257339134394161483, 1, 0, 0, 0, 1, 0, 15007735984166481726, 2893692142669467166, 5586756186106745240, 7881520773741268125, 1119526938685078607, 8580323529307502020, 1868806426895026968, 11046353624103181594, 2355139499180822246, 13294225392413433281, 8555475415255527439, 5921002467687226204, 4047796662675347846, 2612703737764640459, 17174772404727048357, 1, 0, 0, 0, 1, 0, 11641703905547654953, 13518861492744284220, 13602438854947769427, 11440521690988525934, 1858131981777548381, 14683551372837095812, 8741184015917561905, 4381652925229768341, 3668923621194401622, 8742633689618768661, 17171454789201612359, 17386925554974145101, 6224704259817574157, 14396227383672448392, 13817494132369433237, 1, 0, 0, 0, 1, 0, 17007411413036910904, 6937272254859089520, 3345146633011014675, 16854936978988550164, 4472804247539583969, 11270159100715194202, 15367181090448289261, 1868429356172715569, 3430895131654614161, 1015593294205135440, 10191353484336583572, 8582026933349467190, 10834199646006576067, 15953404371899770169, 12856235623981550070, 1, 0, 0, 0, 1, 0, 6583655571084272508, 1064174383094762843, 14004531006300423026, 11420674364099598202, 8460103377465445883, 10804815118997327370, 7301079719327054003, 4877497612363750655, 14559648290526166949, 9120291006888379304, 2115641271859045975, 16434619985909351985, 12242894720083399562, 576711179775643850, 7537989708572581312, 1, 0, 0, 0, 1, 0, 9177904733833547672, 0, 0, 4263756598719013378, 16645964836945405904, 1535579717520953536, 9288443086735636960, 12124737918817624189, 3028234720115016827, 6680864214558642932, 12931918488324919856, 8451565207539691282, 17045153176928915002, 10503620158827014837, 12295542285792207282, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13465875315346524402, 16176623117443515258, 208588932528011586, 17461402434481489861, 7578220797847929864, 17564919688262005304, 9600963709893327666, 11244752067809188397, 7714774968702541161, 13892339685592049122, 5442709211693844142, 6411496154095679628, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17464705757459592393, 15081244610133230814, 11685358340804306780, 10152174670869705735, 9410406960468072857, 284282844772359316, 7733975108380115257, 2111913529644288504, 14978023560208702638, 3881709886225480466, 2968563472347562608, 96618257160083950, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14751425303934963720, 6410948793715747581, 2822178276157738566, 6117144343302310887, 4811333449307081983, 7938696543505248162, 3435995547523177385, 6112640616610282754, 18014742166879778909, 10446442293007407525, 10528964699829495885, 2708395562256972928, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 5256913258227871425, 17100537000217132265, 10362535235958450122, 6599190416745833044, 5450578834500306709, 1539493896147927159, 358459342719025633, 13820925760592258770, 1, 0, 0, 0, 1, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5140376474314663948, 3739327994472119619, 12197195286374413309, 8260931550665656557, 18424611315455665672, 8710514240711102938, 13745802786964652170, 6548375970637655697, 14697063750404833549, 11345515238018223131, 809326793687057962, 8353595870573531205, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5151077999657789073, 9855163346786806166, 10427073607190553707, 11893740670479805498, 8660762125905589832, 3087828367487460915, 10807941376803729065, 12966884757436832352, 5887611756450648665, 2946171615755015016, 13043350793597586415, 2540346347559199959, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16885380856972561696, 7272719153662087111, 533047373605454411, 1829926574142237762, 17127340306827455573, 8550318671602553781, 11967821891194701924, 8617173377985249829, 4390455106880745190, 10503353101665672276, 3445826420292422918, 15905617593867500462, 1, 0, 0, 0, 1, 0, 14015495768979275110, 14880246136006978483, 2370383909586342854, 4396313619195267116, 10277182995998348622, 10580779234737523528, 1594484475404924132, 2784948507084849054, 4930631020140393563, 2468953284439066013, 14369692677316723198, 12605921110673978057, 15589073729373314001, 15832983954926147440, 15206447585345432360, 1, 0, 0, 0, 1, 0, 11655043985748250296, 10699504707431232516, 9467299864033965285, 17818361021916066381, 5757159540459665691, 9765809951316535147, 9595530987647092729, 8347633294012310580, 2828555514110129215, 16235476345222743147, 16488861457711574881, 9581721436999738864, 6661690865570834646, 14925506152061129229, 12647708209366536631, 1, 0, 0, 0, 1, 0, 17354386000029748168, 1615091744629199786, 6126471050563264586, 16833029552007335772, 10562329593955594288, 9697859497182376308, 4563063455320265667, 16459952452199547026, 8327420331623942113, 7827742839669371295, 2458019052558535305, 15260860572373553109, 575220748088635860, 18336554683084823555, 6724344971643611017, 1, 0, 0, 0, 1, 0, 10761244172272014098, 18186939778341908967, 9856938012656986962, 9947044966489369966, 18303351465385086236, 6110992258367195164, 7735824317535531109, 8768898256362256567, 453077352291409865, 1609065912712094319, 247484960726213991, 9649122197052954943, 5225807468457901577, 16347954830762298502, 9582673736768413052, 1, 0, 0, 0, 1, 0, 15683239765212415917, 12949077672553569346, 6136438285021512441, 9818108804633787874, 9244678019206311862, 11530371422565574919, 12480600709687621128, 4574304056007112162, 8150970536507693114, 2648588484571064605, 11606973446973456199, 3689293233291605771, 17198482303941924567, 9084874200639035992, 15180713067843619854, 1, 0, 0, 0, 1, 0, 13352191639049950502, 1781612529695982717, 17940295799223377801, 4313511094695098159, 5878623689014611519, 4405616242805307371, 1262088577389795166, 17597264692962831013, 9734673703119078710, 17976467869316326526, 17692030742991723124, 8596529378407272747, 16841535128816011006, 16640836306313302925, 5780865724855930643, 1, 0, 0, 0, 1, 0, 14809719365593713010, 10532643948327499097, 11726590278216945558, 12934070243418782738, 12505885186641282427, 78901366432993105, 5046795949307964432, 8474944897236640626, 8294118794714299790, 4079016485765258670, 7568893198878892067, 9399437128660150397, 9756998763275612257, 16135446855619161594, 5490240700537832368, 1, 0, 0, 0, 1, 0, 1825940038334452510, 0, 0, 1303361134214255144, 17429829341045194126, 4285338701077916719, 2910522803612995552, 6045066589466757281, 3823107055299292863, 17630322765550216924, 4973217863350539721, 6949143047896273946, 11354865285620231158, 7541264006304433571, 10157260196426992044, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17525379757599431696, 8834060796313238365, 8610620161032996227, 9527459414368740643, 9178488780906183949, 6890858608219888881, 13578840114630190185, 18189457662137520245, 3979322074577621357, 12504370868862613699, 9966350562627740919, 16215780421699068990, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15824846667317041360, 856881534780831669, 1345962755312618543, 17392858720163980888, 572497659895507109, 10680339138669917038, 2119568863265536467, 17447468029829501860, 5317810489943751161, 7450671729747196018, 10317133817946706776, 12595602375369553246, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8992618192991263654, 8614320689815223473, 5938021660540313570, 500779098360895522, 14724337405152116499, 9892588909603237147, 8158174533637128652, 5366612376176920228, 13663234493876910991, 11869180945716319347, 2674823044861603020, 14007226435224111078, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 12030454825456445148, 14743087584632180635, 804908825530740834, 15978537433270792071, 12876040067831025585, 10995045216798627929, 8201489714833429310, 13655239822733173662, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8962397996249942813, 13564283360082851490, 15320836901220842229, 7059236745058640735, 14597771066871753553, 12891440258701617795, 7976296880270099068, 9869196225863171361, 16723391107514202352, 18076794411180476280, 7318735608001207147, 17139781905758323226, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6385487366266632060, 16294057552644672316, 9687580313089453282, 9552556216292266897, 5977340097238271765, 10322300200196682981, 279851189829800217, 6918765821995287137, 9754566926160679801, 205142327694293412, 2870457579998112786, 3995355680811906625, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15421658280337698465, 6097183689626534496, 4646487368895915296, 4246851900171193724, 7707653349895837404, 17715988767376665360, 1629791578136936575, 1369739146488483681, 12819365845000407643, 16544719539062425474, 8435616415860238896, 8414041561969840147, 1, 0, 0, 0, 1, 0, 4454659362488555244, 897257401795782847, 1442741355132240277, 10565312036761368185, 5142791099649335720, 14821642720711744364, 14051544049298817271, 750410385838623118, 12529577197437921705, 9250281207577685312, 1289422996858358477, 9991664912056245947, 2678151302770396230, 196396598284240198, 6056580584982795553, 1, 0, 0, 0, 1, 0, 17078534924241776339, 15440110056678900200, 18208650451735606208, 10756948069435380801, 15510754792097734964, 2375067891701857361, 2923239127151948080, 10704182720413467090, 2473371596923514175, 1150752289248225959, 15140294830527696728, 17937489760159731410, 6601966437239502772, 6893308270453759366, 12621557274381914353, 1, 0, 0, 0, 1, 0, 316614558845336509, 2878699202280611836, 4275560082084202144, 7825754886390455440, 7997738108478273878, 11956271016055823946, 8453074578285752653, 17538680525690853062, 3583695132258196536, 10246367578585743447, 1421290680685617214, 5286310130352931456, 1784797448120793789, 10911572374110245694, 13198139370097152194, 1, 0, 0, 0, 1, 0, 12678676945213092865, 15246741769098836296, 15584605922953436007, 13983789395651571583, 13294611871319191983, 5847635127357093482, 9897038047323897370, 4141923705337186001, 8176730118494162678, 6783090395235209659, 7174788237318142123, 9471733465477014135, 670946413872621524, 10285804549311169869, 605479756900086202, 1, 0, 0, 0, 1, 0, 16568523364350885487, 15819937544318835786, 1810889556141981899, 3363240447642516424, 2845656992888419272, 16007826574763812566, 10836844319802726945, 1759841724041652075, 10220987366360269577, 4288337514646499477, 15302356383007635999, 10084364066798723299, 4708938355998137236, 4512217941150685160, 6401077792884902899, 1, 0, 0, 0, 1, 0, 443828493241314088, 17479115015136738827, 16807605577473118694, 7828293012926775020, 4406743315212729130, 17819043892120276345, 10288960109250570842, 8627241529856509742, 12763806424191572386, 10924085850925815890, 11240603387110570141, 4596163035992380964, 10053747442208350154, 1495035938694254211, 4149682069832499543, 1, 0, 0, 0, 1, 0, 3238559664072884360, 9979572324819437588, 9676585927660439650, 12922287692448102380, 16122102826540224213, 1387322623565652732, 295310595529849583, 626496362396505138, 12692366118122891151, 9118931780992437842, 1835696655621331722, 17492638446874188318, 9446845463763503898, 2033490153416681362, 10601663807010949823, 1, 0, 0, 0, 1, 0, 12833432460597635146, 0, 0, 12362167187142713720, 7652433402428128865, 13848956826511295359, 5959646737238852401, 4051444777808751499, 17743718519616976296, 4470738656604083779, 9409022898528060781, 8739778943225234768, 10733909952514206486, 2288182338723422425, 12415014162240143946, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14911169987988052811, 9684204095164476815, 10202942699122698773, 9822906574365710103, 14333518987829918669, 2543793480285047170, 6422638912707970220, 17063170837522968299, 11891715600478694595, 9571493212894702614, 2390601416181918661, 16738431774071597762, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15100444854223162361, 17702995505216793489, 7439539809669146478, 17892016949428967969, 17843924827166978222, 17021793130360212806, 16012433424607683700, 3702512996340883595, 5580010029452924235, 4393284534245665333, 7303237900174645421, 639602489095149029, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7731918223558949955, 10675603116079282076, 13477200069544690909, 9033576496544593982, 10647867748676596435, 11915740833798992018, 6326608805282345628, 2628586313169132635, 1761218265234642115, 7926227231583287531, 2453521579710367516, 13916262071165774844, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 8523492539397344614, 13282343245327117747, 16657610054734022844, 10245076951199455280, 11605105809497505058, 15430453444364458588, 11406074192870264875, 6409620289494267476, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11959214793721861949, 11044849754686238278, 5121401795821831283, 3548930057165921670, 4141253528664299662, 4690506171811599662, 7471531250255239926, 16928201695930024468, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18248966067159614734, 13590585102940813084, 9590621322847534573, 4885112663983886856, 13157788436891508553, 11521696315622895181, 8426354436255247671, 2713831240363482992, 3447697248540225808, 17594999963544064287, 2358849405739495388, 1652445317709542069, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14997726253538871503, 13603816939964373123, 12932191302609726157, 12798756157498171562, 12242844110543519517, 1112809250875085271, 14696972132215546141, 17933860786448377030, 10044864192452182412, 12743397052876062010, 8252049255686697090, 9710174156710538584, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8817287785847965336, 3385249563011961849, 17918869724719667108, 8555258669059245167, 14956019708245712821, 12021362864117640865, 16692922442306646447, 12140276230850597158, 7058340312231756422, 16793498368204377302, 1550389821256969487, 3687395741963426550, 1, 0, 0, 0, 1, 0, 13889646877547174618, 5867013684002937049, 3874077199438956671, 7563891540952433248, 112536514236739072, 14326240507681405072, 12593636579411959551, 10570950564294000321, 18151871077622688335, 8874979589420119367, 1606372307127613897, 11424300291678555912, 11520998711037823747, 6750324157015485381, 18198216273587752711, 1, 0, 0, 0, 1, 0, 16236403493045129867, 8532135944457515917, 17647636734684350457, 13463537305496517162, 15195193333392427571, 12352345465945418691, 10174923844635011062, 7668476027270202579, 10359334248806725290, 10085921208436197132, 16448487398099419345, 14911345319478414189, 1869688954383701255, 1421326959851451806, 15957089851173678739, 1, 0, 0, 0, 1, 0, 13764650897714891563, 17810684478882660202, 14031148050915831965, 3808288102601471056, 14347073347558249169, 10584893895333648109, 1428273348489524024, 2062361183656478066, 10866279963718241802, 2718833903563323199, 7493603045769629260, 2533220603754125879, 1133217540165824186, 2198451335895548750, 13002397426121818840, 1, 0, 0, 0, 1, 0, 17725409119032852267, 11323941782055916015, 16251673015114650089, 4938442710501308657, 5613057382731574150, 10105110162171772438, 8183805712769991021, 15900656105857229467, 4713833248608103744, 5975284652827254996, 17140128915513269672, 10662827764253743390, 1360814798563974092, 18204665069024529476, 5861292583325103670, 1, 0, 0, 0, 1, 0, 14914053581161264238, 2620801595702286526, 11717666498402108632, 12002553001135911279, 5693866887050036020, 11964900944541509452, 8293446604021081650, 12256719005104851107, 3995119331147317584, 17181552195820469706, 8512417397041248917, 15742094452256624479, 3435210620583322514, 4160946893194356300, 7010314501210327907, 1, 0, 0, 0, 1, 0, 3562234265760858029, 4769670971948134199, 13385330306078539868, 10789879208843041511, 4107508461331672257, 4621662715196065678, 3079504282059755968, 260627379830442974, 894389675194381154, 179996691661177615, 12193512270869861572, 7196421200244503747, 11336008056438129603, 17326536692088196432, 2381487671462803904, 1, 0, 0, 0, 1, 0, 5906557576131351225, 13293454763685280754, 9930431347496206092, 7069639777384924144, 364669749717258, 6809248840077290249, 17801775841166869486, 13819086418675951632, 14554524254203776994, 8885320358009245035, 3851130964131028937, 9451078778045131871, 5581858847773628805, 6554220297842488502, 10199495361398762521, 1, 0, 0, 0, 1, 0, 2656770040929279434, 0, 0, 15539063566397429438, 17691418632824774891, 1922074210551113159, 3106011472540779982, 15257531885396120213, 12320900210322448034, 11637817792474845578, 3363935513258073239, 7181119043238227738, 18247981403702122132, 9039178885558385498, 6369472266524549650, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10333172214933120836, 15557683662491153084, 1598739907793205518, 6265664197169483681, 7206583663178666402, 6198597980723382916, 10395653141429564317, 15929576060773374367, 7951988307407900542, 17479206923733922587, 10069135081496908116, 16946656379378628774, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3750356548306982137, 12209140182523723096, 14526700523373973306, 9801143914278062154, 18199569338713260127, 7473328648066901490, 12120812098909026742, 9238706649514600628, 13025686387588160039, 8202861560648587401, 4751010459333335795, 5583968744804760129, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12302499613655276109, 17383410983291524378, 16517594411296145407, 2114471287922017076, 11998802949255523211, 1026110231435118088, 14623333492544617469, 6772806779673451094, 10950281275289859162, 6069495537705640, 15084214110056267454, 12827986113643603592, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552, 8214490973132607971, 4584625016228750380, 7448701979965755247, 12849137552501188796, 677561570464011141, 6253001344519856608, 1607381721595724854, 11319208922614274152, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(13) }, program_info: ProgramInfo { program_hash: Word([6116677274871151273, 10392133002436897113, 10134148635057625602, 12864813595450034552]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 14, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 96, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_03.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_03.snap index 238daa45df..a11268f47f 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_03.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_03.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 5598651459581075585, 34, 0, 5598651459581075585, 13620833136975709089, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613], [18375473735916206629, 0, 1, 1, 18375473735916206629, 7804753453550466256, 0, 65, 7804753453550466256, 2256486347761721492, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099], [2105717247508690050, 0, 0, 0, 2105717247508690050, 17777748786253636403, 0, 0, 17777748786253636403, 5193960644663470490, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350], [1679902783560062568, 0, 0, 0, 1679902783560062568, 9435312778805252724, 0, 0, 9435312778805252724, 12344784587178360875, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526], [13620833136975709089, 0, 0, 0, 0, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2256486347761721492, 0, 0, 0, 0, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5193960644663470490, 0, 0, 0, 0, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12344784587178360875, 0, 0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 11091832976040936962, 11629723830403400020, 18085092721393681494, 5334827122981806215, 18131418839636252978, 14614347609195626268, 8910439294593611592, 3843332007587847712, 1023179011544432384, 3804737116729640404, 133391072621725577, 12470388296134501021, 632583774013957871, 4078804678813269002, 4646445037357820970, 12451999842825777859, 10348876437499804673, 4709521304751214351, 3818143376057959690, 13735545676744754358, 5911009352187537543, 11554714135033312948, 9410850814958744902, 11602211351055880832, 12661500893159548834, 9684778724196116231, 18082132319471479459, 5677068088590394277, 13067481717060632118, 17366862825980504064, 12752059346458920613, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 5598651459581075585, 644336023812026221, 13247747688876077858, 18204236545845216971, 16083593158731167399, 4357419437649084221, 5464680208294216350, 2779149829283345558, 7975999984217399211, 3799311940445025695, 12287115722151291956, 7889055060352596454, 3871221682982067508, 16266218633314388061, 10296105519823441978, 6482329477820286957, 2184206139900597012, 13275897735411980967, 3045004919428473516, 16702736287849627035, 4028816571826363002, 15011221569533006108, 2864985628223798368, 15475498524455915389, 5364573001665328907, 10397611698676440611, 8883008337890476036, 17315153826736218240, 14581052801302714514, 17999554639252319772, 18022889162320300611, 13620833136975709089, 34, 340, 14059267169109730234, 15746924929585133009, 471985631500087772, 16946433723443173275, 4595135147820207091, 2053997855496151567, 18402496786565368100, 387609426153233273, 8469665991798416914, 7881354678273462636, 11816560343993810599, 9054561158700241520, 7881520773741268125, 1631726701000003728, 9048332065221759951, 11440521690988525934, 11399562976973524004, 5295775600298609171, 16854936978988550164, 4555566089436281371, 8045874719633055695, 11420674364099598202, 11942861833844189240, 15820096964950298640, 4263756598719013378, 7647209523022736387, 13465875315346524402, 17464705757459592393, 14751425303934963720, 5598651459581075585, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 4371092720588693207, 7555819500301263096, 7871576915936585054, 7738161198426062879, 4439752770537371709, 3239157867226066300, 13695428956813660853, 8114913103795360695, 3271513559100018830, 1227622944719103238, 17840970837055628605, 967816437372899090, 1525132029610696618, 8930953641447820548, 1991652128187274521, 1878310895470329371, 1537331530871119668, 17179845365129498366, 6628846356810584866, 18158002788694963974, 8030209565693857269, 16465976624819029473, 15848213422225602213, 16693748147017299005, 15158850031902933967, 18144229372703820177, 8111553228231189401, 420461259745383997, 17094012225747072853, 16556024871956851478, 18135096529078946099, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 7804753453550466256, 10860407685663036604, 1563629168745730928, 4862512017968946683, 1035294938480129016, 17121277837906333314, 7566123129055455762, 801761918673301233, 8221980324343257318, 8971289227653573810, 14503443403830829887, 4403991158284421772, 3539411744559999519, 17877470569230350231, 13052305487168984918, 11988250928057152362, 7990654922366982189, 8123717249091864283, 273044411934894184, 12617346169478402785, 2083501518846346052, 1182260721753268305, 16655426125402668777, 18315976927222050841, 13684207927534177805, 15562831278015850283, 7777530579170086866, 17762371058211819624, 4106083518382761605, 3917672276375751396, 667054191578263747, 2256486347761721492, 0, 272, 15833028045737259664, 379315838026506093, 8581974592770288933, 17442451301272882541, 16579750051606898066, 5674487159031204202, 1541891846645406613, 8209041782659254452, 11966225502153548517, 9096730616149686024, 15618906860941665577, 14146738543483816160, 1119526938685078607, 8710432271010401746, 13282504786121257878, 1858131981777548381, 12223656597910297554, 11826686549344788050, 4472804247539583969, 7599118004690938513, 8277718642341650597, 8460103377465445883, 4568736565087160671, 4933680726900799861, 16645964836945405904, 3680609073412509534, 16176623117443515258, 15081244610133230814, 6410948793715747581, 7804753453550466256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 7371349600976768903, 1908428216714745226, 2226486931669462500, 16096322966046779578, 5448090446075942959, 10098429045835473018, 4809915777199041455, 18236464326626014645, 2690803580142520255, 1917959726470568181, 7355089244606367886, 9988016662047687018, 6075081950126577031, 782991345573128788, 17727121868432118686, 616586521336426688, 5444667365009856158, 3285592017878659318, 7931583655659423496, 6385821061540880880, 8735792590442216465, 11893401421408965, 8831024347202442032, 4451634306410080384, 8173507753862756681, 15267089652751109873, 10164019920559079526, 5461641667913740527, 4977882380646661156, 5148753722704728721, 13200399719329805350, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 17777748786253636403, 12906637371964794665, 9477262435683869924, 9199231093019338048, 7358751435793575899, 12569972625839259527, 5847320563034378965, 7599987891632365696, 10432134440683583258, 16242679258308055777, 13780789328607365793, 1153491566876700606, 13641042641136958279, 5969854971149325760, 6340590356564925801, 9771444654514086827, 15776260062082886705, 8278469467176979574, 16237604982476195391, 7423750977119185664, 6710003146178124596, 376186270665682407, 15539788083889931684, 11273188656572444234, 5199551304380116153, 11734010025122035435, 3764388601356982695, 11644487560172946408, 15563655808705061071, 5533608926617884295, 14514898346462505299, 5193960644663470490, 0, 68, 4457596741936238930, 12529581077675993243, 303974201734355881, 13345903392866909652, 9586267930884889862, 5178817950472007665, 6608322246477847509, 4070515537963445793, 9312477480709452614, 8889792067304111866, 11078425489498232713, 636055309231688517, 8580323529307502020, 12246954824275240956, 13948398243979685168, 14683551372837095812, 4744943918536266830, 10091391594533925883, 11270159100715194202, 16104697287955959682, 2983615207234436698, 10804815118997327370, 139420663301414639, 11145521977996788455, 1535579717520953536, 14470422183799365804, 208588932528011586, 11685358340804306780, 2822178276157738566, 17777748786253636403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 14926961084296668554, 18296820143542754124, 5759648439566973806, 7690180744863199464, 6255055536007924620, 9967438444965419122, 6053822608871655533, 3970724348518176437, 6498891217103059128, 10341231834356228091, 8497160540604180804, 5144558705352378414, 5437844264442299443, 8712431777609915948, 3915629295644008966, 1353567482375898210, 16603575236790899764, 17009424079525297171, 3253699369098499458, 10648493462065257860, 10940203220400825059, 7261956826490066834, 5730064365163707705, 8826144244207679463, 11688897202604808409, 4559302720015817859, 4402707951554525697, 12375228725744876260, 13367890413392736054, 15438373163420410642, 905179285088193526, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 9435312778805252724, 12594665258064570661, 1586451078180607598, 9325815886784366656, 13163107377789060321, 5998117226166788975, 7008390784506277276, 7362390315901265787, 5188984820381727203, 5842708215320867131, 13553650342229414448, 5955476415838559193, 8725164908673674579, 15174091024100472501, 13637649140457772157, 16186415272190469176, 4473737633571089105, 2032050757569801828, 16070334483916823186, 7382925316452200710, 7820237015849984079, 13711104951459639694, 15277864807184951074, 7746677489393361812, 10897962020578390602, 2459478953251166639, 6142067256785271224, 1469990404519833898, 14737929225229310854, 17685816709290022661, 5568614684720127113, 12344784587178360875, 0, 68, 8186419089203192999, 15318603549361168513, 7911471416782656233, 14239435248344205979, 2133634484310994464, 8097913535946941412, 113263425049039362, 248987352426060274, 10939256691674299939, 17358468187481791647, 12423884741952977957, 56617284060232395, 1868806426895026968, 222259776750343599, 15059516987340721081, 8741184015917561905, 2066403566980848459, 3696239822839219697, 15367181090448289261, 8349149003644261348, 10280553347796952088, 7301079719327054003, 6885778115777578237, 12504375544103392076, 9288443086735636960, 4503182154932177101, 17461402434481489861, 10152174670869705735, 6117144343302310887, 9435312778805252724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13620833136975709089, 1046930547281056921, 5022880593775506902, 7356080910092118039, 16589884839242022257, 8919754405551141869, 782951559730000700, 4320210530167177353, 1189869440416317038, 11509478421996896286, 14131663596834904750, 3063592889799439815, 8310309385140170305, 9794866582382956591, 815213714413043438, 14909022885730690459, 1965134134848901020, 8569284627647542389, 11756365299450742783, 17765218832065923306, 17214386397833253270, 8857548797279425296, 9589793731564825353, 5744303806832189345, 9245523889540971217, 17743277714115543370, 75478605149737153, 16642733757618334231, 10408597074326334289, 1854469405851562328, 5120877191992423544, 6125088443291536169, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 3358534066525179769, 2539641719046213719, 10199880931320172189, 6982964906206022277, 18160468829511284938, 13459748022261389691, 8540403463779371619, 298971077135778992, 9448428205117043728, 7211550496031219820, 5534997352008564058, 8961849300614763067, 16471253951712069551, 11996630593586982068, 17666409503469399853, 14743209389502972128, 13621451519455201128, 11693451034972088239, 376126037836000660, 12412096817616379990, 866468160396608077, 16487331493773223294, 15132792027965031247, 12005877568613345660, 5222840910814569167, 9174906967528115515, 12806387721803954058, 12420516276683200334, 8854457266879028181, 9558115804602486754, 6487880825188915613, 2384716068805359876, 0, 170, 13502722698945446624, 10582364865337924932, 8264438684589566467, 7775924941916048886, 7506941477585260226, 13559643900430805558, 14624701183045087851, 16810498729905278091, 3617722030424605287, 12209401598010007429, 14622001497128700788, 7124074456411373593, 11046353624103181594, 16506916834573600874, 2763493011778369288, 4381652925229768341, 9935322272824673857, 864619558035150967, 1868429356172715569, 6908757966622831414, 14123318794287563052, 4877497612363750655, 2105400693641679480, 8941132592749341698, 12124737918817624189, 15847492668873519030, 7578220797847929864, 9410406960468072857, 4811333449307081983, 5256913258227871425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2256486347761721492, 1399831673864751627, 12438672130810751909, 10240118010240816453, 12454995736750842450, 12272610174663972685, 16716772686788009039, 17679411248915786729, 9344021820453066790, 15548275238570617018, 12554227251830406338, 7982818396816137943, 8298623838207759766, 9667670442404470529, 14730751205912092663, 17475545646146195192, 7561186990159804961, 3352703426322824443, 11124655848983105243, 7361271662241444721, 1785076194951656280, 13323648175345935378, 15598576959546342188, 12701095265259304800, 3219799610745612107, 1555585114147558761, 10397456717804752138, 2319272066426069991, 17926066510128935923, 1264814027228690376, 15123699931666188121, 2665390174743669239, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 9365253138981608257, 9113412038486870510, 12237115836192970750, 13532373892635206986, 11668565565569624948, 2114739335810906841, 16845938989106496862, 18053472495070906903, 9578952411771586845, 2253954535466549551, 11957330595594263589, 4327169169737696049, 8097241277176222682, 17499521208876685046, 10474171567958477310, 2884885063912824473, 9389176041985146128, 2067286230266639471, 3365016398014065199, 738171567486888734, 6622135657383660119, 4978858449337102663, 1252098561428724852, 813491835360077960, 3026073706021528936, 1157174472277816506, 8848575890036236601, 4801870550462804365, 7028466390812097322, 8403721226663073636, 8970732296705167988, 12459739889109502988, 0, 136, 16864340361327671903, 2636070061904000825, 1539270658943308645, 8663103496298937284, 797155414931197277, 7929222985705309752, 5418421295167202847, 16520350781038259800, 11697635461652845634, 10326065236143981873, 4672452207442160023, 9236109584144478544, 2355139499180822246, 7782053902926446231, 2620978815438101291, 3668923621194401622, 246363526423127035, 10353083146864436335, 3430895131654614161, 12564495361718767183, 4982750975383300564, 14559648290526166949, 6242143746593499460, 11140632426269699329, 3028234720115016827, 6653412960111738263, 17564919688262005304, 284282844772359316, 7938696543505248162, 17100537000217132265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5193960644663470490, 18378615377082669582, 9942094792989095510, 18239658104155677632, 3247221802734244696, 8138145110381489386, 8305898108846284300, 4495835739545312127, 13363880742094688735, 409501507955448067, 9615046049029083973, 9226283480795415930, 6188039948757326954, 1925348622523205808, 16932487676782686187, 6461440512631901369, 6379521145060545439, 1135364094435597517, 6898694641523826133, 881111998832614715, 7852757539889945333, 8831210118957475983, 15508177777761403707, 1274251095252206369, 6462015026972174497, 14758961666322366163, 12911489632740586743, 10573355084806673526, 11042755251558401992, 1655214279385078584, 17558359767143120899, 18009389558374812227, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 4243893038989355703, 8922317147540258079, 15524901873579080579, 14961355291644520251, 8912131487655833337, 845467818172067610, 6513419642881984303, 15821388348544564061, 918209442918452849, 1771868273093277971, 11088759444000251587, 15710903694873023395, 7739199555620722590, 403122127909161589, 16794196935209020317, 420049465494673582, 3241180689003955516, 6815831073966054431, 13165955590245083084, 3933813014659210303, 7891509834730356602, 14572658037405460796, 18097121197159342726, 15303933786232509118, 6355852571927224576, 5965705308661034968, 3878821330615144039, 17609259256248013285, 15839551803056895538, 2863101478933748100, 6867483661888889167, 11007533278239168078, 0, 34, 6567391571487826395, 5204289601743072522, 3431536436519013066, 18098398151169262506, 7669185665212226764, 5455708142000104069, 9902960937688969164, 16439153306838678161, 9116909952501731628, 259487815978835763, 11207509487307725092, 13598970521047669184, 13294225392413433281, 17974846784869714720, 1531979193630020279, 8742633689618768661, 12951219828222672250, 1272063647175062154, 1015593294205135440, 1601391529726059156, 6891640398393941397, 9120291006888379304, 10474372360890458437, 5584077426972546342, 6680864214558642932, 2419346771478639592, 9600963709893327666, 7733975108380115257, 3435995547523177385, 10362535235958450122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12344784587178360875, 7525588297109292118, 10242077034078069399, 6920809802339641674, 17643499204383222535, 16688592460292823795, 3252667668159125426, 6639040797936707465, 1827636079652666195, 2462138615393893213, 7273091941301037907, 7777539981955361461, 17791722127119122070, 13941030348836860953, 2461265848652382458, 17178103242399629259, 12982591110459702249, 4311636691398707716, 11830890166127089072, 7160199109027716330, 14107503556614837834, 6316368550299988901, 12988322271117575851, 12500666959478542023, 4763644307980385379, 17502332825869685988, 9045450374393109306, 7379498771612731567, 16568845003086625163, 4695178656129701184, 1678315832465296045, 15789153556893733830, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 2372900269115514267, 7638869850317184909, 18112581651832813996, 7934301823485851614, 13134589595174512908, 5143267856379088965, 1385332020236631836, 4877336193186145990, 18193547062192211825, 4615765459892113834, 3381950137508436504, 17429784608409914678, 14977580224084415767, 6849317271519196447, 5437598344549503419, 1906047363049945529, 5004054537041877249, 14661239785476454049, 10553785792947774039, 2119915982392644589, 8985292275604857439, 9726386267280827154, 4505582310884934806, 12912789541737329022, 7115507662283435621, 2051190405167774802, 1232238311229055715, 220176432091768973, 5422499495491255741, 8009273299237215820, 13359803287975487032, 5187224287159924757, 0, 34, 13313027311321423572, 9192034959170904294, 14701500658652215925, 3854356596578551734, 5718692378574184090, 17501390179378757090, 8526809416150489728, 6507550884061463423, 7814960517829781662, 2939637999200097803, 780950602796552578, 4118107554308446430, 8555475415255527439, 14714307830357033751, 15614510648083677054, 17171454789201612359, 15897739400545916002, 5578273266312075011, 10191353484336583572, 2940473809902205523, 14962502826274181007, 2115641271859045975, 7064236544478437245, 10824702985925635247, 12931918488324919856, 8429882718924461151, 11244752067809188397, 2111913529644288504, 6112640616610282754, 6599190416745833044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4046254507773998773, 6534480484041428863, 3251048018398498863, 14672293546278713057, 16728924149188845306, 128728647106458681, 14226927580887823496, 8277248794545234814, 4354566838645069185, 16178613916401188944, 5304102959326456112, 9791457517463513797, 10245170831782510809, 11611317382660466625, 13569694221132024345, 16005837490233273516, 2791259658093074998, 13441513594234320689, 4241376053954359578, 3545073666350874448, 15186107276182512091, 10698815982870498162, 10971920968668641865, 9145865124167298835, 405811361541120846, 9884965742324813117, 2876689281462596902, 16445466086575260512, 14688957924306712254, 16306354913676224825, 16604794485775028126, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 1061325914286080764, 9554433906850032874, 4012321235764609039, 14967212595115142793, 5983394632166978443, 5809835498849113816, 6561933873120105870, 2140629501848088776, 6712525834006528890, 5760623808290856282, 10552757613235067722, 1939309373056894313, 14427320366022536141, 8538471352201975220, 14188752564290255096, 7981877957758397164, 1148470236137421383, 11019464818805406210, 7769960423081990191, 14632278337044440617, 849771658931440922, 5632784009618830911, 5696241881348246065, 1879984915784172244, 16312530632323862580, 13300309889942581843, 15448409017348426344, 1639569934817636487, 17233518173045382262, 14413924905126977169, 9045462722956532208, 0, 170, 946461078672821334, 16281780351388912901, 2935418863412242354, 14713353090133347394, 1791207195906381248, 1092415958346704160, 8319785044806982194, 11182822967626325795, 16809587424157045315, 2244733962249620937, 16303706249485479712, 845878992383212753, 5921002467687226204, 4434027484725189444, 15967620315457307754, 17386925554974145101, 13158427748622481094, 6196246176234489731, 8582026933349467190, 611778401982756412, 16288180016347524015, 16434619985909351985, 1145514137751095479, 5160952971387430527, 8451565207539691282, 5967893180517848182, 7714774968702541161, 14978023560208702638, 18014742166879778909, 5450578834500306709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 8072556154622677081, 1267311017976162806, 171317623411600853, 14846028244624432327, 5697605161887258162, 6090204166740560590, 11791493563989406548, 17428436932452366793, 5676009947455004918, 18345317182680976060, 18287702590376570538, 4985574569677261947, 15947076302058294771, 15533043966546096492, 13147369042643698626, 13830067522797295398, 9812515853737376613, 1153576568012481332, 6976086965219136352, 9332017051661502953, 11709096929003024091, 4784660881537662841, 4083552985517123622, 9895527598631437834, 3406650305555277621, 13871430865741604308, 2950941648901088194, 3993419962022258191, 6722743736070459606, 1297747773924291443, 15433589206667095645, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 84, 6657939908049969710, 5132111129018882891, 8232522030470930177, 2748555984042091513, 15852736438270791360, 3031910609778633238, 10165962755900271710, 16659854091479845434, 17343121214427119893, 854734865188827599, 16332742745573253042, 719106832906440841, 5187730385273117170, 5680967626748162975, 12443929595174060051, 6984107838208124669, 8017806737059891905, 3253255241682497310, 17244932564674349345, 1765857304688336746, 6104054101040517608, 16644020687030024364, 595269491299106953, 16831646467700047759, 6176340855571448766, 18004816485425051763, 4101389897636298429, 17541610204110287382, 7370145379849234412, 11764023996857035803, 3516218181999416212, 0, 136, 10841411014448826746, 10924324070009278511, 4390811061445162297, 10665404042695900090, 11148796663006115025, 16584177158338467512, 15369021590994653978, 13860609558593370204, 3837193053542887320, 7652640894347806080, 683219561750944695, 4006536353767232614, 4047796662675347846, 1149920536684206111, 1698301089048909092, 6224704259817574157, 4439284651749775339, 16476516570230330168, 10834199646006576067, 16282481854654492091, 6659294847490221927, 12242894720083399562, 7156478509869523727, 9996508607909856718, 17045153176928915002, 4097937233975335255, 13892339685592049122, 3881709886225480466, 10446442293007407525, 1539493896147927159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 14732236349158007950, 7398379382324753631, 16529615322051348437, 17750754114621262532, 3376246851343252040, 16812742874230723382, 5497427090926806167, 10370890449220293026, 12072808913033091146, 3773065747435304139, 1433120707818296652, 12602993390877629622, 11873715535213483733, 13503968807830695383, 1548449854272693349, 2164072014511735918, 2051419284241394287, 7675966884444101274, 7631305566403533669, 9974196014981023153, 16049335883858064137, 2471757314515864029, 247517241416190936, 17714417256089308015, 11671008027458954016, 581610329922371147, 16154960330167538938, 5798502399718959312, 5346182502077854664, 14220066076326577834, 1379414419793409060, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 13425232862973212691, 18017734206314589878, 4362746362325529522, 5580595613883635850, 14186966130004258435, 12558944767443104505, 9400104492160547353, 10540307613825778005, 16337971251965072535, 10106057436125976033, 9544366711268571215, 5728567960549491041, 13778603290469351967, 16022817295707876509, 11816634839594428392, 1619816382417214775, 332425507059551196, 5638968861636104000, 13036766990591622942, 5135102707173364321, 10242389681667623919, 5777720311941164202, 426018854260317513, 11718167143057109482, 13648951505177506250, 14542650836653761124, 18018546562218872798, 4457636384061007994, 2416704573314226662, 914323423605581375, 6601699247185721889, 0, 34, 8422262931452347509, 13885570107923725144, 235244799151795110, 17975760300270072840, 21645088928215528, 13378438338434245321, 11260622121353286786, 13136688320626048612, 17881560939567828117, 16601834208041636644, 2350599886583381643, 3676641047171560447, 2612703737764640459, 6165448709088710825, 9702561415374819789, 14396227383672448392, 2871975363154349452, 13084396173640101372, 15953404371899770169, 14377272925308367884, 5291380804534138171, 576711179775643850, 11287382459948400014, 9324129603955102500, 10503620158827014837, 6130889055094603538, 5442709211693844142, 2968563472347562608, 10528964699829495885, 358459342719025633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 7484183127135320340, 13467318737723490903, 18417997150771375303, 7719389523268106465, 2784882046013758615, 12479320332521777529, 17052932344949276269, 10938440435726947483, 3905086412998728873, 15634495878209337408, 16923840111614250132, 16397885158502248985, 1407236965451031446, 7800595096011710855, 9403004147208138835, 9997729556720517342, 8534668514381008137, 9227268528750758459, 13403671598326027744, 4715851494578741692, 2189528202978614673, 8567186243928218861, 9297942977636733700, 12120305129322824184, 16911451126764050505, 8250812173422443178, 10259824399772380043, 14694981892968238671, 485814636516518185, 14546030952858743710, 17545164675990066495, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 595597012989057195, 2376871353626003378, 17667748366842763551, 1405929090442079600, 18135181650619726914, 7403637996862883832, 5964686311110162804, 203041400479358567, 3387955851036204878, 2169976152805477386, 15733337581560247916, 7104142523828512918, 11829327565897640936, 816639760928622921, 11238339345191818453, 11391625709863387987, 6031165808075129231, 10104077332067730329, 6839520087480516521, 14155312441647748702, 4167237297971124611, 4042518115334572170, 7632437875765360091, 10425826042851550943, 10797236500243700589, 17846423932362838045, 11994705126716395168, 1154262141907751651, 15744039038114735423, 13449385390195333360, 16051125308748956016, 0, 34, 9168769012195838974, 8757246072351383525, 15819587373362991575, 6330331124468459419, 17594449485955496857, 5094615699180819390, 10468588157075103568, 17500241837984025274, 12590769989805218521, 10257339134394161483, 6020533408585278677, 9887559600989616103, 17174772404727048357, 8260989830322406645, 15331894718426588199, 13817494132369433237, 7270842089806116389, 14464987003178196376, 12856235623981550070, 6446968933011398838, 4625298604721424009, 7537989708572581312, 8773062848621227780, 7997392847552644982, 12295542285792207282, 2236820296563710856, 6411496154095679628, 96618257160083950, 2708395562256972928, 13820925760592258770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(11) }, program_info: ProgramInfo { program_hash: Word([12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 12, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 1, 0, 0, 0, 1, 0, 0, 5, 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, 16, 0, 0, 8, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 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, 16, 0, 0, 9, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 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, 16, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 6125088443291536169, 2665390174743669239, 18009389558374812227, 15789153556893733830, 16604794485775028126, 15433589206667095645, 1379414419793409060, 17545164675990066495, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 84, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 2384716068805359876, 12459739889109502988, 11007533278239168078, 5187224287159924757, 9045462722956532208, 3516218181999416212, 6601699247185721889, 16051125308748956016, 0, 0, 1, 0, 0, 1, 1, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 5256913258227871425, 17100537000217132265, 10362535235958450122, 6599190416745833044, 5450578834500306709, 1539493896147927159, 358459342719025633, 13820925760592258770, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14059267169109730234, 15833028045737259664, 4457596741936238930, 8186419089203192999, 13502722698945446624, 16864340361327671903, 6567391571487826395, 13313027311321423572, 946461078672821334, 10841411014448826746, 8422262931452347509, 9168769012195838974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15746924929585133009, 379315838026506093, 12529581077675993243, 15318603549361168513, 10582364865337924932, 2636070061904000825, 5204289601743072522, 9192034959170904294, 16281780351388912901, 10924324070009278511, 13885570107923725144, 8757246072351383525, 1, 0, 0, 0, 1, 0, 0, 0, 0, 471985631500087772, 8581974592770288933, 303974201734355881, 7911471416782656233, 8264438684589566467, 1539270658943308645, 3431536436519013066, 14701500658652215925, 2935418863412242354, 4390811061445162297, 235244799151795110, 15819587373362991575, 1, 0, 0, 0, 1, 0, 12803581155021505789, 1617229089722186747, 11821086028219467787, 16946433723443173275, 17442451301272882541, 13345903392866909652, 14239435248344205979, 7775924941916048886, 8663103496298937284, 18098398151169262506, 3854356596578551734, 14713353090133347394, 10665404042695900090, 17975760300270072840, 6330331124468459419, 1, 0, 0, 0, 1, 0, 4117165326757319536, 1434871395181292700, 5147296384675574401, 18402496786565368100, 1541891846645406613, 6608322246477847509, 113263425049039362, 14624701183045087851, 5418421295167202847, 9902960937688969164, 8526809416150489728, 8319785044806982194, 15369021590994653978, 11260622121353286786, 10468588157075103568, 1, 0, 0, 0, 1, 0, 10779284519276237242, 5207917218557150537, 17102744930422995322, 7881354678273462636, 9096730616149686024, 8889792067304111866, 17358468187481791647, 12209401598010007429, 10326065236143981873, 259487815978835763, 2939637999200097803, 2244733962249620937, 7652640894347806080, 16601834208041636644, 10257339134394161483, 1, 0, 0, 0, 1, 0, 15007735984166481726, 2893692142669467166, 5586756186106745240, 7881520773741268125, 1119526938685078607, 8580323529307502020, 1868806426895026968, 11046353624103181594, 2355139499180822246, 13294225392413433281, 8555475415255527439, 5921002467687226204, 4047796662675347846, 2612703737764640459, 17174772404727048357, 1, 0, 0, 0, 1, 0, 11641703905547654953, 13518861492744284220, 13602438854947769427, 11440521690988525934, 1858131981777548381, 14683551372837095812, 8741184015917561905, 4381652925229768341, 3668923621194401622, 8742633689618768661, 17171454789201612359, 17386925554974145101, 6224704259817574157, 14396227383672448392, 13817494132369433237, 1, 0, 0, 0, 1, 0, 17007411413036910904, 6937272254859089520, 3345146633011014675, 16854936978988550164, 4472804247539583969, 11270159100715194202, 15367181090448289261, 1868429356172715569, 3430895131654614161, 1015593294205135440, 10191353484336583572, 8582026933349467190, 10834199646006576067, 15953404371899770169, 12856235623981550070, 1, 0, 0, 0, 1, 0, 6583655571084272508, 1064174383094762843, 14004531006300423026, 11420674364099598202, 8460103377465445883, 10804815118997327370, 7301079719327054003, 4877497612363750655, 14559648290526166949, 9120291006888379304, 2115641271859045975, 16434619985909351985, 12242894720083399562, 576711179775643850, 7537989708572581312, 1, 0, 0, 0, 1, 0, 9177904733833547672, 0, 0, 4263756598719013378, 16645964836945405904, 1535579717520953536, 9288443086735636960, 12124737918817624189, 3028234720115016827, 6680864214558642932, 12931918488324919856, 8451565207539691282, 17045153176928915002, 10503620158827014837, 12295542285792207282, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13465875315346524402, 16176623117443515258, 208588932528011586, 17461402434481489861, 7578220797847929864, 17564919688262005304, 9600963709893327666, 11244752067809188397, 7714774968702541161, 13892339685592049122, 5442709211693844142, 6411496154095679628, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17464705757459592393, 15081244610133230814, 11685358340804306780, 10152174670869705735, 9410406960468072857, 284282844772359316, 7733975108380115257, 2111913529644288504, 14978023560208702638, 3881709886225480466, 2968563472347562608, 96618257160083950, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14751425303934963720, 6410948793715747581, 2822178276157738566, 6117144343302310887, 4811333449307081983, 7938696543505248162, 3435995547523177385, 6112640616610282754, 18014742166879778909, 10446442293007407525, 10528964699829495885, 2708395562256972928, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 5256913258227871425, 17100537000217132265, 10362535235958450122, 6599190416745833044, 5450578834500306709, 1539493896147927159, 358459342719025633, 13820925760592258770, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 1, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 1, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 1, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 1, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 1, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 1, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 1, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 1, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 1, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 84, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13247747688876077858, 1563629168745730928, 9477262435683869924, 1586451078180607598, 10199880931320172189, 12237115836192970750, 15524901873579080579, 18112581651832813996, 9554433906850032874, 5132111129018882891, 18017734206314589878, 2376871353626003378, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18204236545845216971, 4862512017968946683, 9199231093019338048, 9325815886784366656, 6982964906206022277, 13532373892635206986, 14961355291644520251, 7934301823485851614, 4012321235764609039, 8232522030470930177, 4362746362325529522, 17667748366842763551, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16083593158731167399, 1035294938480129016, 7358751435793575899, 13163107377789060321, 18160468829511284938, 11668565565569624948, 8912131487655833337, 13134589595174512908, 14967212595115142793, 2748555984042091513, 5580595613883635850, 1405929090442079600, 1, 0, 0, 0, 1, 0, 16924508715632711059, 12042164907586537699, 6879187775976945062, 4357419437649084221, 17121277837906333314, 12569972625839259527, 5998117226166788975, 13459748022261389691, 2114739335810906841, 845467818172067610, 5143267856379088965, 5983394632166978443, 15852736438270791360, 14186966130004258435, 18135181650619726914, 1, 0, 0, 0, 1, 0, 685023358845462459, 14587753177249686178, 16926803897274392790, 7975999984217399211, 8221980324343257318, 10432134440683583258, 5188984820381727203, 9448428205117043728, 9578952411771586845, 918209442918452849, 18193547062192211825, 2140629501848088776, 16659854091479845434, 10540307613825778005, 203041400479358567, 1, 0, 0, 0, 1, 0, 12541032576104625773, 16170387295460866341, 12891686882411197461, 7889055060352596454, 4403991158284421772, 1153491566876700606, 5955476415838559193, 8961849300614763067, 4327169169737696049, 15710903694873023395, 17429784608409914678, 10552757613235067722, 16332742745573253042, 9544366711268571215, 15733337581560247916, 1, 0, 0, 0, 1, 0, 18167944694759834272, 12663738219026080288, 12343732554083789364, 10296105519823441978, 13052305487168984918, 6340590356564925801, 13637649140457772157, 17666409503469399853, 10474171567958477310, 16794196935209020317, 5437598344549503419, 8538471352201975220, 5680967626748162975, 16022817295707876509, 816639760928622921, 1, 0, 0, 0, 1, 0, 10492313957532501655, 17437594987253247748, 17921559395393369208, 13275897735411980967, 8123717249091864283, 8278469467176979574, 2032050757569801828, 11693451034972088239, 2067286230266639471, 6815831073966054431, 14661239785476454049, 1148470236137421383, 8017806737059891905, 332425507059551196, 6031165808075129231, 1, 0, 0, 0, 1, 0, 3252881356430421557, 4587003287498047415, 6869066489621458415, 4028816571826363002, 2083501518846346052, 6710003146178124596, 7820237015849984079, 866468160396608077, 6622135657383660119, 7891509834730356602, 8985292275604857439, 14632278337044440617, 1765857304688336746, 5135102707173364321, 14155312441647748702, 1, 0, 0, 0, 1, 0, 15822931891080832543, 8232418911131413437, 13767571106456033164, 15475498524455915389, 18315976927222050841, 11273188656572444234, 7746677489393361812, 12005877568613345660, 813491835360077960, 15303933786232509118, 12912789541737329022, 5696241881348246065, 595269491299106953, 426018854260317513, 7632437875765360091, 1, 0, 0, 0, 1, 0, 15885522252972164471, 0, 0, 8883008337890476036, 7777530579170086866, 3764388601356982695, 6142067256785271224, 12806387721803954058, 8848575890036236601, 3878821330615144039, 1232238311229055715, 13300309889942581843, 18004816485425051763, 14542650836653761124, 17846423932362838045, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14581052801302714514, 4106083518382761605, 15563655808705061071, 14737929225229310854, 8854457266879028181, 7028466390812097322, 15839551803056895538, 5422499495491255741, 1639569934817636487, 17541610204110287382, 4457636384061007994, 1154262141907751651, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17999554639252319772, 3917672276375751396, 5533608926617884295, 17685816709290022661, 9558115804602486754, 8403721226663073636, 2863101478933748100, 8009273299237215820, 17233518173045382262, 7370145379849234412, 2416704573314226662, 15744039038114735423, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18022889162320300611, 667054191578263747, 14514898346462505299, 5568614684720127113, 6487880825188915613, 8970732296705167988, 6867483661888889167, 13359803287975487032, 14413924905126977169, 11764023996857035803, 914323423605581375, 13449385390195333360, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 2384716068805359876, 12459739889109502988, 11007533278239168078, 5187224287159924757, 9045462722956532208, 3516218181999416212, 6601699247185721889, 16051125308748956016, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11629723830403400020, 7555819500301263096, 1908428216714745226, 18296820143542754124, 5022880593775506902, 12438672130810751909, 9942094792989095510, 10242077034078069399, 6534480484041428863, 1267311017976162806, 7398379382324753631, 13467318737723490903, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18085092721393681494, 7871576915936585054, 2226486931669462500, 5759648439566973806, 7356080910092118039, 10240118010240816453, 18239658104155677632, 6920809802339641674, 3251048018398498863, 171317623411600853, 16529615322051348437, 18417997150771375303, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5334827122981806215, 7738161198426062879, 16096322966046779578, 7690180744863199464, 16589884839242022257, 12454995736750842450, 3247221802734244696, 17643499204383222535, 14672293546278713057, 14846028244624432327, 17750754114621262532, 7719389523268106465, 1, 0, 0, 0, 1, 0, 14999821401736289617, 15448865933229589054, 13583843693540182696, 18131418839636252978, 4439752770537371709, 5448090446075942959, 6255055536007924620, 8919754405551141869, 12272610174663972685, 8138145110381489386, 16688592460292823795, 16728924149188845306, 5697605161887258162, 3376246851343252040, 2784882046013758615, 1, 0, 0, 0, 1, 0, 14635509374075973423, 12677010964369607514, 8962420667996168153, 3843332007587847712, 8114913103795360695, 18236464326626014645, 3970724348518176437, 1189869440416317038, 9344021820453066790, 13363880742094688735, 1827636079652666195, 8277248794545234814, 17428436932452366793, 10370890449220293026, 10938440435726947483, 1, 0, 0, 0, 1, 0, 7061896277845699344, 1873336673338143769, 8446543978270747820, 133391072621725577, 17840970837055628605, 7355089244606367886, 8497160540604180804, 3063592889799439815, 7982818396816137943, 9226283480795415930, 7777539981955361461, 5304102959326456112, 18287702590376570538, 1433120707818296652, 16923840111614250132, 1, 0, 0, 0, 1, 0, 4447115381548236223, 480042594266264640, 5488247032936248678, 4078804678813269002, 8930953641447820548, 782991345573128788, 8712431777609915948, 815213714413043438, 14730751205912092663, 16932487676782686187, 2461265848652382458, 11611317382660466625, 15533043966546096492, 13503968807830695383, 7800595096011710855, 1, 0, 0, 0, 1, 0, 6709571999678684256, 11804490432649482304, 5849114674484871556, 10348876437499804673, 1537331530871119668, 5444667365009856158, 16603575236790899764, 8569284627647542389, 3352703426322824443, 1135364094435597517, 4311636691398707716, 2791259658093074998, 9812515853737376613, 2051419284241394287, 8534668514381008137, 1, 0, 0, 0, 1, 0, 2787989614403510536, 6304392612397259174, 9351992476691347166, 13735545676744754358, 18158002788694963974, 6385821061540880880, 10648493462065257860, 17214386397833253270, 1785076194951656280, 7852757539889945333, 14107503556614837834, 3545073666350874448, 9332017051661502953, 9974196014981023153, 4715851494578741692, 1, 0, 0, 0, 1, 0, 7775468742954420419, 17692887772382430342, 9705826033582956692, 9410850814958744902, 15848213422225602213, 8831024347202442032, 5730064365163707705, 5744303806832189345, 12701095265259304800, 1274251095252206369, 12500666959478542023, 10971920968668641865, 4083552985517123622, 247517241416190936, 9297942977636733700, 1, 0, 0, 0, 1, 0, 17152107383937626708, 0, 0, 9684778724196116231, 18144229372703820177, 15267089652751109873, 4559302720015817859, 75478605149737153, 10397456717804752138, 12911489632740586743, 9045450374393109306, 9884965742324813117, 13871430865741604308, 581610329922371147, 8250812173422443178, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5677068088590394277, 420461259745383997, 5461641667913740527, 12375228725744876260, 10408597074326334289, 17926066510128935923, 11042755251558401992, 16568845003086625163, 16445466086575260512, 3993419962022258191, 5798502399718959312, 14694981892968238671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13067481717060632118, 17094012225747072853, 4977882380646661156, 13367890413392736054, 1854469405851562328, 1264814027228690376, 1655214279385078584, 4695178656129701184, 14688957924306712254, 6722743736070459606, 5346182502077854664, 485814636516518185, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17366862825980504064, 16556024871956851478, 5148753722704728721, 15438373163420410642, 5120877191992423544, 15123699931666188121, 17558359767143120899, 1678315832465296045, 16306354913676224825, 1297747773924291443, 14220066076326577834, 14546030952858743710, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 6125088443291536169, 2665390174743669239, 18009389558374812227, 15789153556893733830, 16604794485775028126, 15433589206667095645, 1379414419793409060, 17545164675990066495, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(11) }, program_info: ProgramInfo { program_hash: Word([12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 12, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_04.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_04.snap index 31dced8cf9..04ad908689 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_04.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_04.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 5598651459581075585, 8, 0, 3358534066525179769, 13620833136975709089, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613], [18375473735916206629, 0, 1, 1, 18375473735916206629, 7804753453550466256, 0, 65, 9365253138981608257, 2256486347761721492, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099], [2105717247508690050, 0, 0, 0, 2105717247508690050, 17777748786253636403, 0, 0, 4243893038989355703, 5193960644663470490, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350], [1679902783560062568, 0, 0, 0, 1679902783560062568, 9435312778805252724, 0, 0, 2372900269115514267, 12344784587178360875, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526], [13620833136975709089, 0, 0, 0, 0, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2256486347761721492, 0, 0, 0, 0, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5193960644663470490, 0, 0, 0, 0, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12344784587178360875, 0, 0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 9999, 0, 0, 9999, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [9999, 9999, 9999, 0, 9999, 9999, 0, 0, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 11091832976040936962, 11629723830403400020, 18085092721393681494, 5334827122981806215, 18131418839636252978, 14614347609195626268, 8910439294593611592, 3843332007587847712, 1023179011544432384, 3804737116729640404, 133391072621725577, 12470388296134501021, 632583774013957871, 4078804678813269002, 4646445037357820970, 12451999842825777859, 10348876437499804673, 4709521304751214351, 3818143376057959690, 13735545676744754358, 5911009352187537543, 11554714135033312948, 9410850814958744902, 11602211351055880832, 12661500893159548834, 9684778724196116231, 18082132319471479459, 5677068088590394277, 13067481717060632118, 17366862825980504064, 12752059346458920613, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 5598651459581075585, 644336023812026221, 13247747688876077858, 18204236545845216971, 16083593158731167399, 4357419437649084221, 5464680208294216350, 2779149829283345558, 7975999984217399211, 3799311940445025695, 12287115722151291956, 7889055060352596454, 3871221682982067508, 16266218633314388061, 10296105519823441978, 6482329477820286957, 2184206139900597012, 13275897735411980967, 3045004919428473516, 16702736287849627035, 4028816571826363002, 15011221569533006108, 2864985628223798368, 15475498524455915389, 5364573001665328907, 10397611698676440611, 8883008337890476036, 17315153826736218240, 14581052801302714514, 17999554639252319772, 18022889162320300611, 13620833136975709089, 8, 80, 16253482711025978099, 16690839578921925157, 11755424915479552417, 17934377671577204140, 15509754874715907467, 6426721221030580337, 11049594146888643723, 14912334368661229147, 17657273147290084056, 9105126057127804171, 13430225876739607206, 3614830725909060912, 14569284676797348998, 4705513459362295944, 424917224365117418, 2835737623710330612, 1964100172858915134, 14896843043547784767, 15482419984058848245, 18437547705335910066, 3162257106529980441, 5297995970636059087, 9661978795293871188, 10128143329575104151, 770728251595531533, 9782965673735423214, 1347942901513492691, 12086966446141742548, 10239457018222882008, 3358534066525179769, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 4371092720588693207, 7555819500301263096, 7871576915936585054, 7738161198426062879, 4439752770537371709, 3239157867226066300, 13695428956813660853, 8114913103795360695, 3271513559100018830, 1227622944719103238, 17840970837055628605, 967816437372899090, 1525132029610696618, 8930953641447820548, 1991652128187274521, 1878310895470329371, 1537331530871119668, 17179845365129498366, 6628846356810584866, 18158002788694963974, 8030209565693857269, 16465976624819029473, 15848213422225602213, 16693748147017299005, 15158850031902933967, 18144229372703820177, 8111553228231189401, 420461259745383997, 17094012225747072853, 16556024871956851478, 18135096529078946099, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 7804753453550466256, 10860407685663036604, 1563629168745730928, 4862512017968946683, 1035294938480129016, 17121277837906333314, 7566123129055455762, 801761918673301233, 8221980324343257318, 8971289227653573810, 14503443403830829887, 4403991158284421772, 3539411744559999519, 17877470569230350231, 13052305487168984918, 11988250928057152362, 7990654922366982189, 8123717249091864283, 273044411934894184, 12617346169478402785, 2083501518846346052, 1182260721753268305, 16655426125402668777, 18315976927222050841, 13684207927534177805, 15562831278015850283, 7777530579170086866, 17762371058211819624, 4106083518382761605, 3917672276375751396, 667054191578263747, 2256486347761721492, 0, 64, 5751576643258238090, 7830268710878889486, 4868320831660690795, 7042762868047858013, 1028615964620729689, 12270587957620579653, 7267371538363991280, 16125626865182516658, 16950134439933558852, 13427183447069512151, 16117382505273595827, 2222792985740553749, 6517696895688418945, 15516128650333221731, 6357034143715229949, 12960707821770488929, 12451444460344609421, 8786747128188560390, 7634329044629047826, 7741107824034642016, 10975559322169081956, 6007758954686348362, 13971256108093330407, 16868860295450858142, 434120282701603474, 11571634562637977474, 5581285869985960561, 6581368197537384623, 17661012293298952642, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 7371349600976768903, 1908428216714745226, 2226486931669462500, 16096322966046779578, 5448090446075942959, 10098429045835473018, 4809915777199041455, 18236464326626014645, 2690803580142520255, 1917959726470568181, 7355089244606367886, 9988016662047687018, 6075081950126577031, 782991345573128788, 17727121868432118686, 616586521336426688, 5444667365009856158, 3285592017878659318, 7931583655659423496, 6385821061540880880, 8735792590442216465, 11893401421408965, 8831024347202442032, 4451634306410080384, 8173507753862756681, 15267089652751109873, 10164019920559079526, 5461641667913740527, 4977882380646661156, 5148753722704728721, 13200399719329805350, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 17777748786253636403, 12906637371964794665, 9477262435683869924, 9199231093019338048, 7358751435793575899, 12569972625839259527, 5847320563034378965, 7599987891632365696, 10432134440683583258, 16242679258308055777, 13780789328607365793, 1153491566876700606, 13641042641136958279, 5969854971149325760, 6340590356564925801, 9771444654514086827, 15776260062082886705, 8278469467176979574, 16237604982476195391, 7423750977119185664, 6710003146178124596, 376186270665682407, 15539788083889931684, 11273188656572444234, 5199551304380116153, 11734010025122035435, 3764388601356982695, 11644487560172946408, 15563655808705061071, 5533608926617884295, 14514898346462505299, 5193960644663470490, 0, 16, 7110029021941723513, 10115409991715085575, 11428668827299215140, 4015039023438705588, 3732466887400149035, 5870841944205588609, 8421627027326523148, 8231214549142439222, 10318470559229280016, 15171283498151438808, 12477430934852872037, 3853779543897991795, 14662750186533371679, 7423988381383082226, 13549468426633458145, 11079168775731474830, 12471207782095033761, 17595325414333663547, 7042468264080735391, 17650115337646869205, 14946074228061446423, 4655654314239637986, 11187552516160183253, 18115881480442018545, 899748567092010447, 14020868337400209874, 15417366235984526759, 3331301994171189600, 15814677761660135474, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 14926961084296668554, 18296820143542754124, 5759648439566973806, 7690180744863199464, 6255055536007924620, 9967438444965419122, 6053822608871655533, 3970724348518176437, 6498891217103059128, 10341231834356228091, 8497160540604180804, 5144558705352378414, 5437844264442299443, 8712431777609915948, 3915629295644008966, 1353567482375898210, 16603575236790899764, 17009424079525297171, 3253699369098499458, 10648493462065257860, 10940203220400825059, 7261956826490066834, 5730064365163707705, 8826144244207679463, 11688897202604808409, 4559302720015817859, 4402707951554525697, 12375228725744876260, 13367890413392736054, 15438373163420410642, 905179285088193526, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 9435312778805252724, 12594665258064570661, 1586451078180607598, 9325815886784366656, 13163107377789060321, 5998117226166788975, 7008390784506277276, 7362390315901265787, 5188984820381727203, 5842708215320867131, 13553650342229414448, 5955476415838559193, 8725164908673674579, 15174091024100472501, 13637649140457772157, 16186415272190469176, 4473737633571089105, 2032050757569801828, 16070334483916823186, 7382925316452200710, 7820237015849984079, 13711104951459639694, 15277864807184951074, 7746677489393361812, 10897962020578390602, 2459478953251166639, 6142067256785271224, 1469990404519833898, 14737929225229310854, 17685816709290022661, 5568614684720127113, 12344784587178360875, 0, 16, 3208043314804619251, 6920597847411412414, 17985619796195836408, 11907191178709112742, 16377455862733420451, 15572876043608056600, 9466912758182965715, 17480763791598773801, 15029113851915312964, 1953587265841775225, 7175742902791404624, 6820764940134875350, 16069841829669607101, 15548451706938320654, 11760680638795846495, 1560700914733041660, 762367990279432470, 2603436428456411224, 6200990949184863170, 11673627333152839295, 7804486006334068097, 1006207264024395366, 11193609705356653459, 5704515878100803393, 14918729158665343812, 10658508130485449873, 380737719356524599, 12870561906904032245, 6984680585936259437, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13620833136975709089, 1046930547281056921, 5022880593775506902, 7356080910092118039, 16589884839242022257, 8919754405551141869, 782951559730000700, 4320210530167177353, 1189869440416317038, 11509478421996896286, 14131663596834904750, 3063592889799439815, 8310309385140170305, 9794866582382956591, 815213714413043438, 14909022885730690459, 1965134134848901020, 8569284627647542389, 11756365299450742783, 17765218832065923306, 17214386397833253270, 8857548797279425296, 9589793731564825353, 5744303806832189345, 9245523889540971217, 17743277714115543370, 75478605149737153, 16642733757618334231, 10408597074326334289, 1854469405851562328, 5120877191992423544, 6125088443291536169, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 3358534066525179769, 2539641719046213719, 10199880931320172189, 6982964906206022277, 18160468829511284938, 13459748022261389691, 8540403463779371619, 298971077135778992, 9448428205117043728, 7211550496031219820, 5534997352008564058, 8961849300614763067, 16471253951712069551, 11996630593586982068, 17666409503469399853, 14743209389502972128, 13621451519455201128, 11693451034972088239, 376126037836000660, 12412096817616379990, 866468160396608077, 16487331493773223294, 15132792027965031247, 12005877568613345660, 5222840910814569167, 9174906967528115515, 12806387721803954058, 12420516276683200334, 8854457266879028181, 9558115804602486754, 6487880825188915613, 2384716068805359876, 0, 40, 18130890293586930078, 18252951749527557342, 4460903658820341507, 859505755654562117, 5961685480015386121, 12134776249586726543, 11174658189737631113, 18385152961050631924, 9881471501704199804, 9636744945302995714, 12323181865658998064, 14903454669611502952, 1490539036394497080, 11688514875590095153, 16093513520259190726, 7731471377060742735, 5247500963110975116, 5269361527156951110, 13733877647296302634, 11865469401112846356, 7643242142337524006, 15572658687280648106, 9345628789826937825, 3291248301730279223, 16808111015808513609, 16274730253017522022, 12243901590027926887, 6559275936659510680, 17224785255700525855, 1390310476158884261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2256486347761721492, 1399831673864751627, 12438672130810751909, 10240118010240816453, 12454995736750842450, 12272610174663972685, 16716772686788009039, 17679411248915786729, 9344021820453066790, 15548275238570617018, 12554227251830406338, 7982818396816137943, 8298623838207759766, 9667670442404470529, 14730751205912092663, 17475545646146195192, 7561186990159804961, 3352703426322824443, 11124655848983105243, 7361271662241444721, 1785076194951656280, 13323648175345935378, 15598576959546342188, 12701095265259304800, 3219799610745612107, 1555585114147558761, 10397456717804752138, 2319272066426069991, 17926066510128935923, 1264814027228690376, 15123699931666188121, 2665390174743669239, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 9365253138981608257, 9113412038486870510, 12237115836192970750, 13532373892635206986, 11668565565569624948, 2114739335810906841, 16845938989106496862, 18053472495070906903, 9578952411771586845, 2253954535466549551, 11957330595594263589, 4327169169737696049, 8097241277176222682, 17499521208876685046, 10474171567958477310, 2884885063912824473, 9389176041985146128, 2067286230266639471, 3365016398014065199, 738171567486888734, 6622135657383660119, 4978858449337102663, 1252098561428724852, 813491835360077960, 3026073706021528936, 1157174472277816506, 8848575890036236601, 4801870550462804365, 7028466390812097322, 8403721226663073636, 8970732296705167988, 12459739889109502988, 0, 32, 10452764368937945515, 6969997263492352670, 15570786589164252178, 16136993048454358354, 16378352067056606124, 11747573379431147483, 12296464969648251345, 8155132212936940581, 2470200969414032680, 18126939303114916528, 16736276280592238734, 15549342782445497049, 9033882039108268313, 5121596298161079296, 14336897502470956191, 6301009824137139871, 16614860627935231068, 10383378433371415142, 10330363517752279308, 10937466001850040595, 16305844076412050396, 7189713532379018536, 7568236447715590536, 10805187342082326609, 7424874700566577356, 13861219118264849665, 7052270251739242825, 17586339544079318164, 14071176523136369481, 12282546735285148319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5193960644663470490, 18378615377082669582, 9942094792989095510, 18239658104155677632, 3247221802734244696, 8138145110381489386, 8305898108846284300, 4495835739545312127, 13363880742094688735, 409501507955448067, 9615046049029083973, 9226283480795415930, 6188039948757326954, 1925348622523205808, 16932487676782686187, 6461440512631901369, 6379521145060545439, 1135364094435597517, 6898694641523826133, 881111998832614715, 7852757539889945333, 8831210118957475983, 15508177777761403707, 1274251095252206369, 6462015026972174497, 14758961666322366163, 12911489632740586743, 10573355084806673526, 11042755251558401992, 1655214279385078584, 17558359767143120899, 18009389558374812227, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 4243893038989355703, 8922317147540258079, 15524901873579080579, 14961355291644520251, 8912131487655833337, 845467818172067610, 6513419642881984303, 15821388348544564061, 918209442918452849, 1771868273093277971, 11088759444000251587, 15710903694873023395, 7739199555620722590, 403122127909161589, 16794196935209020317, 420049465494673582, 3241180689003955516, 6815831073966054431, 13165955590245083084, 3933813014659210303, 7891509834730356602, 14572658037405460796, 18097121197159342726, 15303933786232509118, 6355852571927224576, 5965705308661034968, 3878821330615144039, 17609259256248013285, 15839551803056895538, 2863101478933748100, 6867483661888889167, 11007533278239168078, 0, 8, 9114363797835460134, 5446076396314160376, 12863008906537145423, 10008421878335836436, 9952321233871043669, 12872379155893703237, 7266552182027361169, 1266036355585216796, 2621902104176569009, 8791105532651972211, 6351975813451610601, 11821139808280113179, 11281913023757770338, 3277134497757048289, 13219080767636598429, 10181825490691565485, 2766637533497216499, 5527857141123489970, 8463471033597650592, 16863468430858262436, 4521466714741486225, 2112404415880305855, 6776665887355979100, 4283028800297139078, 17448147405455891940, 2672696094870261596, 654959311657763753, 15404879372302137522, 458610335793450516, 11708893791522292939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12344784587178360875, 7525588297109292118, 10242077034078069399, 6920809802339641674, 17643499204383222535, 16688592460292823795, 3252667668159125426, 6639040797936707465, 1827636079652666195, 2462138615393893213, 7273091941301037907, 7777539981955361461, 17791722127119122070, 13941030348836860953, 2461265848652382458, 17178103242399629259, 12982591110459702249, 4311636691398707716, 11830890166127089072, 7160199109027716330, 14107503556614837834, 6316368550299988901, 12988322271117575851, 12500666959478542023, 4763644307980385379, 17502332825869685988, 9045450374393109306, 7379498771612731567, 16568845003086625163, 4695178656129701184, 1678315832465296045, 15789153556893733830, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 2372900269115514267, 7638869850317184909, 18112581651832813996, 7934301823485851614, 13134589595174512908, 5143267856379088965, 1385332020236631836, 4877336193186145990, 18193547062192211825, 4615765459892113834, 3381950137508436504, 17429784608409914678, 14977580224084415767, 6849317271519196447, 5437598344549503419, 1906047363049945529, 5004054537041877249, 14661239785476454049, 10553785792947774039, 2119915982392644589, 8985292275604857439, 9726386267280827154, 4505582310884934806, 12912789541737329022, 7115507662283435621, 2051190405167774802, 1232238311229055715, 220176432091768973, 5422499495491255741, 8009273299237215820, 13359803287975487032, 5187224287159924757, 0, 8, 6104172690014223231, 3119855977255645286, 2700229040680838768, 4228220371303630837, 12976691418076017877, 15391527008624099592, 15522155400452634037, 17655908650961725957, 5157987610310047621, 13664486701019622043, 12908699189677656287, 14840926611057477527, 6092037682822283700, 15181448373122947619, 2083722204849270202, 1893419523737526751, 11329911669537538562, 12331432886354737271, 9636585409664050258, 5131588463040403759, 10248116973079783912, 2136665268102207704, 17448444978654544666, 11945433761064128885, 4462464721020457233, 17579935132869425842, 7098417589530391109, 15343623253038912080, 7762335122892638892, 10310226363807226654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4046254507773998773, 6534480484041428863, 3251048018398498863, 14672293546278713057, 16728924149188845306, 128728647106458681, 14226927580887823496, 8277248794545234814, 4354566838645069185, 16178613916401188944, 5304102959326456112, 9791457517463513797, 10245170831782510809, 11611317382660466625, 13569694221132024345, 16005837490233273516, 2791259658093074998, 13441513594234320689, 4241376053954359578, 3545073666350874448, 15186107276182512091, 10698815982870498162, 10971920968668641865, 9145865124167298835, 405811361541120846, 9884965742324813117, 2876689281462596902, 16445466086575260512, 14688957924306712254, 16306354913676224825, 16604794485775028126, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 1061325914286080764, 9554433906850032874, 4012321235764609039, 14967212595115142793, 5983394632166978443, 5809835498849113816, 6561933873120105870, 2140629501848088776, 6712525834006528890, 5760623808290856282, 10552757613235067722, 1939309373056894313, 14427320366022536141, 8538471352201975220, 14188752564290255096, 7981877957758397164, 1148470236137421383, 11019464818805406210, 7769960423081990191, 14632278337044440617, 849771658931440922, 5632784009618830911, 5696241881348246065, 1879984915784172244, 16312530632323862580, 13300309889942581843, 15448409017348426344, 1639569934817636487, 17233518173045382262, 14413924905126977169, 9045462722956532208, 0, 40, 1560947813056021755, 6935064976442414148, 9999441144135002932, 10354700837586583171, 6040781227937012106, 4698117391978117444, 4735711626023545756, 11217844833019453026, 3130590714605394722, 2809204122464618686, 10935232469327759448, 18335893537613898174, 10868401885487323501, 15799177281014635734, 17187052562019754838, 4027411046406207040, 11879721967266924677, 3613659344771632047, 1846469577394958972, 14668357323201408029, 14939045883642543835, 2885718226990976376, 4969257074069595075, 10824274197210729467, 13212275138420405274, 10563919532671437398, 12234598862193668129, 14653607410806008848, 2498958194485300229, 3512215170452429648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 8072556154622677081, 1267311017976162806, 171317623411600853, 14846028244624432327, 5697605161887258162, 6090204166740560590, 11791493563989406548, 17428436932452366793, 5676009947455004918, 18345317182680976060, 18287702590376570538, 4985574569677261947, 15947076302058294771, 15533043966546096492, 13147369042643698626, 13830067522797295398, 9812515853737376613, 1153576568012481332, 6976086965219136352, 9332017051661502953, 11709096929003024091, 4784660881537662841, 4083552985517123622, 9895527598631437834, 3406650305555277621, 13871430865741604308, 2950941648901088194, 3993419962022258191, 6722743736070459606, 1297747773924291443, 15433589206667095645, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 84, 6657939908049969710, 5132111129018882891, 8232522030470930177, 2748555984042091513, 15852736438270791360, 3031910609778633238, 10165962755900271710, 16659854091479845434, 17343121214427119893, 854734865188827599, 16332742745573253042, 719106832906440841, 5187730385273117170, 5680967626748162975, 12443929595174060051, 6984107838208124669, 8017806737059891905, 3253255241682497310, 17244932564674349345, 1765857304688336746, 6104054101040517608, 16644020687030024364, 595269491299106953, 16831646467700047759, 6176340855571448766, 18004816485425051763, 4101389897636298429, 17541610204110287382, 7370145379849234412, 11764023996857035803, 3516218181999416212, 0, 32, 9302012295643728416, 424328237663665361, 17748121622218558811, 6681769685034042719, 10907932526941371789, 14996603190997478665, 13982878080104642188, 3336783822228111865, 7403528606603453519, 7309352233404946366, 11509327586943808925, 6803943428138467537, 12870260590513220077, 3798257798625653324, 15652192157997003684, 8260391000410661595, 9099897743400681933, 16067207775248165408, 7640841583197908852, 16739199083410292994, 1998275509994500625, 10688417071827877337, 16160081185811655577, 2725954513011781037, 3040692668058239811, 15097072321276989567, 7813293313258815644, 15261763399945716285, 2258772319189190202, 6756061023037720295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 14732236349158007950, 7398379382324753631, 16529615322051348437, 17750754114621262532, 3376246851343252040, 16812742874230723382, 5497427090926806167, 10370890449220293026, 12072808913033091146, 3773065747435304139, 1433120707818296652, 12602993390877629622, 11873715535213483733, 13503968807830695383, 1548449854272693349, 2164072014511735918, 2051419284241394287, 7675966884444101274, 7631305566403533669, 9974196014981023153, 16049335883858064137, 2471757314515864029, 247517241416190936, 17714417256089308015, 11671008027458954016, 581610329922371147, 16154960330167538938, 5798502399718959312, 5346182502077854664, 14220066076326577834, 1379414419793409060, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 13425232862973212691, 18017734206314589878, 4362746362325529522, 5580595613883635850, 14186966130004258435, 12558944767443104505, 9400104492160547353, 10540307613825778005, 16337971251965072535, 10106057436125976033, 9544366711268571215, 5728567960549491041, 13778603290469351967, 16022817295707876509, 11816634839594428392, 1619816382417214775, 332425507059551196, 5638968861636104000, 13036766990591622942, 5135102707173364321, 10242389681667623919, 5777720311941164202, 426018854260317513, 11718167143057109482, 13648951505177506250, 14542650836653761124, 18018546562218872798, 4457636384061007994, 2416704573314226662, 914323423605581375, 6601699247185721889, 0, 8, 7519454690376123692, 7627104070861575574, 17604686071836489236, 14277148259130460564, 8312218486680706135, 8395439642754559152, 17307771294890409643, 9298206908486537717, 3027629924013931359, 2933551330348935458, 1450485994192951386, 8585052201707081835, 10624425952582111111, 16773523322999621677, 13337622149287916761, 17874287708894504070, 14164897610403484003, 11216401648549709020, 911970190394256131, 3202853507803349037, 14616902435260689479, 14924823153427050614, 4881022900440414264, 9723366934152472594, 16335725686098559697, 8087897843744270993, 11437013713086863200, 7627258546495067733, 18044191572661655945, 16490279521751489469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 7484183127135320340, 13467318737723490903, 18417997150771375303, 7719389523268106465, 2784882046013758615, 12479320332521777529, 17052932344949276269, 10938440435726947483, 3905086412998728873, 15634495878209337408, 16923840111614250132, 16397885158502248985, 1407236965451031446, 7800595096011710855, 9403004147208138835, 9997729556720517342, 8534668514381008137, 9227268528750758459, 13403671598326027744, 4715851494578741692, 2189528202978614673, 8567186243928218861, 9297942977636733700, 12120305129322824184, 16911451126764050505, 8250812173422443178, 10259824399772380043, 14694981892968238671, 485814636516518185, 14546030952858743710, 17545164675990066495, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 595597012989057195, 2376871353626003378, 17667748366842763551, 1405929090442079600, 18135181650619726914, 7403637996862883832, 5964686311110162804, 203041400479358567, 3387955851036204878, 2169976152805477386, 15733337581560247916, 7104142523828512918, 11829327565897640936, 816639760928622921, 11238339345191818453, 11391625709863387987, 6031165808075129231, 10104077332067730329, 6839520087480516521, 14155312441647748702, 4167237297971124611, 4042518115334572170, 7632437875765360091, 10425826042851550943, 10797236500243700589, 17846423932362838045, 11994705126716395168, 1154262141907751651, 15744039038114735423, 13449385390195333360, 16051125308748956016, 0, 8, 17781582622500481192, 12847902632736061277, 12021499907877242591, 16751519355106661703, 9062087890172095618, 3834953580385337540, 2969703856153678454, 11604562295556139307, 10447912046373566534, 12987934619706800857, 12352596220492768030, 14816150974992525275, 2172600571554701126, 18086375044546604023, 16313093185369681775, 14997664071320688070, 347950016295486690, 9206182676441692601, 3566552483989599402, 4925983231752336365, 1728701557101400581, 7087476601458867917, 9759961360999781392, 12569092891286895547, 14206292953735333262, 16422952955631166803, 6294107725304445883, 9537940691512987143, 15535806100011306333, 7080716573279759555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(11) }, program_info: ProgramInfo { program_hash: Word([12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 12, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 6125088443291536169, 2665390174743669239, 18009389558374812227, 15789153556893733830, 16604794485775028126, 15433589206667095645, 1379414419793409060, 17545164675990066495, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 84, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 2384716068805359876, 12459739889109502988, 11007533278239168078, 5187224287159924757, 9045462722956532208, 3516218181999416212, 6601699247185721889, 16051125308748956016, 0, 0, 1, 0, 0, 1, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16253482711025978099, 5751576643258238090, 7110029021941723513, 3208043314804619251, 18130890293586930078, 10452764368937945515, 9114363797835460134, 6104172690014223231, 1560947813056021755, 9302012295643728416, 7519454690376123692, 17781582622500481192, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16690839578921925157, 7830268710878889486, 10115409991715085575, 6920597847411412414, 18252951749527557342, 6969997263492352670, 5446076396314160376, 3119855977255645286, 6935064976442414148, 424328237663665361, 7627104070861575574, 12847902632736061277, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11755424915479552417, 4868320831660690795, 11428668827299215140, 17985619796195836408, 4460903658820341507, 15570786589164252178, 12863008906537145423, 2700229040680838768, 9999441144135002932, 17748121622218558811, 17604686071836489236, 12021499907877242591, 1, 0, 0, 0, 1, 0, 4447686994046778179, 11785000236654418865, 10679155400143926564, 17934377671577204140, 7042762868047858013, 4015039023438705588, 11907191178709112742, 859505755654562117, 16136993048454358354, 10008421878335836436, 4228220371303630837, 10354700837586583171, 6681769685034042719, 14277148259130460564, 16751519355106661703, 1, 0, 0, 0, 1, 0, 217106376514171653, 11707313943908545641, 15092932467239161061, 11049594146888643723, 7267371538363991280, 8421627027326523148, 9466912758182965715, 11174658189737631113, 12296464969648251345, 7266552182027361169, 15522155400452634037, 4735711626023545756, 13982878080104642188, 17307771294890409643, 2969703856153678454, 1, 0, 0, 0, 1, 0, 11044550050665632476, 8958367422149199561, 16497379967830959424, 9105126057127804171, 13427183447069512151, 15171283498151438808, 1953587265841775225, 9636744945302995714, 18126939303114916528, 8791105532651972211, 13664486701019622043, 2809204122464618686, 7309352233404946366, 2933551330348935458, 12987934619706800857, 1, 0, 0, 0, 1, 0, 1877907417051268915, 6151364593092129113, 13049072304454003157, 14569284676797348998, 6517696895688418945, 14662750186533371679, 16069841829669607101, 1490539036394497080, 9033882039108268313, 11281913023757770338, 6092037682822283700, 10868401885487323501, 12870260590513220077, 10624425952582111111, 2172600571554701126, 1, 0, 0, 0, 1, 0, 10197860193367132813, 18317591232122268101, 11864893253666570624, 2835737623710330612, 12960707821770488929, 11079168775731474830, 1560700914733041660, 7731471377060742735, 6301009824137139871, 10181825490691565485, 1893419523737526751, 4027411046406207040, 8260391000410661595, 17874287708894504070, 14997664071320688070, 1, 0, 0, 0, 1, 0, 7903888723576875237, 18382523577454102436, 13167437966520740716, 15482419984058848245, 7634329044629047826, 7042468264080735391, 6200990949184863170, 13733877647296302634, 10330363517752279308, 8463471033597650592, 9636585409664050258, 1846469577394958972, 7640841583197908852, 911970190394256131, 3566552483989599402, 1, 0, 0, 0, 1, 0, 2186301169863059887, 6122215293275160143, 16696916221087249943, 5297995970636059087, 6007758954686348362, 4655654314239637986, 1006207264024395366, 15572658687280648106, 7189713532379018536, 2112404415880305855, 2136665268102207704, 2885718226990976376, 10688417071827877337, 14924823153427050614, 7087476601458867917, 1, 0, 0, 0, 1, 0, 4350099661540135647, 0, 0, 770728251595531533, 434120282701603474, 899748567092010447, 14918729158665343812, 16808111015808513609, 7424874700566577356, 17448147405455891940, 4462464721020457233, 13212275138420405274, 3040692668058239811, 16335725686098559697, 14206292953735333262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1347942901513492691, 5581285869985960561, 15417366235984526759, 380737719356524599, 12243901590027926887, 7052270251739242825, 654959311657763753, 7098417589530391109, 12234598862193668129, 7813293313258815644, 11437013713086863200, 6294107725304445883, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12086966446141742548, 6581368197537384623, 3331301994171189600, 12870561906904032245, 6559275936659510680, 17586339544079318164, 15404879372302137522, 15343623253038912080, 14653607410806008848, 15261763399945716285, 7627258546495067733, 9537940691512987143, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10239457018222882008, 17661012293298952642, 15814677761660135474, 6984680585936259437, 17224785255700525855, 14071176523136369481, 458610335793450516, 7762335122892638892, 2498958194485300229, 2258772319189190202, 18044191572661655945, 15535806100011306333, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 1, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 1, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 1, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 1, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 1, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 1, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 1, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 1, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 1, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 84, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13247747688876077858, 1563629168745730928, 9477262435683869924, 1586451078180607598, 10199880931320172189, 12237115836192970750, 15524901873579080579, 18112581651832813996, 9554433906850032874, 5132111129018882891, 18017734206314589878, 2376871353626003378, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18204236545845216971, 4862512017968946683, 9199231093019338048, 9325815886784366656, 6982964906206022277, 13532373892635206986, 14961355291644520251, 7934301823485851614, 4012321235764609039, 8232522030470930177, 4362746362325529522, 17667748366842763551, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16083593158731167399, 1035294938480129016, 7358751435793575899, 13163107377789060321, 18160468829511284938, 11668565565569624948, 8912131487655833337, 13134589595174512908, 14967212595115142793, 2748555984042091513, 5580595613883635850, 1405929090442079600, 1, 0, 0, 0, 1, 0, 16924508715632711059, 12042164907586537699, 6879187775976945062, 4357419437649084221, 17121277837906333314, 12569972625839259527, 5998117226166788975, 13459748022261389691, 2114739335810906841, 845467818172067610, 5143267856379088965, 5983394632166978443, 15852736438270791360, 14186966130004258435, 18135181650619726914, 1, 0, 0, 0, 1, 0, 685023358845462459, 14587753177249686178, 16926803897274392790, 7975999984217399211, 8221980324343257318, 10432134440683583258, 5188984820381727203, 9448428205117043728, 9578952411771586845, 918209442918452849, 18193547062192211825, 2140629501848088776, 16659854091479845434, 10540307613825778005, 203041400479358567, 1, 0, 0, 0, 1, 0, 12541032576104625773, 16170387295460866341, 12891686882411197461, 7889055060352596454, 4403991158284421772, 1153491566876700606, 5955476415838559193, 8961849300614763067, 4327169169737696049, 15710903694873023395, 17429784608409914678, 10552757613235067722, 16332742745573253042, 9544366711268571215, 15733337581560247916, 1, 0, 0, 0, 1, 0, 18167944694759834272, 12663738219026080288, 12343732554083789364, 10296105519823441978, 13052305487168984918, 6340590356564925801, 13637649140457772157, 17666409503469399853, 10474171567958477310, 16794196935209020317, 5437598344549503419, 8538471352201975220, 5680967626748162975, 16022817295707876509, 816639760928622921, 1, 0, 0, 0, 1, 0, 10492313957532501655, 17437594987253247748, 17921559395393369208, 13275897735411980967, 8123717249091864283, 8278469467176979574, 2032050757569801828, 11693451034972088239, 2067286230266639471, 6815831073966054431, 14661239785476454049, 1148470236137421383, 8017806737059891905, 332425507059551196, 6031165808075129231, 1, 0, 0, 0, 1, 0, 3252881356430421557, 4587003287498047415, 6869066489621458415, 4028816571826363002, 2083501518846346052, 6710003146178124596, 7820237015849984079, 866468160396608077, 6622135657383660119, 7891509834730356602, 8985292275604857439, 14632278337044440617, 1765857304688336746, 5135102707173364321, 14155312441647748702, 1, 0, 0, 0, 1, 0, 15822931891080832543, 8232418911131413437, 13767571106456033164, 15475498524455915389, 18315976927222050841, 11273188656572444234, 7746677489393361812, 12005877568613345660, 813491835360077960, 15303933786232509118, 12912789541737329022, 5696241881348246065, 595269491299106953, 426018854260317513, 7632437875765360091, 1, 0, 0, 0, 1, 0, 15885522252972164471, 0, 0, 8883008337890476036, 7777530579170086866, 3764388601356982695, 6142067256785271224, 12806387721803954058, 8848575890036236601, 3878821330615144039, 1232238311229055715, 13300309889942581843, 18004816485425051763, 14542650836653761124, 17846423932362838045, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14581052801302714514, 4106083518382761605, 15563655808705061071, 14737929225229310854, 8854457266879028181, 7028466390812097322, 15839551803056895538, 5422499495491255741, 1639569934817636487, 17541610204110287382, 4457636384061007994, 1154262141907751651, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17999554639252319772, 3917672276375751396, 5533608926617884295, 17685816709290022661, 9558115804602486754, 8403721226663073636, 2863101478933748100, 8009273299237215820, 17233518173045382262, 7370145379849234412, 2416704573314226662, 15744039038114735423, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18022889162320300611, 667054191578263747, 14514898346462505299, 5568614684720127113, 6487880825188915613, 8970732296705167988, 6867483661888889167, 13359803287975487032, 14413924905126977169, 11764023996857035803, 914323423605581375, 13449385390195333360, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 2384716068805359876, 12459739889109502988, 11007533278239168078, 5187224287159924757, 9045462722956532208, 3516218181999416212, 6601699247185721889, 16051125308748956016, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11629723830403400020, 7555819500301263096, 1908428216714745226, 18296820143542754124, 5022880593775506902, 12438672130810751909, 9942094792989095510, 10242077034078069399, 6534480484041428863, 1267311017976162806, 7398379382324753631, 13467318737723490903, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18085092721393681494, 7871576915936585054, 2226486931669462500, 5759648439566973806, 7356080910092118039, 10240118010240816453, 18239658104155677632, 6920809802339641674, 3251048018398498863, 171317623411600853, 16529615322051348437, 18417997150771375303, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5334827122981806215, 7738161198426062879, 16096322966046779578, 7690180744863199464, 16589884839242022257, 12454995736750842450, 3247221802734244696, 17643499204383222535, 14672293546278713057, 14846028244624432327, 17750754114621262532, 7719389523268106465, 1, 0, 0, 0, 1, 0, 14999821401736289617, 15448865933229589054, 13583843693540182696, 18131418839636252978, 4439752770537371709, 5448090446075942959, 6255055536007924620, 8919754405551141869, 12272610174663972685, 8138145110381489386, 16688592460292823795, 16728924149188845306, 5697605161887258162, 3376246851343252040, 2784882046013758615, 1, 0, 0, 0, 1, 0, 14635509374075973423, 12677010964369607514, 8962420667996168153, 3843332007587847712, 8114913103795360695, 18236464326626014645, 3970724348518176437, 1189869440416317038, 9344021820453066790, 13363880742094688735, 1827636079652666195, 8277248794545234814, 17428436932452366793, 10370890449220293026, 10938440435726947483, 1, 0, 0, 0, 1, 0, 7061896277845699344, 1873336673338143769, 8446543978270747820, 133391072621725577, 17840970837055628605, 7355089244606367886, 8497160540604180804, 3063592889799439815, 7982818396816137943, 9226283480795415930, 7777539981955361461, 5304102959326456112, 18287702590376570538, 1433120707818296652, 16923840111614250132, 1, 0, 0, 0, 1, 0, 4447115381548236223, 480042594266264640, 5488247032936248678, 4078804678813269002, 8930953641447820548, 782991345573128788, 8712431777609915948, 815213714413043438, 14730751205912092663, 16932487676782686187, 2461265848652382458, 11611317382660466625, 15533043966546096492, 13503968807830695383, 7800595096011710855, 1, 0, 0, 0, 1, 0, 6709571999678684256, 11804490432649482304, 5849114674484871556, 10348876437499804673, 1537331530871119668, 5444667365009856158, 16603575236790899764, 8569284627647542389, 3352703426322824443, 1135364094435597517, 4311636691398707716, 2791259658093074998, 9812515853737376613, 2051419284241394287, 8534668514381008137, 1, 0, 0, 0, 1, 0, 2787989614403510536, 6304392612397259174, 9351992476691347166, 13735545676744754358, 18158002788694963974, 6385821061540880880, 10648493462065257860, 17214386397833253270, 1785076194951656280, 7852757539889945333, 14107503556614837834, 3545073666350874448, 9332017051661502953, 9974196014981023153, 4715851494578741692, 1, 0, 0, 0, 1, 0, 7775468742954420419, 17692887772382430342, 9705826033582956692, 9410850814958744902, 15848213422225602213, 8831024347202442032, 5730064365163707705, 5744303806832189345, 12701095265259304800, 1274251095252206369, 12500666959478542023, 10971920968668641865, 4083552985517123622, 247517241416190936, 9297942977636733700, 1, 0, 0, 0, 1, 0, 17152107383937626708, 0, 0, 9684778724196116231, 18144229372703820177, 15267089652751109873, 4559302720015817859, 75478605149737153, 10397456717804752138, 12911489632740586743, 9045450374393109306, 9884965742324813117, 13871430865741604308, 581610329922371147, 8250812173422443178, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5677068088590394277, 420461259745383997, 5461641667913740527, 12375228725744876260, 10408597074326334289, 17926066510128935923, 11042755251558401992, 16568845003086625163, 16445466086575260512, 3993419962022258191, 5798502399718959312, 14694981892968238671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13067481717060632118, 17094012225747072853, 4977882380646661156, 13367890413392736054, 1854469405851562328, 1264814027228690376, 1655214279385078584, 4695178656129701184, 14688957924306712254, 6722743736070459606, 5346182502077854664, 485814636516518185, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17366862825980504064, 16556024871956851478, 5148753722704728721, 15438373163420410642, 5120877191992423544, 15123699931666188121, 17558359767143120899, 1678315832465296045, 16306354913676224825, 1297747773924291443, 14220066076326577834, 14546030952858743710, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 6125088443291536169, 2665390174743669239, 18009389558374812227, 15789153556893733830, 16604794485775028126, 15433589206667095645, 1379414419793409060, 17545164675990066495, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(11) }, program_info: ProgramInfo { program_hash: Word([12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 12, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_05.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_05.snap index 238daa45df..a11268f47f 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_05.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_05.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 5598651459581075585, 34, 0, 5598651459581075585, 13620833136975709089, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613], [18375473735916206629, 0, 1, 1, 18375473735916206629, 7804753453550466256, 0, 65, 7804753453550466256, 2256486347761721492, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099], [2105717247508690050, 0, 0, 0, 2105717247508690050, 17777748786253636403, 0, 0, 17777748786253636403, 5193960644663470490, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350], [1679902783560062568, 0, 0, 0, 1679902783560062568, 9435312778805252724, 0, 0, 9435312778805252724, 12344784587178360875, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526], [13620833136975709089, 0, 0, 0, 0, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2256486347761721492, 0, 0, 0, 0, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5193960644663470490, 0, 0, 0, 0, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12344784587178360875, 0, 0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 11091832976040936962, 11629723830403400020, 18085092721393681494, 5334827122981806215, 18131418839636252978, 14614347609195626268, 8910439294593611592, 3843332007587847712, 1023179011544432384, 3804737116729640404, 133391072621725577, 12470388296134501021, 632583774013957871, 4078804678813269002, 4646445037357820970, 12451999842825777859, 10348876437499804673, 4709521304751214351, 3818143376057959690, 13735545676744754358, 5911009352187537543, 11554714135033312948, 9410850814958744902, 11602211351055880832, 12661500893159548834, 9684778724196116231, 18082132319471479459, 5677068088590394277, 13067481717060632118, 17366862825980504064, 12752059346458920613, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 5598651459581075585, 644336023812026221, 13247747688876077858, 18204236545845216971, 16083593158731167399, 4357419437649084221, 5464680208294216350, 2779149829283345558, 7975999984217399211, 3799311940445025695, 12287115722151291956, 7889055060352596454, 3871221682982067508, 16266218633314388061, 10296105519823441978, 6482329477820286957, 2184206139900597012, 13275897735411980967, 3045004919428473516, 16702736287849627035, 4028816571826363002, 15011221569533006108, 2864985628223798368, 15475498524455915389, 5364573001665328907, 10397611698676440611, 8883008337890476036, 17315153826736218240, 14581052801302714514, 17999554639252319772, 18022889162320300611, 13620833136975709089, 34, 340, 14059267169109730234, 15746924929585133009, 471985631500087772, 16946433723443173275, 4595135147820207091, 2053997855496151567, 18402496786565368100, 387609426153233273, 8469665991798416914, 7881354678273462636, 11816560343993810599, 9054561158700241520, 7881520773741268125, 1631726701000003728, 9048332065221759951, 11440521690988525934, 11399562976973524004, 5295775600298609171, 16854936978988550164, 4555566089436281371, 8045874719633055695, 11420674364099598202, 11942861833844189240, 15820096964950298640, 4263756598719013378, 7647209523022736387, 13465875315346524402, 17464705757459592393, 14751425303934963720, 5598651459581075585, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 4371092720588693207, 7555819500301263096, 7871576915936585054, 7738161198426062879, 4439752770537371709, 3239157867226066300, 13695428956813660853, 8114913103795360695, 3271513559100018830, 1227622944719103238, 17840970837055628605, 967816437372899090, 1525132029610696618, 8930953641447820548, 1991652128187274521, 1878310895470329371, 1537331530871119668, 17179845365129498366, 6628846356810584866, 18158002788694963974, 8030209565693857269, 16465976624819029473, 15848213422225602213, 16693748147017299005, 15158850031902933967, 18144229372703820177, 8111553228231189401, 420461259745383997, 17094012225747072853, 16556024871956851478, 18135096529078946099, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 7804753453550466256, 10860407685663036604, 1563629168745730928, 4862512017968946683, 1035294938480129016, 17121277837906333314, 7566123129055455762, 801761918673301233, 8221980324343257318, 8971289227653573810, 14503443403830829887, 4403991158284421772, 3539411744559999519, 17877470569230350231, 13052305487168984918, 11988250928057152362, 7990654922366982189, 8123717249091864283, 273044411934894184, 12617346169478402785, 2083501518846346052, 1182260721753268305, 16655426125402668777, 18315976927222050841, 13684207927534177805, 15562831278015850283, 7777530579170086866, 17762371058211819624, 4106083518382761605, 3917672276375751396, 667054191578263747, 2256486347761721492, 0, 272, 15833028045737259664, 379315838026506093, 8581974592770288933, 17442451301272882541, 16579750051606898066, 5674487159031204202, 1541891846645406613, 8209041782659254452, 11966225502153548517, 9096730616149686024, 15618906860941665577, 14146738543483816160, 1119526938685078607, 8710432271010401746, 13282504786121257878, 1858131981777548381, 12223656597910297554, 11826686549344788050, 4472804247539583969, 7599118004690938513, 8277718642341650597, 8460103377465445883, 4568736565087160671, 4933680726900799861, 16645964836945405904, 3680609073412509534, 16176623117443515258, 15081244610133230814, 6410948793715747581, 7804753453550466256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 7371349600976768903, 1908428216714745226, 2226486931669462500, 16096322966046779578, 5448090446075942959, 10098429045835473018, 4809915777199041455, 18236464326626014645, 2690803580142520255, 1917959726470568181, 7355089244606367886, 9988016662047687018, 6075081950126577031, 782991345573128788, 17727121868432118686, 616586521336426688, 5444667365009856158, 3285592017878659318, 7931583655659423496, 6385821061540880880, 8735792590442216465, 11893401421408965, 8831024347202442032, 4451634306410080384, 8173507753862756681, 15267089652751109873, 10164019920559079526, 5461641667913740527, 4977882380646661156, 5148753722704728721, 13200399719329805350, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 17777748786253636403, 12906637371964794665, 9477262435683869924, 9199231093019338048, 7358751435793575899, 12569972625839259527, 5847320563034378965, 7599987891632365696, 10432134440683583258, 16242679258308055777, 13780789328607365793, 1153491566876700606, 13641042641136958279, 5969854971149325760, 6340590356564925801, 9771444654514086827, 15776260062082886705, 8278469467176979574, 16237604982476195391, 7423750977119185664, 6710003146178124596, 376186270665682407, 15539788083889931684, 11273188656572444234, 5199551304380116153, 11734010025122035435, 3764388601356982695, 11644487560172946408, 15563655808705061071, 5533608926617884295, 14514898346462505299, 5193960644663470490, 0, 68, 4457596741936238930, 12529581077675993243, 303974201734355881, 13345903392866909652, 9586267930884889862, 5178817950472007665, 6608322246477847509, 4070515537963445793, 9312477480709452614, 8889792067304111866, 11078425489498232713, 636055309231688517, 8580323529307502020, 12246954824275240956, 13948398243979685168, 14683551372837095812, 4744943918536266830, 10091391594533925883, 11270159100715194202, 16104697287955959682, 2983615207234436698, 10804815118997327370, 139420663301414639, 11145521977996788455, 1535579717520953536, 14470422183799365804, 208588932528011586, 11685358340804306780, 2822178276157738566, 17777748786253636403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 14926961084296668554, 18296820143542754124, 5759648439566973806, 7690180744863199464, 6255055536007924620, 9967438444965419122, 6053822608871655533, 3970724348518176437, 6498891217103059128, 10341231834356228091, 8497160540604180804, 5144558705352378414, 5437844264442299443, 8712431777609915948, 3915629295644008966, 1353567482375898210, 16603575236790899764, 17009424079525297171, 3253699369098499458, 10648493462065257860, 10940203220400825059, 7261956826490066834, 5730064365163707705, 8826144244207679463, 11688897202604808409, 4559302720015817859, 4402707951554525697, 12375228725744876260, 13367890413392736054, 15438373163420410642, 905179285088193526, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 9435312778805252724, 12594665258064570661, 1586451078180607598, 9325815886784366656, 13163107377789060321, 5998117226166788975, 7008390784506277276, 7362390315901265787, 5188984820381727203, 5842708215320867131, 13553650342229414448, 5955476415838559193, 8725164908673674579, 15174091024100472501, 13637649140457772157, 16186415272190469176, 4473737633571089105, 2032050757569801828, 16070334483916823186, 7382925316452200710, 7820237015849984079, 13711104951459639694, 15277864807184951074, 7746677489393361812, 10897962020578390602, 2459478953251166639, 6142067256785271224, 1469990404519833898, 14737929225229310854, 17685816709290022661, 5568614684720127113, 12344784587178360875, 0, 68, 8186419089203192999, 15318603549361168513, 7911471416782656233, 14239435248344205979, 2133634484310994464, 8097913535946941412, 113263425049039362, 248987352426060274, 10939256691674299939, 17358468187481791647, 12423884741952977957, 56617284060232395, 1868806426895026968, 222259776750343599, 15059516987340721081, 8741184015917561905, 2066403566980848459, 3696239822839219697, 15367181090448289261, 8349149003644261348, 10280553347796952088, 7301079719327054003, 6885778115777578237, 12504375544103392076, 9288443086735636960, 4503182154932177101, 17461402434481489861, 10152174670869705735, 6117144343302310887, 9435312778805252724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13620833136975709089, 1046930547281056921, 5022880593775506902, 7356080910092118039, 16589884839242022257, 8919754405551141869, 782951559730000700, 4320210530167177353, 1189869440416317038, 11509478421996896286, 14131663596834904750, 3063592889799439815, 8310309385140170305, 9794866582382956591, 815213714413043438, 14909022885730690459, 1965134134848901020, 8569284627647542389, 11756365299450742783, 17765218832065923306, 17214386397833253270, 8857548797279425296, 9589793731564825353, 5744303806832189345, 9245523889540971217, 17743277714115543370, 75478605149737153, 16642733757618334231, 10408597074326334289, 1854469405851562328, 5120877191992423544, 6125088443291536169, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 3358534066525179769, 2539641719046213719, 10199880931320172189, 6982964906206022277, 18160468829511284938, 13459748022261389691, 8540403463779371619, 298971077135778992, 9448428205117043728, 7211550496031219820, 5534997352008564058, 8961849300614763067, 16471253951712069551, 11996630593586982068, 17666409503469399853, 14743209389502972128, 13621451519455201128, 11693451034972088239, 376126037836000660, 12412096817616379990, 866468160396608077, 16487331493773223294, 15132792027965031247, 12005877568613345660, 5222840910814569167, 9174906967528115515, 12806387721803954058, 12420516276683200334, 8854457266879028181, 9558115804602486754, 6487880825188915613, 2384716068805359876, 0, 170, 13502722698945446624, 10582364865337924932, 8264438684589566467, 7775924941916048886, 7506941477585260226, 13559643900430805558, 14624701183045087851, 16810498729905278091, 3617722030424605287, 12209401598010007429, 14622001497128700788, 7124074456411373593, 11046353624103181594, 16506916834573600874, 2763493011778369288, 4381652925229768341, 9935322272824673857, 864619558035150967, 1868429356172715569, 6908757966622831414, 14123318794287563052, 4877497612363750655, 2105400693641679480, 8941132592749341698, 12124737918817624189, 15847492668873519030, 7578220797847929864, 9410406960468072857, 4811333449307081983, 5256913258227871425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2256486347761721492, 1399831673864751627, 12438672130810751909, 10240118010240816453, 12454995736750842450, 12272610174663972685, 16716772686788009039, 17679411248915786729, 9344021820453066790, 15548275238570617018, 12554227251830406338, 7982818396816137943, 8298623838207759766, 9667670442404470529, 14730751205912092663, 17475545646146195192, 7561186990159804961, 3352703426322824443, 11124655848983105243, 7361271662241444721, 1785076194951656280, 13323648175345935378, 15598576959546342188, 12701095265259304800, 3219799610745612107, 1555585114147558761, 10397456717804752138, 2319272066426069991, 17926066510128935923, 1264814027228690376, 15123699931666188121, 2665390174743669239, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 9365253138981608257, 9113412038486870510, 12237115836192970750, 13532373892635206986, 11668565565569624948, 2114739335810906841, 16845938989106496862, 18053472495070906903, 9578952411771586845, 2253954535466549551, 11957330595594263589, 4327169169737696049, 8097241277176222682, 17499521208876685046, 10474171567958477310, 2884885063912824473, 9389176041985146128, 2067286230266639471, 3365016398014065199, 738171567486888734, 6622135657383660119, 4978858449337102663, 1252098561428724852, 813491835360077960, 3026073706021528936, 1157174472277816506, 8848575890036236601, 4801870550462804365, 7028466390812097322, 8403721226663073636, 8970732296705167988, 12459739889109502988, 0, 136, 16864340361327671903, 2636070061904000825, 1539270658943308645, 8663103496298937284, 797155414931197277, 7929222985705309752, 5418421295167202847, 16520350781038259800, 11697635461652845634, 10326065236143981873, 4672452207442160023, 9236109584144478544, 2355139499180822246, 7782053902926446231, 2620978815438101291, 3668923621194401622, 246363526423127035, 10353083146864436335, 3430895131654614161, 12564495361718767183, 4982750975383300564, 14559648290526166949, 6242143746593499460, 11140632426269699329, 3028234720115016827, 6653412960111738263, 17564919688262005304, 284282844772359316, 7938696543505248162, 17100537000217132265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5193960644663470490, 18378615377082669582, 9942094792989095510, 18239658104155677632, 3247221802734244696, 8138145110381489386, 8305898108846284300, 4495835739545312127, 13363880742094688735, 409501507955448067, 9615046049029083973, 9226283480795415930, 6188039948757326954, 1925348622523205808, 16932487676782686187, 6461440512631901369, 6379521145060545439, 1135364094435597517, 6898694641523826133, 881111998832614715, 7852757539889945333, 8831210118957475983, 15508177777761403707, 1274251095252206369, 6462015026972174497, 14758961666322366163, 12911489632740586743, 10573355084806673526, 11042755251558401992, 1655214279385078584, 17558359767143120899, 18009389558374812227, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 4243893038989355703, 8922317147540258079, 15524901873579080579, 14961355291644520251, 8912131487655833337, 845467818172067610, 6513419642881984303, 15821388348544564061, 918209442918452849, 1771868273093277971, 11088759444000251587, 15710903694873023395, 7739199555620722590, 403122127909161589, 16794196935209020317, 420049465494673582, 3241180689003955516, 6815831073966054431, 13165955590245083084, 3933813014659210303, 7891509834730356602, 14572658037405460796, 18097121197159342726, 15303933786232509118, 6355852571927224576, 5965705308661034968, 3878821330615144039, 17609259256248013285, 15839551803056895538, 2863101478933748100, 6867483661888889167, 11007533278239168078, 0, 34, 6567391571487826395, 5204289601743072522, 3431536436519013066, 18098398151169262506, 7669185665212226764, 5455708142000104069, 9902960937688969164, 16439153306838678161, 9116909952501731628, 259487815978835763, 11207509487307725092, 13598970521047669184, 13294225392413433281, 17974846784869714720, 1531979193630020279, 8742633689618768661, 12951219828222672250, 1272063647175062154, 1015593294205135440, 1601391529726059156, 6891640398393941397, 9120291006888379304, 10474372360890458437, 5584077426972546342, 6680864214558642932, 2419346771478639592, 9600963709893327666, 7733975108380115257, 3435995547523177385, 10362535235958450122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12344784587178360875, 7525588297109292118, 10242077034078069399, 6920809802339641674, 17643499204383222535, 16688592460292823795, 3252667668159125426, 6639040797936707465, 1827636079652666195, 2462138615393893213, 7273091941301037907, 7777539981955361461, 17791722127119122070, 13941030348836860953, 2461265848652382458, 17178103242399629259, 12982591110459702249, 4311636691398707716, 11830890166127089072, 7160199109027716330, 14107503556614837834, 6316368550299988901, 12988322271117575851, 12500666959478542023, 4763644307980385379, 17502332825869685988, 9045450374393109306, 7379498771612731567, 16568845003086625163, 4695178656129701184, 1678315832465296045, 15789153556893733830, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 2372900269115514267, 7638869850317184909, 18112581651832813996, 7934301823485851614, 13134589595174512908, 5143267856379088965, 1385332020236631836, 4877336193186145990, 18193547062192211825, 4615765459892113834, 3381950137508436504, 17429784608409914678, 14977580224084415767, 6849317271519196447, 5437598344549503419, 1906047363049945529, 5004054537041877249, 14661239785476454049, 10553785792947774039, 2119915982392644589, 8985292275604857439, 9726386267280827154, 4505582310884934806, 12912789541737329022, 7115507662283435621, 2051190405167774802, 1232238311229055715, 220176432091768973, 5422499495491255741, 8009273299237215820, 13359803287975487032, 5187224287159924757, 0, 34, 13313027311321423572, 9192034959170904294, 14701500658652215925, 3854356596578551734, 5718692378574184090, 17501390179378757090, 8526809416150489728, 6507550884061463423, 7814960517829781662, 2939637999200097803, 780950602796552578, 4118107554308446430, 8555475415255527439, 14714307830357033751, 15614510648083677054, 17171454789201612359, 15897739400545916002, 5578273266312075011, 10191353484336583572, 2940473809902205523, 14962502826274181007, 2115641271859045975, 7064236544478437245, 10824702985925635247, 12931918488324919856, 8429882718924461151, 11244752067809188397, 2111913529644288504, 6112640616610282754, 6599190416745833044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4046254507773998773, 6534480484041428863, 3251048018398498863, 14672293546278713057, 16728924149188845306, 128728647106458681, 14226927580887823496, 8277248794545234814, 4354566838645069185, 16178613916401188944, 5304102959326456112, 9791457517463513797, 10245170831782510809, 11611317382660466625, 13569694221132024345, 16005837490233273516, 2791259658093074998, 13441513594234320689, 4241376053954359578, 3545073666350874448, 15186107276182512091, 10698815982870498162, 10971920968668641865, 9145865124167298835, 405811361541120846, 9884965742324813117, 2876689281462596902, 16445466086575260512, 14688957924306712254, 16306354913676224825, 16604794485775028126, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 1061325914286080764, 9554433906850032874, 4012321235764609039, 14967212595115142793, 5983394632166978443, 5809835498849113816, 6561933873120105870, 2140629501848088776, 6712525834006528890, 5760623808290856282, 10552757613235067722, 1939309373056894313, 14427320366022536141, 8538471352201975220, 14188752564290255096, 7981877957758397164, 1148470236137421383, 11019464818805406210, 7769960423081990191, 14632278337044440617, 849771658931440922, 5632784009618830911, 5696241881348246065, 1879984915784172244, 16312530632323862580, 13300309889942581843, 15448409017348426344, 1639569934817636487, 17233518173045382262, 14413924905126977169, 9045462722956532208, 0, 170, 946461078672821334, 16281780351388912901, 2935418863412242354, 14713353090133347394, 1791207195906381248, 1092415958346704160, 8319785044806982194, 11182822967626325795, 16809587424157045315, 2244733962249620937, 16303706249485479712, 845878992383212753, 5921002467687226204, 4434027484725189444, 15967620315457307754, 17386925554974145101, 13158427748622481094, 6196246176234489731, 8582026933349467190, 611778401982756412, 16288180016347524015, 16434619985909351985, 1145514137751095479, 5160952971387430527, 8451565207539691282, 5967893180517848182, 7714774968702541161, 14978023560208702638, 18014742166879778909, 5450578834500306709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 8072556154622677081, 1267311017976162806, 171317623411600853, 14846028244624432327, 5697605161887258162, 6090204166740560590, 11791493563989406548, 17428436932452366793, 5676009947455004918, 18345317182680976060, 18287702590376570538, 4985574569677261947, 15947076302058294771, 15533043966546096492, 13147369042643698626, 13830067522797295398, 9812515853737376613, 1153576568012481332, 6976086965219136352, 9332017051661502953, 11709096929003024091, 4784660881537662841, 4083552985517123622, 9895527598631437834, 3406650305555277621, 13871430865741604308, 2950941648901088194, 3993419962022258191, 6722743736070459606, 1297747773924291443, 15433589206667095645, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 84, 6657939908049969710, 5132111129018882891, 8232522030470930177, 2748555984042091513, 15852736438270791360, 3031910609778633238, 10165962755900271710, 16659854091479845434, 17343121214427119893, 854734865188827599, 16332742745573253042, 719106832906440841, 5187730385273117170, 5680967626748162975, 12443929595174060051, 6984107838208124669, 8017806737059891905, 3253255241682497310, 17244932564674349345, 1765857304688336746, 6104054101040517608, 16644020687030024364, 595269491299106953, 16831646467700047759, 6176340855571448766, 18004816485425051763, 4101389897636298429, 17541610204110287382, 7370145379849234412, 11764023996857035803, 3516218181999416212, 0, 136, 10841411014448826746, 10924324070009278511, 4390811061445162297, 10665404042695900090, 11148796663006115025, 16584177158338467512, 15369021590994653978, 13860609558593370204, 3837193053542887320, 7652640894347806080, 683219561750944695, 4006536353767232614, 4047796662675347846, 1149920536684206111, 1698301089048909092, 6224704259817574157, 4439284651749775339, 16476516570230330168, 10834199646006576067, 16282481854654492091, 6659294847490221927, 12242894720083399562, 7156478509869523727, 9996508607909856718, 17045153176928915002, 4097937233975335255, 13892339685592049122, 3881709886225480466, 10446442293007407525, 1539493896147927159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 14732236349158007950, 7398379382324753631, 16529615322051348437, 17750754114621262532, 3376246851343252040, 16812742874230723382, 5497427090926806167, 10370890449220293026, 12072808913033091146, 3773065747435304139, 1433120707818296652, 12602993390877629622, 11873715535213483733, 13503968807830695383, 1548449854272693349, 2164072014511735918, 2051419284241394287, 7675966884444101274, 7631305566403533669, 9974196014981023153, 16049335883858064137, 2471757314515864029, 247517241416190936, 17714417256089308015, 11671008027458954016, 581610329922371147, 16154960330167538938, 5798502399718959312, 5346182502077854664, 14220066076326577834, 1379414419793409060, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 13425232862973212691, 18017734206314589878, 4362746362325529522, 5580595613883635850, 14186966130004258435, 12558944767443104505, 9400104492160547353, 10540307613825778005, 16337971251965072535, 10106057436125976033, 9544366711268571215, 5728567960549491041, 13778603290469351967, 16022817295707876509, 11816634839594428392, 1619816382417214775, 332425507059551196, 5638968861636104000, 13036766990591622942, 5135102707173364321, 10242389681667623919, 5777720311941164202, 426018854260317513, 11718167143057109482, 13648951505177506250, 14542650836653761124, 18018546562218872798, 4457636384061007994, 2416704573314226662, 914323423605581375, 6601699247185721889, 0, 34, 8422262931452347509, 13885570107923725144, 235244799151795110, 17975760300270072840, 21645088928215528, 13378438338434245321, 11260622121353286786, 13136688320626048612, 17881560939567828117, 16601834208041636644, 2350599886583381643, 3676641047171560447, 2612703737764640459, 6165448709088710825, 9702561415374819789, 14396227383672448392, 2871975363154349452, 13084396173640101372, 15953404371899770169, 14377272925308367884, 5291380804534138171, 576711179775643850, 11287382459948400014, 9324129603955102500, 10503620158827014837, 6130889055094603538, 5442709211693844142, 2968563472347562608, 10528964699829495885, 358459342719025633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 7484183127135320340, 13467318737723490903, 18417997150771375303, 7719389523268106465, 2784882046013758615, 12479320332521777529, 17052932344949276269, 10938440435726947483, 3905086412998728873, 15634495878209337408, 16923840111614250132, 16397885158502248985, 1407236965451031446, 7800595096011710855, 9403004147208138835, 9997729556720517342, 8534668514381008137, 9227268528750758459, 13403671598326027744, 4715851494578741692, 2189528202978614673, 8567186243928218861, 9297942977636733700, 12120305129322824184, 16911451126764050505, 8250812173422443178, 10259824399772380043, 14694981892968238671, 485814636516518185, 14546030952858743710, 17545164675990066495, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 595597012989057195, 2376871353626003378, 17667748366842763551, 1405929090442079600, 18135181650619726914, 7403637996862883832, 5964686311110162804, 203041400479358567, 3387955851036204878, 2169976152805477386, 15733337581560247916, 7104142523828512918, 11829327565897640936, 816639760928622921, 11238339345191818453, 11391625709863387987, 6031165808075129231, 10104077332067730329, 6839520087480516521, 14155312441647748702, 4167237297971124611, 4042518115334572170, 7632437875765360091, 10425826042851550943, 10797236500243700589, 17846423932362838045, 11994705126716395168, 1154262141907751651, 15744039038114735423, 13449385390195333360, 16051125308748956016, 0, 34, 9168769012195838974, 8757246072351383525, 15819587373362991575, 6330331124468459419, 17594449485955496857, 5094615699180819390, 10468588157075103568, 17500241837984025274, 12590769989805218521, 10257339134394161483, 6020533408585278677, 9887559600989616103, 17174772404727048357, 8260989830322406645, 15331894718426588199, 13817494132369433237, 7270842089806116389, 14464987003178196376, 12856235623981550070, 6446968933011398838, 4625298604721424009, 7537989708572581312, 8773062848621227780, 7997392847552644982, 12295542285792207282, 2236820296563710856, 6411496154095679628, 96618257160083950, 2708395562256972928, 13820925760592258770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(11) }, program_info: ProgramInfo { program_hash: Word([12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 12, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 1, 0, 0, 0, 1, 0, 0, 5, 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, 16, 0, 0, 8, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 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, 16, 0, 0, 9, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 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, 16, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 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, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 6125088443291536169, 2665390174743669239, 18009389558374812227, 15789153556893733830, 16604794485775028126, 15433589206667095645, 1379414419793409060, 17545164675990066495, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 84, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 2384716068805359876, 12459739889109502988, 11007533278239168078, 5187224287159924757, 9045462722956532208, 3516218181999416212, 6601699247185721889, 16051125308748956016, 0, 0, 1, 0, 0, 1, 1, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 5256913258227871425, 17100537000217132265, 10362535235958450122, 6599190416745833044, 5450578834500306709, 1539493896147927159, 358459342719025633, 13820925760592258770, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14059267169109730234, 15833028045737259664, 4457596741936238930, 8186419089203192999, 13502722698945446624, 16864340361327671903, 6567391571487826395, 13313027311321423572, 946461078672821334, 10841411014448826746, 8422262931452347509, 9168769012195838974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15746924929585133009, 379315838026506093, 12529581077675993243, 15318603549361168513, 10582364865337924932, 2636070061904000825, 5204289601743072522, 9192034959170904294, 16281780351388912901, 10924324070009278511, 13885570107923725144, 8757246072351383525, 1, 0, 0, 0, 1, 0, 0, 0, 0, 471985631500087772, 8581974592770288933, 303974201734355881, 7911471416782656233, 8264438684589566467, 1539270658943308645, 3431536436519013066, 14701500658652215925, 2935418863412242354, 4390811061445162297, 235244799151795110, 15819587373362991575, 1, 0, 0, 0, 1, 0, 12803581155021505789, 1617229089722186747, 11821086028219467787, 16946433723443173275, 17442451301272882541, 13345903392866909652, 14239435248344205979, 7775924941916048886, 8663103496298937284, 18098398151169262506, 3854356596578551734, 14713353090133347394, 10665404042695900090, 17975760300270072840, 6330331124468459419, 1, 0, 0, 0, 1, 0, 4117165326757319536, 1434871395181292700, 5147296384675574401, 18402496786565368100, 1541891846645406613, 6608322246477847509, 113263425049039362, 14624701183045087851, 5418421295167202847, 9902960937688969164, 8526809416150489728, 8319785044806982194, 15369021590994653978, 11260622121353286786, 10468588157075103568, 1, 0, 0, 0, 1, 0, 10779284519276237242, 5207917218557150537, 17102744930422995322, 7881354678273462636, 9096730616149686024, 8889792067304111866, 17358468187481791647, 12209401598010007429, 10326065236143981873, 259487815978835763, 2939637999200097803, 2244733962249620937, 7652640894347806080, 16601834208041636644, 10257339134394161483, 1, 0, 0, 0, 1, 0, 15007735984166481726, 2893692142669467166, 5586756186106745240, 7881520773741268125, 1119526938685078607, 8580323529307502020, 1868806426895026968, 11046353624103181594, 2355139499180822246, 13294225392413433281, 8555475415255527439, 5921002467687226204, 4047796662675347846, 2612703737764640459, 17174772404727048357, 1, 0, 0, 0, 1, 0, 11641703905547654953, 13518861492744284220, 13602438854947769427, 11440521690988525934, 1858131981777548381, 14683551372837095812, 8741184015917561905, 4381652925229768341, 3668923621194401622, 8742633689618768661, 17171454789201612359, 17386925554974145101, 6224704259817574157, 14396227383672448392, 13817494132369433237, 1, 0, 0, 0, 1, 0, 17007411413036910904, 6937272254859089520, 3345146633011014675, 16854936978988550164, 4472804247539583969, 11270159100715194202, 15367181090448289261, 1868429356172715569, 3430895131654614161, 1015593294205135440, 10191353484336583572, 8582026933349467190, 10834199646006576067, 15953404371899770169, 12856235623981550070, 1, 0, 0, 0, 1, 0, 6583655571084272508, 1064174383094762843, 14004531006300423026, 11420674364099598202, 8460103377465445883, 10804815118997327370, 7301079719327054003, 4877497612363750655, 14559648290526166949, 9120291006888379304, 2115641271859045975, 16434619985909351985, 12242894720083399562, 576711179775643850, 7537989708572581312, 1, 0, 0, 0, 1, 0, 9177904733833547672, 0, 0, 4263756598719013378, 16645964836945405904, 1535579717520953536, 9288443086735636960, 12124737918817624189, 3028234720115016827, 6680864214558642932, 12931918488324919856, 8451565207539691282, 17045153176928915002, 10503620158827014837, 12295542285792207282, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13465875315346524402, 16176623117443515258, 208588932528011586, 17461402434481489861, 7578220797847929864, 17564919688262005304, 9600963709893327666, 11244752067809188397, 7714774968702541161, 13892339685592049122, 5442709211693844142, 6411496154095679628, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17464705757459592393, 15081244610133230814, 11685358340804306780, 10152174670869705735, 9410406960468072857, 284282844772359316, 7733975108380115257, 2111913529644288504, 14978023560208702638, 3881709886225480466, 2968563472347562608, 96618257160083950, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14751425303934963720, 6410948793715747581, 2822178276157738566, 6117144343302310887, 4811333449307081983, 7938696543505248162, 3435995547523177385, 6112640616610282754, 18014742166879778909, 10446442293007407525, 10528964699829495885, 2708395562256972928, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 5256913258227871425, 17100537000217132265, 10362535235958450122, 6599190416745833044, 5450578834500306709, 1539493896147927159, 358459342719025633, 13820925760592258770, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 1, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 1, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 1, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 1, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 1, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 1, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 1, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 1, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 1, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 84, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13247747688876077858, 1563629168745730928, 9477262435683869924, 1586451078180607598, 10199880931320172189, 12237115836192970750, 15524901873579080579, 18112581651832813996, 9554433906850032874, 5132111129018882891, 18017734206314589878, 2376871353626003378, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18204236545845216971, 4862512017968946683, 9199231093019338048, 9325815886784366656, 6982964906206022277, 13532373892635206986, 14961355291644520251, 7934301823485851614, 4012321235764609039, 8232522030470930177, 4362746362325529522, 17667748366842763551, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16083593158731167399, 1035294938480129016, 7358751435793575899, 13163107377789060321, 18160468829511284938, 11668565565569624948, 8912131487655833337, 13134589595174512908, 14967212595115142793, 2748555984042091513, 5580595613883635850, 1405929090442079600, 1, 0, 0, 0, 1, 0, 16924508715632711059, 12042164907586537699, 6879187775976945062, 4357419437649084221, 17121277837906333314, 12569972625839259527, 5998117226166788975, 13459748022261389691, 2114739335810906841, 845467818172067610, 5143267856379088965, 5983394632166978443, 15852736438270791360, 14186966130004258435, 18135181650619726914, 1, 0, 0, 0, 1, 0, 685023358845462459, 14587753177249686178, 16926803897274392790, 7975999984217399211, 8221980324343257318, 10432134440683583258, 5188984820381727203, 9448428205117043728, 9578952411771586845, 918209442918452849, 18193547062192211825, 2140629501848088776, 16659854091479845434, 10540307613825778005, 203041400479358567, 1, 0, 0, 0, 1, 0, 12541032576104625773, 16170387295460866341, 12891686882411197461, 7889055060352596454, 4403991158284421772, 1153491566876700606, 5955476415838559193, 8961849300614763067, 4327169169737696049, 15710903694873023395, 17429784608409914678, 10552757613235067722, 16332742745573253042, 9544366711268571215, 15733337581560247916, 1, 0, 0, 0, 1, 0, 18167944694759834272, 12663738219026080288, 12343732554083789364, 10296105519823441978, 13052305487168984918, 6340590356564925801, 13637649140457772157, 17666409503469399853, 10474171567958477310, 16794196935209020317, 5437598344549503419, 8538471352201975220, 5680967626748162975, 16022817295707876509, 816639760928622921, 1, 0, 0, 0, 1, 0, 10492313957532501655, 17437594987253247748, 17921559395393369208, 13275897735411980967, 8123717249091864283, 8278469467176979574, 2032050757569801828, 11693451034972088239, 2067286230266639471, 6815831073966054431, 14661239785476454049, 1148470236137421383, 8017806737059891905, 332425507059551196, 6031165808075129231, 1, 0, 0, 0, 1, 0, 3252881356430421557, 4587003287498047415, 6869066489621458415, 4028816571826363002, 2083501518846346052, 6710003146178124596, 7820237015849984079, 866468160396608077, 6622135657383660119, 7891509834730356602, 8985292275604857439, 14632278337044440617, 1765857304688336746, 5135102707173364321, 14155312441647748702, 1, 0, 0, 0, 1, 0, 15822931891080832543, 8232418911131413437, 13767571106456033164, 15475498524455915389, 18315976927222050841, 11273188656572444234, 7746677489393361812, 12005877568613345660, 813491835360077960, 15303933786232509118, 12912789541737329022, 5696241881348246065, 595269491299106953, 426018854260317513, 7632437875765360091, 1, 0, 0, 0, 1, 0, 15885522252972164471, 0, 0, 8883008337890476036, 7777530579170086866, 3764388601356982695, 6142067256785271224, 12806387721803954058, 8848575890036236601, 3878821330615144039, 1232238311229055715, 13300309889942581843, 18004816485425051763, 14542650836653761124, 17846423932362838045, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14581052801302714514, 4106083518382761605, 15563655808705061071, 14737929225229310854, 8854457266879028181, 7028466390812097322, 15839551803056895538, 5422499495491255741, 1639569934817636487, 17541610204110287382, 4457636384061007994, 1154262141907751651, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17999554639252319772, 3917672276375751396, 5533608926617884295, 17685816709290022661, 9558115804602486754, 8403721226663073636, 2863101478933748100, 8009273299237215820, 17233518173045382262, 7370145379849234412, 2416704573314226662, 15744039038114735423, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18022889162320300611, 667054191578263747, 14514898346462505299, 5568614684720127113, 6487880825188915613, 8970732296705167988, 6867483661888889167, 13359803287975487032, 14413924905126977169, 11764023996857035803, 914323423605581375, 13449385390195333360, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 2384716068805359876, 12459739889109502988, 11007533278239168078, 5187224287159924757, 9045462722956532208, 3516218181999416212, 6601699247185721889, 16051125308748956016, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11629723830403400020, 7555819500301263096, 1908428216714745226, 18296820143542754124, 5022880593775506902, 12438672130810751909, 9942094792989095510, 10242077034078069399, 6534480484041428863, 1267311017976162806, 7398379382324753631, 13467318737723490903, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18085092721393681494, 7871576915936585054, 2226486931669462500, 5759648439566973806, 7356080910092118039, 10240118010240816453, 18239658104155677632, 6920809802339641674, 3251048018398498863, 171317623411600853, 16529615322051348437, 18417997150771375303, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5334827122981806215, 7738161198426062879, 16096322966046779578, 7690180744863199464, 16589884839242022257, 12454995736750842450, 3247221802734244696, 17643499204383222535, 14672293546278713057, 14846028244624432327, 17750754114621262532, 7719389523268106465, 1, 0, 0, 0, 1, 0, 14999821401736289617, 15448865933229589054, 13583843693540182696, 18131418839636252978, 4439752770537371709, 5448090446075942959, 6255055536007924620, 8919754405551141869, 12272610174663972685, 8138145110381489386, 16688592460292823795, 16728924149188845306, 5697605161887258162, 3376246851343252040, 2784882046013758615, 1, 0, 0, 0, 1, 0, 14635509374075973423, 12677010964369607514, 8962420667996168153, 3843332007587847712, 8114913103795360695, 18236464326626014645, 3970724348518176437, 1189869440416317038, 9344021820453066790, 13363880742094688735, 1827636079652666195, 8277248794545234814, 17428436932452366793, 10370890449220293026, 10938440435726947483, 1, 0, 0, 0, 1, 0, 7061896277845699344, 1873336673338143769, 8446543978270747820, 133391072621725577, 17840970837055628605, 7355089244606367886, 8497160540604180804, 3063592889799439815, 7982818396816137943, 9226283480795415930, 7777539981955361461, 5304102959326456112, 18287702590376570538, 1433120707818296652, 16923840111614250132, 1, 0, 0, 0, 1, 0, 4447115381548236223, 480042594266264640, 5488247032936248678, 4078804678813269002, 8930953641447820548, 782991345573128788, 8712431777609915948, 815213714413043438, 14730751205912092663, 16932487676782686187, 2461265848652382458, 11611317382660466625, 15533043966546096492, 13503968807830695383, 7800595096011710855, 1, 0, 0, 0, 1, 0, 6709571999678684256, 11804490432649482304, 5849114674484871556, 10348876437499804673, 1537331530871119668, 5444667365009856158, 16603575236790899764, 8569284627647542389, 3352703426322824443, 1135364094435597517, 4311636691398707716, 2791259658093074998, 9812515853737376613, 2051419284241394287, 8534668514381008137, 1, 0, 0, 0, 1, 0, 2787989614403510536, 6304392612397259174, 9351992476691347166, 13735545676744754358, 18158002788694963974, 6385821061540880880, 10648493462065257860, 17214386397833253270, 1785076194951656280, 7852757539889945333, 14107503556614837834, 3545073666350874448, 9332017051661502953, 9974196014981023153, 4715851494578741692, 1, 0, 0, 0, 1, 0, 7775468742954420419, 17692887772382430342, 9705826033582956692, 9410850814958744902, 15848213422225602213, 8831024347202442032, 5730064365163707705, 5744303806832189345, 12701095265259304800, 1274251095252206369, 12500666959478542023, 10971920968668641865, 4083552985517123622, 247517241416190936, 9297942977636733700, 1, 0, 0, 0, 1, 0, 17152107383937626708, 0, 0, 9684778724196116231, 18144229372703820177, 15267089652751109873, 4559302720015817859, 75478605149737153, 10397456717804752138, 12911489632740586743, 9045450374393109306, 9884965742324813117, 13871430865741604308, 581610329922371147, 8250812173422443178, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5677068088590394277, 420461259745383997, 5461641667913740527, 12375228725744876260, 10408597074326334289, 17926066510128935923, 11042755251558401992, 16568845003086625163, 16445466086575260512, 3993419962022258191, 5798502399718959312, 14694981892968238671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13067481717060632118, 17094012225747072853, 4977882380646661156, 13367890413392736054, 1854469405851562328, 1264814027228690376, 1655214279385078584, 4695178656129701184, 14688957924306712254, 6722743736070459606, 5346182502077854664, 485814636516518185, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17366862825980504064, 16556024871956851478, 5148753722704728721, 15438373163420410642, 5120877191992423544, 15123699931666188121, 17558359767143120899, 1678315832465296045, 16306354913676224825, 1297747773924291443, 14220066076326577834, 14546030952858743710, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 6125088443291536169, 2665390174743669239, 18009389558374812227, 15789153556893733830, 16604794485775028126, 15433589206667095645, 1379414419793409060, 17545164675990066495, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(11) }, program_info: ProgramInfo { program_hash: Word([12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 12, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_06.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_06.snap index 31dced8cf9..04ad908689 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_06.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_06.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 5598651459581075585, 8, 0, 3358534066525179769, 13620833136975709089, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613, 12752059346458920613], [18375473735916206629, 0, 1, 1, 18375473735916206629, 7804753453550466256, 0, 65, 9365253138981608257, 2256486347761721492, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099, 18135096529078946099], [2105717247508690050, 0, 0, 0, 2105717247508690050, 17777748786253636403, 0, 0, 4243893038989355703, 5193960644663470490, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350, 13200399719329805350], [1679902783560062568, 0, 0, 0, 1679902783560062568, 9435312778805252724, 0, 0, 2372900269115514267, 12344784587178360875, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526, 905179285088193526], [13620833136975709089, 0, 0, 0, 0, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2256486347761721492, 0, 0, 0, 0, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5193960644663470490, 0, 0, 0, 0, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12344784587178360875, 0, 0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 9999, 0, 0, 9999, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [9999, 9999, 9999, 0, 9999, 9999, 0, 0, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 11091832976040936962, 11629723830403400020, 18085092721393681494, 5334827122981806215, 18131418839636252978, 14614347609195626268, 8910439294593611592, 3843332007587847712, 1023179011544432384, 3804737116729640404, 133391072621725577, 12470388296134501021, 632583774013957871, 4078804678813269002, 4646445037357820970, 12451999842825777859, 10348876437499804673, 4709521304751214351, 3818143376057959690, 13735545676744754358, 5911009352187537543, 11554714135033312948, 9410850814958744902, 11602211351055880832, 12661500893159548834, 9684778724196116231, 18082132319471479459, 5677068088590394277, 13067481717060632118, 17366862825980504064, 12752059346458920613, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 5598651459581075585, 644336023812026221, 13247747688876077858, 18204236545845216971, 16083593158731167399, 4357419437649084221, 5464680208294216350, 2779149829283345558, 7975999984217399211, 3799311940445025695, 12287115722151291956, 7889055060352596454, 3871221682982067508, 16266218633314388061, 10296105519823441978, 6482329477820286957, 2184206139900597012, 13275897735411980967, 3045004919428473516, 16702736287849627035, 4028816571826363002, 15011221569533006108, 2864985628223798368, 15475498524455915389, 5364573001665328907, 10397611698676440611, 8883008337890476036, 17315153826736218240, 14581052801302714514, 17999554639252319772, 18022889162320300611, 13620833136975709089, 8, 80, 16253482711025978099, 16690839578921925157, 11755424915479552417, 17934377671577204140, 15509754874715907467, 6426721221030580337, 11049594146888643723, 14912334368661229147, 17657273147290084056, 9105126057127804171, 13430225876739607206, 3614830725909060912, 14569284676797348998, 4705513459362295944, 424917224365117418, 2835737623710330612, 1964100172858915134, 14896843043547784767, 15482419984058848245, 18437547705335910066, 3162257106529980441, 5297995970636059087, 9661978795293871188, 10128143329575104151, 770728251595531533, 9782965673735423214, 1347942901513492691, 12086966446141742548, 10239457018222882008, 3358534066525179769, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 4371092720588693207, 7555819500301263096, 7871576915936585054, 7738161198426062879, 4439752770537371709, 3239157867226066300, 13695428956813660853, 8114913103795360695, 3271513559100018830, 1227622944719103238, 17840970837055628605, 967816437372899090, 1525132029610696618, 8930953641447820548, 1991652128187274521, 1878310895470329371, 1537331530871119668, 17179845365129498366, 6628846356810584866, 18158002788694963974, 8030209565693857269, 16465976624819029473, 15848213422225602213, 16693748147017299005, 15158850031902933967, 18144229372703820177, 8111553228231189401, 420461259745383997, 17094012225747072853, 16556024871956851478, 18135096529078946099, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 7804753453550466256, 10860407685663036604, 1563629168745730928, 4862512017968946683, 1035294938480129016, 17121277837906333314, 7566123129055455762, 801761918673301233, 8221980324343257318, 8971289227653573810, 14503443403830829887, 4403991158284421772, 3539411744559999519, 17877470569230350231, 13052305487168984918, 11988250928057152362, 7990654922366982189, 8123717249091864283, 273044411934894184, 12617346169478402785, 2083501518846346052, 1182260721753268305, 16655426125402668777, 18315976927222050841, 13684207927534177805, 15562831278015850283, 7777530579170086866, 17762371058211819624, 4106083518382761605, 3917672276375751396, 667054191578263747, 2256486347761721492, 0, 64, 5751576643258238090, 7830268710878889486, 4868320831660690795, 7042762868047858013, 1028615964620729689, 12270587957620579653, 7267371538363991280, 16125626865182516658, 16950134439933558852, 13427183447069512151, 16117382505273595827, 2222792985740553749, 6517696895688418945, 15516128650333221731, 6357034143715229949, 12960707821770488929, 12451444460344609421, 8786747128188560390, 7634329044629047826, 7741107824034642016, 10975559322169081956, 6007758954686348362, 13971256108093330407, 16868860295450858142, 434120282701603474, 11571634562637977474, 5581285869985960561, 6581368197537384623, 17661012293298952642, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 7371349600976768903, 1908428216714745226, 2226486931669462500, 16096322966046779578, 5448090446075942959, 10098429045835473018, 4809915777199041455, 18236464326626014645, 2690803580142520255, 1917959726470568181, 7355089244606367886, 9988016662047687018, 6075081950126577031, 782991345573128788, 17727121868432118686, 616586521336426688, 5444667365009856158, 3285592017878659318, 7931583655659423496, 6385821061540880880, 8735792590442216465, 11893401421408965, 8831024347202442032, 4451634306410080384, 8173507753862756681, 15267089652751109873, 10164019920559079526, 5461641667913740527, 4977882380646661156, 5148753722704728721, 13200399719329805350, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 17777748786253636403, 12906637371964794665, 9477262435683869924, 9199231093019338048, 7358751435793575899, 12569972625839259527, 5847320563034378965, 7599987891632365696, 10432134440683583258, 16242679258308055777, 13780789328607365793, 1153491566876700606, 13641042641136958279, 5969854971149325760, 6340590356564925801, 9771444654514086827, 15776260062082886705, 8278469467176979574, 16237604982476195391, 7423750977119185664, 6710003146178124596, 376186270665682407, 15539788083889931684, 11273188656572444234, 5199551304380116153, 11734010025122035435, 3764388601356982695, 11644487560172946408, 15563655808705061071, 5533608926617884295, 14514898346462505299, 5193960644663470490, 0, 16, 7110029021941723513, 10115409991715085575, 11428668827299215140, 4015039023438705588, 3732466887400149035, 5870841944205588609, 8421627027326523148, 8231214549142439222, 10318470559229280016, 15171283498151438808, 12477430934852872037, 3853779543897991795, 14662750186533371679, 7423988381383082226, 13549468426633458145, 11079168775731474830, 12471207782095033761, 17595325414333663547, 7042468264080735391, 17650115337646869205, 14946074228061446423, 4655654314239637986, 11187552516160183253, 18115881480442018545, 899748567092010447, 14020868337400209874, 15417366235984526759, 3331301994171189600, 15814677761660135474, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 14926961084296668554, 18296820143542754124, 5759648439566973806, 7690180744863199464, 6255055536007924620, 9967438444965419122, 6053822608871655533, 3970724348518176437, 6498891217103059128, 10341231834356228091, 8497160540604180804, 5144558705352378414, 5437844264442299443, 8712431777609915948, 3915629295644008966, 1353567482375898210, 16603575236790899764, 17009424079525297171, 3253699369098499458, 10648493462065257860, 10940203220400825059, 7261956826490066834, 5730064365163707705, 8826144244207679463, 11688897202604808409, 4559302720015817859, 4402707951554525697, 12375228725744876260, 13367890413392736054, 15438373163420410642, 905179285088193526, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 9435312778805252724, 12594665258064570661, 1586451078180607598, 9325815886784366656, 13163107377789060321, 5998117226166788975, 7008390784506277276, 7362390315901265787, 5188984820381727203, 5842708215320867131, 13553650342229414448, 5955476415838559193, 8725164908673674579, 15174091024100472501, 13637649140457772157, 16186415272190469176, 4473737633571089105, 2032050757569801828, 16070334483916823186, 7382925316452200710, 7820237015849984079, 13711104951459639694, 15277864807184951074, 7746677489393361812, 10897962020578390602, 2459478953251166639, 6142067256785271224, 1469990404519833898, 14737929225229310854, 17685816709290022661, 5568614684720127113, 12344784587178360875, 0, 16, 3208043314804619251, 6920597847411412414, 17985619796195836408, 11907191178709112742, 16377455862733420451, 15572876043608056600, 9466912758182965715, 17480763791598773801, 15029113851915312964, 1953587265841775225, 7175742902791404624, 6820764940134875350, 16069841829669607101, 15548451706938320654, 11760680638795846495, 1560700914733041660, 762367990279432470, 2603436428456411224, 6200990949184863170, 11673627333152839295, 7804486006334068097, 1006207264024395366, 11193609705356653459, 5704515878100803393, 14918729158665343812, 10658508130485449873, 380737719356524599, 12870561906904032245, 6984680585936259437, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13620833136975709089, 1046930547281056921, 5022880593775506902, 7356080910092118039, 16589884839242022257, 8919754405551141869, 782951559730000700, 4320210530167177353, 1189869440416317038, 11509478421996896286, 14131663596834904750, 3063592889799439815, 8310309385140170305, 9794866582382956591, 815213714413043438, 14909022885730690459, 1965134134848901020, 8569284627647542389, 11756365299450742783, 17765218832065923306, 17214386397833253270, 8857548797279425296, 9589793731564825353, 5744303806832189345, 9245523889540971217, 17743277714115543370, 75478605149737153, 16642733757618334231, 10408597074326334289, 1854469405851562328, 5120877191992423544, 6125088443291536169, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 3358534066525179769, 2539641719046213719, 10199880931320172189, 6982964906206022277, 18160468829511284938, 13459748022261389691, 8540403463779371619, 298971077135778992, 9448428205117043728, 7211550496031219820, 5534997352008564058, 8961849300614763067, 16471253951712069551, 11996630593586982068, 17666409503469399853, 14743209389502972128, 13621451519455201128, 11693451034972088239, 376126037836000660, 12412096817616379990, 866468160396608077, 16487331493773223294, 15132792027965031247, 12005877568613345660, 5222840910814569167, 9174906967528115515, 12806387721803954058, 12420516276683200334, 8854457266879028181, 9558115804602486754, 6487880825188915613, 2384716068805359876, 0, 40, 18130890293586930078, 18252951749527557342, 4460903658820341507, 859505755654562117, 5961685480015386121, 12134776249586726543, 11174658189737631113, 18385152961050631924, 9881471501704199804, 9636744945302995714, 12323181865658998064, 14903454669611502952, 1490539036394497080, 11688514875590095153, 16093513520259190726, 7731471377060742735, 5247500963110975116, 5269361527156951110, 13733877647296302634, 11865469401112846356, 7643242142337524006, 15572658687280648106, 9345628789826937825, 3291248301730279223, 16808111015808513609, 16274730253017522022, 12243901590027926887, 6559275936659510680, 17224785255700525855, 1390310476158884261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2256486347761721492, 1399831673864751627, 12438672130810751909, 10240118010240816453, 12454995736750842450, 12272610174663972685, 16716772686788009039, 17679411248915786729, 9344021820453066790, 15548275238570617018, 12554227251830406338, 7982818396816137943, 8298623838207759766, 9667670442404470529, 14730751205912092663, 17475545646146195192, 7561186990159804961, 3352703426322824443, 11124655848983105243, 7361271662241444721, 1785076194951656280, 13323648175345935378, 15598576959546342188, 12701095265259304800, 3219799610745612107, 1555585114147558761, 10397456717804752138, 2319272066426069991, 17926066510128935923, 1264814027228690376, 15123699931666188121, 2665390174743669239, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 9365253138981608257, 9113412038486870510, 12237115836192970750, 13532373892635206986, 11668565565569624948, 2114739335810906841, 16845938989106496862, 18053472495070906903, 9578952411771586845, 2253954535466549551, 11957330595594263589, 4327169169737696049, 8097241277176222682, 17499521208876685046, 10474171567958477310, 2884885063912824473, 9389176041985146128, 2067286230266639471, 3365016398014065199, 738171567486888734, 6622135657383660119, 4978858449337102663, 1252098561428724852, 813491835360077960, 3026073706021528936, 1157174472277816506, 8848575890036236601, 4801870550462804365, 7028466390812097322, 8403721226663073636, 8970732296705167988, 12459739889109502988, 0, 32, 10452764368937945515, 6969997263492352670, 15570786589164252178, 16136993048454358354, 16378352067056606124, 11747573379431147483, 12296464969648251345, 8155132212936940581, 2470200969414032680, 18126939303114916528, 16736276280592238734, 15549342782445497049, 9033882039108268313, 5121596298161079296, 14336897502470956191, 6301009824137139871, 16614860627935231068, 10383378433371415142, 10330363517752279308, 10937466001850040595, 16305844076412050396, 7189713532379018536, 7568236447715590536, 10805187342082326609, 7424874700566577356, 13861219118264849665, 7052270251739242825, 17586339544079318164, 14071176523136369481, 12282546735285148319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5193960644663470490, 18378615377082669582, 9942094792989095510, 18239658104155677632, 3247221802734244696, 8138145110381489386, 8305898108846284300, 4495835739545312127, 13363880742094688735, 409501507955448067, 9615046049029083973, 9226283480795415930, 6188039948757326954, 1925348622523205808, 16932487676782686187, 6461440512631901369, 6379521145060545439, 1135364094435597517, 6898694641523826133, 881111998832614715, 7852757539889945333, 8831210118957475983, 15508177777761403707, 1274251095252206369, 6462015026972174497, 14758961666322366163, 12911489632740586743, 10573355084806673526, 11042755251558401992, 1655214279385078584, 17558359767143120899, 18009389558374812227, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 4243893038989355703, 8922317147540258079, 15524901873579080579, 14961355291644520251, 8912131487655833337, 845467818172067610, 6513419642881984303, 15821388348544564061, 918209442918452849, 1771868273093277971, 11088759444000251587, 15710903694873023395, 7739199555620722590, 403122127909161589, 16794196935209020317, 420049465494673582, 3241180689003955516, 6815831073966054431, 13165955590245083084, 3933813014659210303, 7891509834730356602, 14572658037405460796, 18097121197159342726, 15303933786232509118, 6355852571927224576, 5965705308661034968, 3878821330615144039, 17609259256248013285, 15839551803056895538, 2863101478933748100, 6867483661888889167, 11007533278239168078, 0, 8, 9114363797835460134, 5446076396314160376, 12863008906537145423, 10008421878335836436, 9952321233871043669, 12872379155893703237, 7266552182027361169, 1266036355585216796, 2621902104176569009, 8791105532651972211, 6351975813451610601, 11821139808280113179, 11281913023757770338, 3277134497757048289, 13219080767636598429, 10181825490691565485, 2766637533497216499, 5527857141123489970, 8463471033597650592, 16863468430858262436, 4521466714741486225, 2112404415880305855, 6776665887355979100, 4283028800297139078, 17448147405455891940, 2672696094870261596, 654959311657763753, 15404879372302137522, 458610335793450516, 11708893791522292939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12344784587178360875, 7525588297109292118, 10242077034078069399, 6920809802339641674, 17643499204383222535, 16688592460292823795, 3252667668159125426, 6639040797936707465, 1827636079652666195, 2462138615393893213, 7273091941301037907, 7777539981955361461, 17791722127119122070, 13941030348836860953, 2461265848652382458, 17178103242399629259, 12982591110459702249, 4311636691398707716, 11830890166127089072, 7160199109027716330, 14107503556614837834, 6316368550299988901, 12988322271117575851, 12500666959478542023, 4763644307980385379, 17502332825869685988, 9045450374393109306, 7379498771612731567, 16568845003086625163, 4695178656129701184, 1678315832465296045, 15789153556893733830, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 2372900269115514267, 7638869850317184909, 18112581651832813996, 7934301823485851614, 13134589595174512908, 5143267856379088965, 1385332020236631836, 4877336193186145990, 18193547062192211825, 4615765459892113834, 3381950137508436504, 17429784608409914678, 14977580224084415767, 6849317271519196447, 5437598344549503419, 1906047363049945529, 5004054537041877249, 14661239785476454049, 10553785792947774039, 2119915982392644589, 8985292275604857439, 9726386267280827154, 4505582310884934806, 12912789541737329022, 7115507662283435621, 2051190405167774802, 1232238311229055715, 220176432091768973, 5422499495491255741, 8009273299237215820, 13359803287975487032, 5187224287159924757, 0, 8, 6104172690014223231, 3119855977255645286, 2700229040680838768, 4228220371303630837, 12976691418076017877, 15391527008624099592, 15522155400452634037, 17655908650961725957, 5157987610310047621, 13664486701019622043, 12908699189677656287, 14840926611057477527, 6092037682822283700, 15181448373122947619, 2083722204849270202, 1893419523737526751, 11329911669537538562, 12331432886354737271, 9636585409664050258, 5131588463040403759, 10248116973079783912, 2136665268102207704, 17448444978654544666, 11945433761064128885, 4462464721020457233, 17579935132869425842, 7098417589530391109, 15343623253038912080, 7762335122892638892, 10310226363807226654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4046254507773998773, 6534480484041428863, 3251048018398498863, 14672293546278713057, 16728924149188845306, 128728647106458681, 14226927580887823496, 8277248794545234814, 4354566838645069185, 16178613916401188944, 5304102959326456112, 9791457517463513797, 10245170831782510809, 11611317382660466625, 13569694221132024345, 16005837490233273516, 2791259658093074998, 13441513594234320689, 4241376053954359578, 3545073666350874448, 15186107276182512091, 10698815982870498162, 10971920968668641865, 9145865124167298835, 405811361541120846, 9884965742324813117, 2876689281462596902, 16445466086575260512, 14688957924306712254, 16306354913676224825, 16604794485775028126, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 1061325914286080764, 9554433906850032874, 4012321235764609039, 14967212595115142793, 5983394632166978443, 5809835498849113816, 6561933873120105870, 2140629501848088776, 6712525834006528890, 5760623808290856282, 10552757613235067722, 1939309373056894313, 14427320366022536141, 8538471352201975220, 14188752564290255096, 7981877957758397164, 1148470236137421383, 11019464818805406210, 7769960423081990191, 14632278337044440617, 849771658931440922, 5632784009618830911, 5696241881348246065, 1879984915784172244, 16312530632323862580, 13300309889942581843, 15448409017348426344, 1639569934817636487, 17233518173045382262, 14413924905126977169, 9045462722956532208, 0, 40, 1560947813056021755, 6935064976442414148, 9999441144135002932, 10354700837586583171, 6040781227937012106, 4698117391978117444, 4735711626023545756, 11217844833019453026, 3130590714605394722, 2809204122464618686, 10935232469327759448, 18335893537613898174, 10868401885487323501, 15799177281014635734, 17187052562019754838, 4027411046406207040, 11879721967266924677, 3613659344771632047, 1846469577394958972, 14668357323201408029, 14939045883642543835, 2885718226990976376, 4969257074069595075, 10824274197210729467, 13212275138420405274, 10563919532671437398, 12234598862193668129, 14653607410806008848, 2498958194485300229, 3512215170452429648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 8072556154622677081, 1267311017976162806, 171317623411600853, 14846028244624432327, 5697605161887258162, 6090204166740560590, 11791493563989406548, 17428436932452366793, 5676009947455004918, 18345317182680976060, 18287702590376570538, 4985574569677261947, 15947076302058294771, 15533043966546096492, 13147369042643698626, 13830067522797295398, 9812515853737376613, 1153576568012481332, 6976086965219136352, 9332017051661502953, 11709096929003024091, 4784660881537662841, 4083552985517123622, 9895527598631437834, 3406650305555277621, 13871430865741604308, 2950941648901088194, 3993419962022258191, 6722743736070459606, 1297747773924291443, 15433589206667095645, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 84, 6657939908049969710, 5132111129018882891, 8232522030470930177, 2748555984042091513, 15852736438270791360, 3031910609778633238, 10165962755900271710, 16659854091479845434, 17343121214427119893, 854734865188827599, 16332742745573253042, 719106832906440841, 5187730385273117170, 5680967626748162975, 12443929595174060051, 6984107838208124669, 8017806737059891905, 3253255241682497310, 17244932564674349345, 1765857304688336746, 6104054101040517608, 16644020687030024364, 595269491299106953, 16831646467700047759, 6176340855571448766, 18004816485425051763, 4101389897636298429, 17541610204110287382, 7370145379849234412, 11764023996857035803, 3516218181999416212, 0, 32, 9302012295643728416, 424328237663665361, 17748121622218558811, 6681769685034042719, 10907932526941371789, 14996603190997478665, 13982878080104642188, 3336783822228111865, 7403528606603453519, 7309352233404946366, 11509327586943808925, 6803943428138467537, 12870260590513220077, 3798257798625653324, 15652192157997003684, 8260391000410661595, 9099897743400681933, 16067207775248165408, 7640841583197908852, 16739199083410292994, 1998275509994500625, 10688417071827877337, 16160081185811655577, 2725954513011781037, 3040692668058239811, 15097072321276989567, 7813293313258815644, 15261763399945716285, 2258772319189190202, 6756061023037720295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 14732236349158007950, 7398379382324753631, 16529615322051348437, 17750754114621262532, 3376246851343252040, 16812742874230723382, 5497427090926806167, 10370890449220293026, 12072808913033091146, 3773065747435304139, 1433120707818296652, 12602993390877629622, 11873715535213483733, 13503968807830695383, 1548449854272693349, 2164072014511735918, 2051419284241394287, 7675966884444101274, 7631305566403533669, 9974196014981023153, 16049335883858064137, 2471757314515864029, 247517241416190936, 17714417256089308015, 11671008027458954016, 581610329922371147, 16154960330167538938, 5798502399718959312, 5346182502077854664, 14220066076326577834, 1379414419793409060, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 13425232862973212691, 18017734206314589878, 4362746362325529522, 5580595613883635850, 14186966130004258435, 12558944767443104505, 9400104492160547353, 10540307613825778005, 16337971251965072535, 10106057436125976033, 9544366711268571215, 5728567960549491041, 13778603290469351967, 16022817295707876509, 11816634839594428392, 1619816382417214775, 332425507059551196, 5638968861636104000, 13036766990591622942, 5135102707173364321, 10242389681667623919, 5777720311941164202, 426018854260317513, 11718167143057109482, 13648951505177506250, 14542650836653761124, 18018546562218872798, 4457636384061007994, 2416704573314226662, 914323423605581375, 6601699247185721889, 0, 8, 7519454690376123692, 7627104070861575574, 17604686071836489236, 14277148259130460564, 8312218486680706135, 8395439642754559152, 17307771294890409643, 9298206908486537717, 3027629924013931359, 2933551330348935458, 1450485994192951386, 8585052201707081835, 10624425952582111111, 16773523322999621677, 13337622149287916761, 17874287708894504070, 14164897610403484003, 11216401648549709020, 911970190394256131, 3202853507803349037, 14616902435260689479, 14924823153427050614, 4881022900440414264, 9723366934152472594, 16335725686098559697, 8087897843744270993, 11437013713086863200, 7627258546495067733, 18044191572661655945, 16490279521751489469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 7484183127135320340, 13467318737723490903, 18417997150771375303, 7719389523268106465, 2784882046013758615, 12479320332521777529, 17052932344949276269, 10938440435726947483, 3905086412998728873, 15634495878209337408, 16923840111614250132, 16397885158502248985, 1407236965451031446, 7800595096011710855, 9403004147208138835, 9997729556720517342, 8534668514381008137, 9227268528750758459, 13403671598326027744, 4715851494578741692, 2189528202978614673, 8567186243928218861, 9297942977636733700, 12120305129322824184, 16911451126764050505, 8250812173422443178, 10259824399772380043, 14694981892968238671, 485814636516518185, 14546030952858743710, 17545164675990066495, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 595597012989057195, 2376871353626003378, 17667748366842763551, 1405929090442079600, 18135181650619726914, 7403637996862883832, 5964686311110162804, 203041400479358567, 3387955851036204878, 2169976152805477386, 15733337581560247916, 7104142523828512918, 11829327565897640936, 816639760928622921, 11238339345191818453, 11391625709863387987, 6031165808075129231, 10104077332067730329, 6839520087480516521, 14155312441647748702, 4167237297971124611, 4042518115334572170, 7632437875765360091, 10425826042851550943, 10797236500243700589, 17846423932362838045, 11994705126716395168, 1154262141907751651, 15744039038114735423, 13449385390195333360, 16051125308748956016, 0, 8, 17781582622500481192, 12847902632736061277, 12021499907877242591, 16751519355106661703, 9062087890172095618, 3834953580385337540, 2969703856153678454, 11604562295556139307, 10447912046373566534, 12987934619706800857, 12352596220492768030, 14816150974992525275, 2172600571554701126, 18086375044546604023, 16313093185369681775, 14997664071320688070, 347950016295486690, 9206182676441692601, 3566552483989599402, 4925983231752336365, 1728701557101400581, 7087476601458867917, 9759961360999781392, 12569092891286895547, 14206292953735333262, 16422952955631166803, 6294107725304445883, 9537940691512987143, 15535806100011306333, 7080716573279759555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(11) }, program_info: ProgramInfo { program_hash: Word([12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 12, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 6125088443291536169, 2665390174743669239, 18009389558374812227, 15789153556893733830, 16604794485775028126, 15433589206667095645, 1379414419793409060, 17545164675990066495, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 84, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 2384716068805359876, 12459739889109502988, 11007533278239168078, 5187224287159924757, 9045462722956532208, 3516218181999416212, 6601699247185721889, 16051125308748956016, 0, 0, 1, 0, 0, 1, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16253482711025978099, 5751576643258238090, 7110029021941723513, 3208043314804619251, 18130890293586930078, 10452764368937945515, 9114363797835460134, 6104172690014223231, 1560947813056021755, 9302012295643728416, 7519454690376123692, 17781582622500481192, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16690839578921925157, 7830268710878889486, 10115409991715085575, 6920597847411412414, 18252951749527557342, 6969997263492352670, 5446076396314160376, 3119855977255645286, 6935064976442414148, 424328237663665361, 7627104070861575574, 12847902632736061277, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11755424915479552417, 4868320831660690795, 11428668827299215140, 17985619796195836408, 4460903658820341507, 15570786589164252178, 12863008906537145423, 2700229040680838768, 9999441144135002932, 17748121622218558811, 17604686071836489236, 12021499907877242591, 1, 0, 0, 0, 1, 0, 4447686994046778179, 11785000236654418865, 10679155400143926564, 17934377671577204140, 7042762868047858013, 4015039023438705588, 11907191178709112742, 859505755654562117, 16136993048454358354, 10008421878335836436, 4228220371303630837, 10354700837586583171, 6681769685034042719, 14277148259130460564, 16751519355106661703, 1, 0, 0, 0, 1, 0, 217106376514171653, 11707313943908545641, 15092932467239161061, 11049594146888643723, 7267371538363991280, 8421627027326523148, 9466912758182965715, 11174658189737631113, 12296464969648251345, 7266552182027361169, 15522155400452634037, 4735711626023545756, 13982878080104642188, 17307771294890409643, 2969703856153678454, 1, 0, 0, 0, 1, 0, 11044550050665632476, 8958367422149199561, 16497379967830959424, 9105126057127804171, 13427183447069512151, 15171283498151438808, 1953587265841775225, 9636744945302995714, 18126939303114916528, 8791105532651972211, 13664486701019622043, 2809204122464618686, 7309352233404946366, 2933551330348935458, 12987934619706800857, 1, 0, 0, 0, 1, 0, 1877907417051268915, 6151364593092129113, 13049072304454003157, 14569284676797348998, 6517696895688418945, 14662750186533371679, 16069841829669607101, 1490539036394497080, 9033882039108268313, 11281913023757770338, 6092037682822283700, 10868401885487323501, 12870260590513220077, 10624425952582111111, 2172600571554701126, 1, 0, 0, 0, 1, 0, 10197860193367132813, 18317591232122268101, 11864893253666570624, 2835737623710330612, 12960707821770488929, 11079168775731474830, 1560700914733041660, 7731471377060742735, 6301009824137139871, 10181825490691565485, 1893419523737526751, 4027411046406207040, 8260391000410661595, 17874287708894504070, 14997664071320688070, 1, 0, 0, 0, 1, 0, 7903888723576875237, 18382523577454102436, 13167437966520740716, 15482419984058848245, 7634329044629047826, 7042468264080735391, 6200990949184863170, 13733877647296302634, 10330363517752279308, 8463471033597650592, 9636585409664050258, 1846469577394958972, 7640841583197908852, 911970190394256131, 3566552483989599402, 1, 0, 0, 0, 1, 0, 2186301169863059887, 6122215293275160143, 16696916221087249943, 5297995970636059087, 6007758954686348362, 4655654314239637986, 1006207264024395366, 15572658687280648106, 7189713532379018536, 2112404415880305855, 2136665268102207704, 2885718226990976376, 10688417071827877337, 14924823153427050614, 7087476601458867917, 1, 0, 0, 0, 1, 0, 4350099661540135647, 0, 0, 770728251595531533, 434120282701603474, 899748567092010447, 14918729158665343812, 16808111015808513609, 7424874700566577356, 17448147405455891940, 4462464721020457233, 13212275138420405274, 3040692668058239811, 16335725686098559697, 14206292953735333262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1347942901513492691, 5581285869985960561, 15417366235984526759, 380737719356524599, 12243901590027926887, 7052270251739242825, 654959311657763753, 7098417589530391109, 12234598862193668129, 7813293313258815644, 11437013713086863200, 6294107725304445883, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12086966446141742548, 6581368197537384623, 3331301994171189600, 12870561906904032245, 6559275936659510680, 17586339544079318164, 15404879372302137522, 15343623253038912080, 14653607410806008848, 15261763399945716285, 7627258546495067733, 9537940691512987143, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10239457018222882008, 17661012293298952642, 15814677761660135474, 6984680585936259437, 17224785255700525855, 14071176523136369481, 458610335793450516, 7762335122892638892, 2498958194485300229, 2258772319189190202, 18044191572661655945, 15535806100011306333, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 1, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 1, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 1, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 1, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 1, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 1, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 1, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 1, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 1, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5598651459581075585, 7804753453550466256, 17777748786253636403, 9435312778805252724, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 84, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13247747688876077858, 1563629168745730928, 9477262435683869924, 1586451078180607598, 10199880931320172189, 12237115836192970750, 15524901873579080579, 18112581651832813996, 9554433906850032874, 5132111129018882891, 18017734206314589878, 2376871353626003378, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18204236545845216971, 4862512017968946683, 9199231093019338048, 9325815886784366656, 6982964906206022277, 13532373892635206986, 14961355291644520251, 7934301823485851614, 4012321235764609039, 8232522030470930177, 4362746362325529522, 17667748366842763551, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16083593158731167399, 1035294938480129016, 7358751435793575899, 13163107377789060321, 18160468829511284938, 11668565565569624948, 8912131487655833337, 13134589595174512908, 14967212595115142793, 2748555984042091513, 5580595613883635850, 1405929090442079600, 1, 0, 0, 0, 1, 0, 16924508715632711059, 12042164907586537699, 6879187775976945062, 4357419437649084221, 17121277837906333314, 12569972625839259527, 5998117226166788975, 13459748022261389691, 2114739335810906841, 845467818172067610, 5143267856379088965, 5983394632166978443, 15852736438270791360, 14186966130004258435, 18135181650619726914, 1, 0, 0, 0, 1, 0, 685023358845462459, 14587753177249686178, 16926803897274392790, 7975999984217399211, 8221980324343257318, 10432134440683583258, 5188984820381727203, 9448428205117043728, 9578952411771586845, 918209442918452849, 18193547062192211825, 2140629501848088776, 16659854091479845434, 10540307613825778005, 203041400479358567, 1, 0, 0, 0, 1, 0, 12541032576104625773, 16170387295460866341, 12891686882411197461, 7889055060352596454, 4403991158284421772, 1153491566876700606, 5955476415838559193, 8961849300614763067, 4327169169737696049, 15710903694873023395, 17429784608409914678, 10552757613235067722, 16332742745573253042, 9544366711268571215, 15733337581560247916, 1, 0, 0, 0, 1, 0, 18167944694759834272, 12663738219026080288, 12343732554083789364, 10296105519823441978, 13052305487168984918, 6340590356564925801, 13637649140457772157, 17666409503469399853, 10474171567958477310, 16794196935209020317, 5437598344549503419, 8538471352201975220, 5680967626748162975, 16022817295707876509, 816639760928622921, 1, 0, 0, 0, 1, 0, 10492313957532501655, 17437594987253247748, 17921559395393369208, 13275897735411980967, 8123717249091864283, 8278469467176979574, 2032050757569801828, 11693451034972088239, 2067286230266639471, 6815831073966054431, 14661239785476454049, 1148470236137421383, 8017806737059891905, 332425507059551196, 6031165808075129231, 1, 0, 0, 0, 1, 0, 3252881356430421557, 4587003287498047415, 6869066489621458415, 4028816571826363002, 2083501518846346052, 6710003146178124596, 7820237015849984079, 866468160396608077, 6622135657383660119, 7891509834730356602, 8985292275604857439, 14632278337044440617, 1765857304688336746, 5135102707173364321, 14155312441647748702, 1, 0, 0, 0, 1, 0, 15822931891080832543, 8232418911131413437, 13767571106456033164, 15475498524455915389, 18315976927222050841, 11273188656572444234, 7746677489393361812, 12005877568613345660, 813491835360077960, 15303933786232509118, 12912789541737329022, 5696241881348246065, 595269491299106953, 426018854260317513, 7632437875765360091, 1, 0, 0, 0, 1, 0, 15885522252972164471, 0, 0, 8883008337890476036, 7777530579170086866, 3764388601356982695, 6142067256785271224, 12806387721803954058, 8848575890036236601, 3878821330615144039, 1232238311229055715, 13300309889942581843, 18004816485425051763, 14542650836653761124, 17846423932362838045, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14581052801302714514, 4106083518382761605, 15563655808705061071, 14737929225229310854, 8854457266879028181, 7028466390812097322, 15839551803056895538, 5422499495491255741, 1639569934817636487, 17541610204110287382, 4457636384061007994, 1154262141907751651, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17999554639252319772, 3917672276375751396, 5533608926617884295, 17685816709290022661, 9558115804602486754, 8403721226663073636, 2863101478933748100, 8009273299237215820, 17233518173045382262, 7370145379849234412, 2416704573314226662, 15744039038114735423, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18022889162320300611, 667054191578263747, 14514898346462505299, 5568614684720127113, 6487880825188915613, 8970732296705167988, 6867483661888889167, 13359803287975487032, 14413924905126977169, 11764023996857035803, 914323423605581375, 13449385390195333360, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 2384716068805359876, 12459739889109502988, 11007533278239168078, 5187224287159924757, 9045462722956532208, 3516218181999416212, 6601699247185721889, 16051125308748956016, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 13620833136975709089, 2256486347761721492, 5193960644663470490, 12344784587178360875, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11629723830403400020, 7555819500301263096, 1908428216714745226, 18296820143542754124, 5022880593775506902, 12438672130810751909, 9942094792989095510, 10242077034078069399, 6534480484041428863, 1267311017976162806, 7398379382324753631, 13467318737723490903, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18085092721393681494, 7871576915936585054, 2226486931669462500, 5759648439566973806, 7356080910092118039, 10240118010240816453, 18239658104155677632, 6920809802339641674, 3251048018398498863, 171317623411600853, 16529615322051348437, 18417997150771375303, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5334827122981806215, 7738161198426062879, 16096322966046779578, 7690180744863199464, 16589884839242022257, 12454995736750842450, 3247221802734244696, 17643499204383222535, 14672293546278713057, 14846028244624432327, 17750754114621262532, 7719389523268106465, 1, 0, 0, 0, 1, 0, 14999821401736289617, 15448865933229589054, 13583843693540182696, 18131418839636252978, 4439752770537371709, 5448090446075942959, 6255055536007924620, 8919754405551141869, 12272610174663972685, 8138145110381489386, 16688592460292823795, 16728924149188845306, 5697605161887258162, 3376246851343252040, 2784882046013758615, 1, 0, 0, 0, 1, 0, 14635509374075973423, 12677010964369607514, 8962420667996168153, 3843332007587847712, 8114913103795360695, 18236464326626014645, 3970724348518176437, 1189869440416317038, 9344021820453066790, 13363880742094688735, 1827636079652666195, 8277248794545234814, 17428436932452366793, 10370890449220293026, 10938440435726947483, 1, 0, 0, 0, 1, 0, 7061896277845699344, 1873336673338143769, 8446543978270747820, 133391072621725577, 17840970837055628605, 7355089244606367886, 8497160540604180804, 3063592889799439815, 7982818396816137943, 9226283480795415930, 7777539981955361461, 5304102959326456112, 18287702590376570538, 1433120707818296652, 16923840111614250132, 1, 0, 0, 0, 1, 0, 4447115381548236223, 480042594266264640, 5488247032936248678, 4078804678813269002, 8930953641447820548, 782991345573128788, 8712431777609915948, 815213714413043438, 14730751205912092663, 16932487676782686187, 2461265848652382458, 11611317382660466625, 15533043966546096492, 13503968807830695383, 7800595096011710855, 1, 0, 0, 0, 1, 0, 6709571999678684256, 11804490432649482304, 5849114674484871556, 10348876437499804673, 1537331530871119668, 5444667365009856158, 16603575236790899764, 8569284627647542389, 3352703426322824443, 1135364094435597517, 4311636691398707716, 2791259658093074998, 9812515853737376613, 2051419284241394287, 8534668514381008137, 1, 0, 0, 0, 1, 0, 2787989614403510536, 6304392612397259174, 9351992476691347166, 13735545676744754358, 18158002788694963974, 6385821061540880880, 10648493462065257860, 17214386397833253270, 1785076194951656280, 7852757539889945333, 14107503556614837834, 3545073666350874448, 9332017051661502953, 9974196014981023153, 4715851494578741692, 1, 0, 0, 0, 1, 0, 7775468742954420419, 17692887772382430342, 9705826033582956692, 9410850814958744902, 15848213422225602213, 8831024347202442032, 5730064365163707705, 5744303806832189345, 12701095265259304800, 1274251095252206369, 12500666959478542023, 10971920968668641865, 4083552985517123622, 247517241416190936, 9297942977636733700, 1, 0, 0, 0, 1, 0, 17152107383937626708, 0, 0, 9684778724196116231, 18144229372703820177, 15267089652751109873, 4559302720015817859, 75478605149737153, 10397456717804752138, 12911489632740586743, 9045450374393109306, 9884965742324813117, 13871430865741604308, 581610329922371147, 8250812173422443178, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5677068088590394277, 420461259745383997, 5461641667913740527, 12375228725744876260, 10408597074326334289, 17926066510128935923, 11042755251558401992, 16568845003086625163, 16445466086575260512, 3993419962022258191, 5798502399718959312, 14694981892968238671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13067481717060632118, 17094012225747072853, 4977882380646661156, 13367890413392736054, 1854469405851562328, 1264814027228690376, 1655214279385078584, 4695178656129701184, 14688957924306712254, 6722743736070459606, 5346182502077854664, 485814636516518185, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17366862825980504064, 16556024871956851478, 5148753722704728721, 15438373163420410642, 5120877191992423544, 15123699931666188121, 17558359767143120899, 1678315832465296045, 16306354913676224825, 1297747773924291443, 14220066076326577834, 14546030952858743710, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526, 6125088443291536169, 2665390174743669239, 18009389558374812227, 15789153556893733830, 16604794485775028126, 15433589206667095645, 1379414419793409060, 17545164675990066495, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(11) }, program_info: ProgramInfo { program_hash: Word([12752059346458920613, 18135096529078946099, 13200399719329805350, 905179285088193526]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 12, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_07.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_07.snap index 1d5017e559..8a7edfcbe6 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_07.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_07.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 665741763369239996, 8212736248369912082, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000], [18375473735916206629, 0, 1, 1, 18375473735916206629, 5831108162926480783, 4071281311826053218, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331], [2105717247508690050, 0, 0, 0, 2105717247508690050, 7330889791923421278, 16681111697957494384, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271], [1679902783560062568, 0, 0, 0, 1679902783560062568, 13218130135561237014, 6160598189905115531, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851], [8212736248369912082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4071281311826053218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16681111697957494384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6160598189905115531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 9999, 0, 0, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999], [9999, 9999, 9999, 0, 9999, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 8136249212351146192, 10784649219148085459, 128781735205120527, 4547968979093876849, 3546336675446295543, 10817940156349236625, 14189444001012371653, 5493374351233807563, 8311102902317058756, 6249712288789018971, 1614874318552505578, 8181452518454181592, 598477530791288280, 8307036201059139827, 17345949525972330427, 17120430504411685184, 9024048572557701022, 5442249363272202440, 8891889669188699464, 13981710006578989582, 15202252296288325862, 8901049526912687276, 11824695302249715491, 8477037444632037091, 10111259653022775679, 9872576991436394594, 13620574761069749666, 10552500864729979640, 18032794979945654604, 153382829717154572, 8442199976350624000, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 665741763369239996, 16242795687146137268, 321461142783715873, 2826379816086788535, 1389982844959459783, 7504428176840094167, 16867052141953300014, 6524645837583534023, 7971642927196132266, 895587693811363643, 14045043160415708545, 17186760898540197468, 11586158328390007250, 12564286920483154715, 14264987096664760063, 13473611649745551608, 3074526273535018608, 8192703318881365638, 11332735769645700919, 16102114657139125593, 17852385312535653754, 2362278605853243291, 7801968558670902550, 8976000347315438733, 13152720785410684086, 15178160026565391559, 16635907827753325426, 2952369032039574593, 2377128724052460864, 4064757387509104114, 5276412771718093926, 8212736248369912082, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 17377183675986858406, 16204388331933209503, 9851558383041711453, 2647731244796610075, 13479103754506160685, 1313884950803363652, 15346175195946058279, 8910192708346993775, 2151299325850503780, 16669085269506854818, 12924378726200437768, 5909277165962634165, 7995732842947875893, 14386798070662103151, 7879022579148049870, 15020611106200374787, 10724238176158470430, 15029834199037822311, 11678935371612262717, 7297009056930466619, 14511898776428524296, 319792799645144231, 13382186579597492216, 2694749223042447691, 13263694931203634375, 6000186529178301892, 16523385558055279056, 7022204645736728964, 5338134468072720249, 15645384100209479912, 9488069924049927331, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 5831108162926480783, 5716807500553500532, 340111207878988785, 18256387944673635196, 10860511098536981986, 8459821732881051520, 6920921369535874813, 16951093806716492481, 13791358524817111974, 5736505110286114902, 6134208873573181149, 9775353746636648794, 10511806043496923148, 16994604820290358508, 8663944065392476082, 7230189013861170101, 5624631671914610235, 6327683047402873297, 4175477208176608783, 954074467059951894, 9430822593953620080, 3254964387338063442, 14616933013502048910, 323829297696706606, 15299582253555179912, 8256585982323809806, 16419251794401517641, 11559790149908051338, 2239581712082993389, 12489932951016483829, 11738733634614750668, 4071281311826053218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 3107344020706784815, 7535295255934147784, 14961534904937133494, 15458110929197782417, 5854257801187918217, 7408528896221680379, 7195773034137126318, 6953015881067099300, 8311075386067189185, 7490596925699016321, 2748780903535738274, 14124675439405907210, 13467811864817035684, 12069265029549314681, 8713544979421645407, 7271740931964389253, 13358005363663908988, 1445604555428043843, 15414631947824553103, 3604233398898996465, 11389542141657004950, 753657943574098354, 16156878489884540028, 1283495432526365661, 15770030010231724104, 4992467617151662209, 9388418952293233141, 12063673466969028652, 6266501778891918617, 17390445613818630245, 3589804369840038271, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 7330889791923421278, 17979691280170131106, 16980963677900604856, 15976151213056828438, 92714918004478284, 17365496272474871894, 17001192471520708179, 3321277494654107778, 16893172732645584491, 2027752104829715962, 15452271030076785961, 2501796678284190373, 5676660220829808154, 13123673595423766920, 26738717326360259, 17483757498059224444, 12817208054146358362, 6986963031258272860, 16687757358165325375, 18027249453476092631, 15075850538217806798, 4190259332272306773, 2553182391312160489, 6173756644452043592, 7042376686216238529, 38980987021367719, 12463158039410249198, 7049795244189838947, 7060420962088551737, 9342274029206616333, 1435264878438078251, 16681111697957494384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 1730400919877242464, 8594455900178560628, 5726930420197336139, 13273590888045863622, 8753781667987110661, 12948922070052129184, 6957781166000927195, 11540514940863049397, 3555060714483297014, 9392868496609143397, 1424153760517090352, 9018810402297148417, 2907590405487611226, 16087116659981325603, 6124015441109604199, 15635572367538115795, 2170747068790740224, 3201993911066137312, 11259421084459541380, 9993917348799810609, 17222088454832638116, 15686086798273471220, 12787265931454127207, 607842291318703015, 13403753643599459835, 10689062953812945200, 12619604521626526557, 3744742376692732597, 7474246814889551252, 12416458660228151392, 11846932079106298851, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 13218130135561237014, 8897450981738644183, 8122025352910807675, 14806163515298168591, 5442054526001626765, 3774836954819930057, 7873436160289973996, 1985577549930980807, 379441097109437269, 1582743467085230093, 8777470251655517715, 10400069677678307421, 1177689384604532813, 16561198203506864486, 18413269984357459958, 1623867674755828306, 5071121402113212599, 11851310101017854885, 17866089753923079131, 12853565947951893885, 6966840703169954718, 2619660424044064391, 4642489055874642868, 6457652449305783921, 3582227845111194274, 9002213586940350635, 8120300831241327696, 7598230464484206583, 432418536618916281, 10696618739033813212, 2085147768356017783, 6160598189905115531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8212736248369912082, 13582507089316059702, 7058022398850579311, 14448859106484550632, 8488923843888712176, 14387511811111000559, 16343533314104084279, 7144420700209912913, 81438176960127805, 11353579355252691279, 15391029939397732169, 13654856085785737791, 17867630563899600855, 15638494238775280514, 15278759115432814741, 9672833929788573796, 8499991101857103008, 4277878641698006595, 12990966731553386694, 325849556554992531, 16823455732252835952, 10325677389248902106, 17215632082750072073, 5871229270093729693, 1418595653525548799, 1623140794865507125, 3521868013962458536, 7592427336074080103, 8813490692122304227, 15033504818965134746, 671768789535371387, 6002676145170957552, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 0, 17344769878280361092, 2672032990889952726, 10966643852490493990, 2592429945178091576, 8172562148455605634, 14004003701484837955, 12834107981647449396, 9875636580100479976, 12047948199477092131, 8025491038733220165, 491259531166040341, 14832623839190995610, 14697509357953676418, 5789610466730383818, 388263584830521272, 7439414156048078496, 15784515228652197776, 11049955424692728889, 14895470599018577003, 7841617945839187879, 17455550201169057010, 2534236084163066389, 6762591351360230328, 5346858927664762265, 7945321262401027963, 10750885965856570936, 12370887997614982110, 16868606775754956395, 12653757924793616214, 11706271638131904220, 10827276321637451859, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4071281311826053218, 8965269515246497704, 4610105990937441552, 14871257653827208567, 17566918610707158078, 4662267156400217313, 11925160665074583703, 7006577898090498820, 8933338746704632990, 14704958557312921128, 283685871938470517, 17049945775096584485, 1735922796599632945, 18137828521183364954, 1233454545325180310, 4616679305450045558, 799989113534058041, 9548215660109667029, 17638736186517997026, 12905149264926481878, 9206641926728869527, 11201231447988338022, 6044555324419572909, 4856995795253621298, 5361647435575923081, 6166078860096154852, 6696272579393185401, 1638259147884844478, 10134861521414682067, 17465898446534646298, 2270472397704099161, 5665896864361060199, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 0, 2858403750276750521, 18287547865064093386, 16643076982183140204, 17607797632632583753, 4606352897788642339, 16669380908105325740, 6888212917900510506, 9887976024132347018, 15672872160122205909, 10605120439023982124, 17832834191852929098, 11180362325911556985, 1797669589287132096, 18316393283013557997, 17455009848636139677, 4212485662162927177, 2684395608227063909, 10865000669694511781, 13048938138389391460, 13946693875892332716, 300901360739248952, 4186546104164144876, 3265288527569414193, 8781944488148208732, 14923610741876695933, 9614148693204557112, 9347068782470538323, 17518823857230050559, 7139121107914525514, 470824845274439747, 1419643695620305796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16681111697957494384, 9850604216542701406, 14292233265078610671, 11560507218468362083, 11435884371355098677, 707619676799722739, 13157092351337171268, 2418773787696448890, 4672379866331806862, 14371817650991869953, 3768839363733198769, 9708763303767628077, 11396390941757961228, 4785785956560501030, 16036499041626449319, 9630510095026498877, 7634220798360289556, 5119649922187981964, 6331607203065781588, 16919596794918736104, 32726321504424883, 10309269913347989302, 14782015448458484884, 14683358530499849942, 7836268277036786901, 15462421617591871273, 12213179217732598594, 14536234064731365163, 3637686875728492502, 2382678006125050452, 14226016292255835291, 589873375673641870, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 18213217674792357841, 6883907187243818989, 10614920431791547888, 13376310260819809150, 970536228322621221, 5786498633534169345, 13904299833493296337, 18182241650367492861, 4671451809489883858, 10519951415050407991, 9409416070961479945, 9277815292140415791, 84450611619755921, 13615028923015526256, 15760906032947657328, 10394291523020808732, 14504653302726904108, 8315708932196998089, 2409075654026148870, 367320422432359503, 6139056775213015570, 6944063758267220406, 4458873320026667405, 12662780608684972080, 15472797447424064358, 4158450525844909688, 2549026714004541517, 3246198533692444934, 3222033110084083257, 5683784147168326312, 7836113917086293276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6160598189905115531, 18025956107099608580, 11512968082996599149, 1159818605994823015, 2364926874595277907, 7943063494760571709, 16605271790117727213, 11825547519897455023, 15342799649049057800, 3763048797193456654, 1295787082959371660, 16691905436935888241, 1915507152031483536, 17009264450373861587, 16328475049153986635, 8830519937889782762, 10115241278692937317, 1750096680784451786, 16653566373055583790, 4332235233085094180, 627717841813244731, 4706384122596616028, 219643739348167868, 10259409981493264670, 13239490680913326732, 182727077359841351, 8469105874522435313, 8517021520884886781, 3404810976915461357, 3829882598743334141, 14062283116063151751, 1610809089415408623, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 4448725490869322134, 16773782102167370766, 9517551778943323923, 9735157781939056258, 13685677539131842935, 74410881992624137, 16112118280329224188, 16455044890046321010, 3166113086359297763, 4123774883019480954, 8049700212209077372, 9143498805844601837, 1269471574449064045, 17099282884571514622, 17951548125515157165, 15320893071039302787, 16371352256021817139, 17154595820341397772, 5088265715035438397, 12952269508513821163, 2910118210482029454, 1585088611936329987, 16759292612217335519, 9851596960932027140, 8679788143435043297, 7792109010626424915, 3420624790371920563, 7480053259498635867, 3615950593461764641, 16487019928286415392, 10289142213544989468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1090670744084208003, 3080746365611415597, 6133575519759388325, 11695447135684149141, 6615075028106709917, 10277147404869816105, 15962120449122821193, 1254198290967296340, 2925289410746405164, 12104312877316532634, 14739488160024614333, 10743573083299131194, 12707577723315108285, 8945689852522735768, 14566241909712907104, 9028236766089923761, 10185013658812384549, 3941868484557913621, 16462538463092115913, 5673651272129016554, 1223470853173331157, 2788160682175050931, 1502692624900434396, 5566335148331577393, 17762829217961409285, 3389969163810664285, 7437527833076252327, 17084466347038006872, 6606368157240498477, 13093088208853880999, 1276807186500217245, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 17344769878280361687, 11249881205591563163, 16071218949222383338, 546830354766363539, 7776682728634159270, 11209888800273182957, 14728140374725612977, 8386791303267182172, 9638626268997275972, 822684530408571288, 16951904742993551809, 825915008780272344, 18209952013401698562, 390611853699198814, 11327187383464966515, 12709202232488054070, 11552589705164935867, 12311030232489101343, 5023941437735028493, 16069569499603265432, 18063718751316981145, 4010755700397089888, 10892805137373131994, 9089377676555868962, 1220818432464721625, 13088066304082794059, 8657669536399661454, 419065699932221163, 3886495484944885171, 1240710433266681785, 5374430875291145484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 2631903040606257959, 11859146482331138479, 12232695746376293294, 995389826954784529, 11949085664163595757, 4404337953750906792, 6908862958628621571, 12608149157887976305, 4754146580783023412, 14308250014803856580, 9454287016901482416, 9789905333959995060, 3771810096516115799, 2150959420327906479, 14538218150241396541, 6425179495446994078, 17565393891424303638, 3667075674391371806, 5731318824387052908, 4241445880929460300, 13107360446062265038, 4176811711023066147, 5250671015911848716, 4722672072326683708, 7171204772415813456, 5618587527864308269, 16458991436693873868, 2626622112813681720, 4599215552676510549, 5363423870755590475, 4352525099414593256, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 85, 2858403750276751031, 1709210755771630360, 11707086547963657475, 2794745820933624420, 2841923277622193225, 16490991381302584921, 5788783276303277595, 14692549583873964816, 9815954444411995352, 16153761647449809543, 6052645635446937049, 17304693813258262086, 11634259222665431081, 12233143040630128964, 8553846008642101336, 18388379526128378444, 15548258272185388836, 15360138454847963029, 3440439455019208235, 7218244406354738621, 5887183982672949081, 15870877452527488142, 15139518776246125573, 5433537245583001116, 13408133831989321267, 4656955130371010155, 14539571260147117550, 17118765335121629772, 3475198118169682060, 11483695604905597390, 11783370765491737635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10468230768888023862, 11664682242720909218, 2500570831459298438, 13004725650794618836, 8624527149940617200, 11524055993362242048, 6182388235200005336, 2589834268393847902, 12931236615531993709, 8584449549244767688, 11899064714918281636, 16246984277558583019, 8772638227416864166, 11946855882944424845, 16440133693312412286, 14737175326378679956, 7842923952979169755, 2398501113047325856, 14599944340506938939, 5936050971291911531, 8286147454062396089, 14343924012975607961, 8190973727913189622, 1134938007864643353, 12054037840221089027, 10050755079785196589, 10469731445849191380, 10906931598039016782, 16150808274840457147, 13280081123993966327, 5571840125263174859, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 18213217674792358096, 13599297410359034734, 11548640197966434952, 16397756946501824199, 4509993724149584481, 15279575547763923315, 14387788336990426452, 1679695851270735493, 737550782574904766, 16619718868892680991, 4189079835826917979, 16548334619034420779, 2523584064344323171, 18357860221728901477, 9223263721501613140, 836498427651453899, 11050299770631141961, 1906255442715510922, 16855485989141196504, 12664144355455319157, 17100007635940521879, 307480490272233054, 14791890923980574308, 14809283111081511220, 1272668898289027998, 1746726629032389326, 781443211491376776, 4235062597258109895, 17016381150799971149, 387032599105912823, 13820432364368151262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 12734367032130478571, 915471480408530766, 18393930191488027312, 13545212286845976163, 18210660875436245579, 1541989510332303929, 5733187932229069792, 8676871105886252208, 15648333801800339703, 12513161021723575557, 9265666514596208448, 10311060571948838328, 15479186567637803235, 9457367929087028434, 10997859361453741844, 4801586725411290698, 8358881080234670725, 14262453638255884367, 3602771739252146288, 6541843013709002421, 3170708104995675453, 10921877432993541182, 10224257779706313529, 15830149545637956450, 13414249448981002451, 11722023958758893627, 18138185027267907899, 13905103948731397841, 9009398081722850699, 16014363687546775515, 10945967283455090973, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 4448725490869322219, 4944140066849387506, 2095785635431009262, 12375413327700682072, 11081872751342419742, 18058781214879352230, 17856276381917295190, 6718639559482054424, 668947051234094647, 3868828750372286402, 12122170781554046887, 4343898307694473975, 12690125861105998824, 16799534473726304569, 15934980937477619093, 3969747009451350970, 7686328019139102331, 3785180857099199084, 11986142858341385519, 2506152622879710750, 18430687071203156938, 3054089675267069232, 8760992635981950709, 11143171037695874494, 4733232646684685861, 1219894586292412814, 12600138307490245388, 824784286256764128, 10170016208525526833, 593495485489349093, 11923860796119339735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(8) }, program_info: ProgramInfo { program_hash: Word([8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 9, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 96, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 6002676145170957552, 5665896864361060199, 589873375673641870, 1610809089415408623, 1276807186500217245, 4352525099414593256, 5571840125263174859, 10945967283455090973, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 10827276321637451859, 1419643695620305796, 7836113917086293276, 10289142213544989468, 5374430875291145484, 11783370765491737635, 13820432364368151262, 11923860796119339735, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 1, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 1, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 1, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 1, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 1, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 1, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 1, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 1, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 1, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 85, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 321461142783715873, 340111207878988785, 16980963677900604856, 8122025352910807675, 2672032990889952726, 18287547865064093386, 6883907187243818989, 16773782102167370766, 11249881205591563163, 1709210755771630360, 13599297410359034734, 4944140066849387506, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2826379816086788535, 18256387944673635196, 15976151213056828438, 14806163515298168591, 10966643852490493990, 16643076982183140204, 10614920431791547888, 9517551778943323923, 16071218949222383338, 11707086547963657475, 11548640197966434952, 2095785635431009262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1389982844959459783, 10860511098536981986, 92714918004478284, 5442054526001626765, 2592429945178091576, 17607797632632583753, 13376310260819809150, 9735157781939056258, 546830354766363539, 2794745820933624420, 16397756946501824199, 12375413327700682072, 1, 0, 0, 0, 1, 0, 7216891187249046669, 17104304802226135179, 213723419203905114, 7504428176840094167, 8459821732881051520, 17365496272474871894, 3774836954819930057, 8172562148455605634, 4606352897788642339, 970536228322621221, 13685677539131842935, 7776682728634159270, 2841923277622193225, 4509993724149584481, 11081872751342419742, 1, 0, 0, 0, 1, 0, 13630982819704974164, 709629587910116102, 10852437178432066259, 7971642927196132266, 13791358524817111974, 16893172732645584491, 379441097109437269, 9875636580100479976, 9887976024132347018, 18182241650367492861, 16455044890046321010, 8386791303267182172, 14692549583873964816, 1679695851270735493, 6718639559482054424, 1, 0, 0, 0, 1, 0, 16461193933015291689, 9011520252233625918, 15300572918329198995, 17186760898540197468, 9775353746636648794, 2501796678284190373, 10400069677678307421, 491259531166040341, 17832834191852929098, 9409416070961479945, 8049700212209077372, 16951904742993551809, 6052645635446937049, 4189079835826917979, 12122170781554046887, 1, 0, 0, 0, 1, 0, 13955125520582449746, 13107809866340143246, 13139247942561227813, 14264987096664760063, 8663944065392476082, 26738717326360259, 18413269984357459958, 5789610466730383818, 18316393283013557997, 13615028923015526256, 17099282884571514622, 390611853699198814, 12233143040630128964, 18357860221728901477, 16799534473726304569, 1, 0, 0, 0, 1, 0, 14763764810165002571, 7475534393389499071, 4111976696170618769, 8192703318881365638, 6327683047402873297, 6986963031258272860, 11851310101017854885, 15784515228652197776, 2684395608227063909, 14504653302726904108, 16371352256021817139, 11552589705164935867, 15548258272185388836, 11050299770631141961, 7686328019139102331, 1, 0, 0, 0, 1, 0, 5685269238246855930, 7640663189411641925, 12336665115542599217, 17852385312535653754, 9430822593953620080, 15075850538217806798, 6966840703169954718, 7841617945839187879, 13946693875892332716, 367320422432359503, 12952269508513821163, 16069569499603265432, 7218244406354738621, 12664144355455319157, 2506152622879710750, 1, 0, 0, 0, 1, 0, 1427472554639263168, 18418882661072479711, 9257829930238828548, 8976000347315438733, 323829297696706606, 6173756644452043592, 6457652449305783921, 6762591351360230328, 3265288527569414193, 4458873320026667405, 16759292612217335519, 10892805137373131994, 15139518776246125573, 14791890923980574308, 8760992635981950709, 1, 0, 0, 0, 1, 0, 7302903671861085826, 0, 0, 16635907827753325426, 16419251794401517641, 12463158039410249198, 8120300831241327696, 10750885965856570936, 9614148693204557112, 4158450525844909688, 7792109010626424915, 13088066304082794059, 4656955130371010155, 1746726629032389326, 1219894586292412814, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2377128724052460864, 2239581712082993389, 7060420962088551737, 432418536618916281, 16868606775754956395, 17518823857230050559, 3246198533692444934, 7480053259498635867, 419065699932221163, 17118765335121629772, 4235062597258109895, 824784286256764128, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4064757387509104114, 12489932951016483829, 9342274029206616333, 10696618739033813212, 12653757924793616214, 7139121107914525514, 3222033110084083257, 3615950593461764641, 3886495484944885171, 3475198118169682060, 17016381150799971149, 10170016208525526833, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5276412771718093926, 11738733634614750668, 1435264878438078251, 2085147768356017783, 11706271638131904220, 470824845274439747, 5683784147168326312, 16487019928286415392, 1240710433266681785, 11483695604905597390, 387032599105912823, 593495485489349093, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 10827276321637451859, 1419643695620305796, 7836113917086293276, 10289142213544989468, 5374430875291145484, 11783370765491737635, 13820432364368151262, 11923860796119339735, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10784649219148085459, 16204388331933209503, 7535295255934147784, 8594455900178560628, 7058022398850579311, 4610105990937441552, 14292233265078610671, 11512968082996599149, 3080746365611415597, 11859146482331138479, 11664682242720909218, 915471480408530766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 128781735205120527, 9851558383041711453, 14961534904937133494, 5726930420197336139, 14448859106484550632, 14871257653827208567, 11560507218468362083, 1159818605994823015, 6133575519759388325, 12232695746376293294, 2500570831459298438, 18393930191488027312, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4547968979093876849, 2647731244796610075, 15458110929197782417, 13273590888045863622, 8488923843888712176, 17566918610707158078, 11435884371355098677, 2364926874595277907, 11695447135684149141, 995389826954784529, 13004725650794618836, 13545212286845976163, 1, 0, 0, 0, 1, 0, 10963869565254465549, 3178875389651486587, 584333678278801940, 3546336675446295543, 13479103754506160685, 5854257801187918217, 8753781667987110661, 14387511811111000559, 4662267156400217313, 707619676799722739, 7943063494760571709, 6615075028106709917, 11949085664163595757, 8624527149940617200, 18210660875436245579, 1, 0, 0, 0, 1, 0, 7672596955217153457, 5064179278899630287, 15824928726849370210, 5493374351233807563, 8910192708346993775, 6953015881067099300, 11540514940863049397, 81438176960127805, 8933338746704632990, 4672379866331806862, 15342799649049057800, 1254198290967296340, 12608149157887976305, 2589834268393847902, 8676871105886252208, 1, 0, 0, 0, 1, 0, 3531253839134075838, 16735896821376739720, 8167081614237821546, 1614874318552505578, 12924378726200437768, 2748780903535738274, 1424153760517090352, 13654856085785737791, 17049945775096584485, 9708763303767628077, 16691905436935888241, 14739488160024614333, 9454287016901482416, 11899064714918281636, 9265666514596208448, 1, 0, 0, 0, 1, 0, 13609225654816031898, 16627834940022015256, 10557198230311183963, 8307036201059139827, 14386798070662103151, 12069265029549314681, 16087116659981325603, 15278759115432814741, 1233454545325180310, 16036499041626449319, 16328475049153986635, 8945689852522735768, 2150959420327906479, 11946855882944424845, 9457367929087028434, 1, 0, 0, 0, 1, 0, 17700630260394682670, 10564666254450756820, 13128612970712110036, 9024048572557701022, 10724238176158470430, 13358005363663908988, 2170747068790740224, 4277878641698006595, 9548215660109667029, 5119649922187981964, 1750096680784451786, 10185013658812384549, 17565393891424303638, 7842923952979169755, 8358881080234670725, 1, 0, 0, 0, 1, 0, 12969929663590209562, 17400427229379047873, 8161725761906333130, 13981710006578989582, 7297009056930466619, 3604233398898996465, 9993917348799810609, 16823455732252835952, 9206641926728869527, 32726321504424883, 627717841813244731, 5673651272129016554, 4241445880929460300, 5936050971291911531, 6541843013709002421, 1, 0, 0, 0, 1, 0, 12686638732510422112, 8915914979000954491, 17429665533669488649, 11824695302249715491, 13382186579597492216, 16156878489884540028, 12787265931454127207, 5871229270093729693, 4856995795253621298, 14683358530499849942, 10259409981493264670, 1502692624900434396, 5250671015911848716, 8190973727913189622, 10224257779706313529, 1, 0, 0, 0, 1, 0, 15763807785631230887, 0, 0, 9872576991436394594, 6000186529178301892, 4992467617151662209, 10689062953812945200, 3521868013962458536, 6696272579393185401, 12213179217732598594, 8469105874522435313, 3389969163810664285, 5618587527864308269, 10050755079785196589, 11722023958758893627, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10552500864729979640, 7022204645736728964, 12063673466969028652, 3744742376692732597, 8813490692122304227, 10134861521414682067, 3637686875728492502, 3404810976915461357, 17084466347038006872, 2626622112813681720, 10906931598039016782, 13905103948731397841, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18032794979945654604, 5338134468072720249, 6266501778891918617, 7474246814889551252, 15033504818965134746, 17465898446534646298, 2382678006125050452, 3829882598743334141, 6606368157240498477, 4599215552676510549, 16150808274840457147, 9009398081722850699, 1, 0, 0, 0, 1, 0, 0, 0, 0, 153382829717154572, 15645384100209479912, 17390445613818630245, 12416458660228151392, 671768789535371387, 2270472397704099161, 14226016292255835291, 14062283116063151751, 13093088208853880999, 5363423870755590475, 13280081123993966327, 16014363687546775515, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 6002676145170957552, 5665896864361060199, 589873375673641870, 1610809089415408623, 1276807186500217245, 4352525099414593256, 5571840125263174859, 10945967283455090973, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(8) }, program_info: ProgramInfo { program_hash: Word([8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 9, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_08.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_08.snap index 1d5017e559..8a7edfcbe6 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_08.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_08.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 665741763369239996, 8212736248369912082, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000], [18375473735916206629, 0, 1, 1, 18375473735916206629, 5831108162926480783, 4071281311826053218, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331], [2105717247508690050, 0, 0, 0, 2105717247508690050, 7330889791923421278, 16681111697957494384, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271], [1679902783560062568, 0, 0, 0, 1679902783560062568, 13218130135561237014, 6160598189905115531, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851], [8212736248369912082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4071281311826053218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16681111697957494384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6160598189905115531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 9999, 0, 0, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999], [9999, 9999, 9999, 0, 9999, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 8136249212351146192, 10784649219148085459, 128781735205120527, 4547968979093876849, 3546336675446295543, 10817940156349236625, 14189444001012371653, 5493374351233807563, 8311102902317058756, 6249712288789018971, 1614874318552505578, 8181452518454181592, 598477530791288280, 8307036201059139827, 17345949525972330427, 17120430504411685184, 9024048572557701022, 5442249363272202440, 8891889669188699464, 13981710006578989582, 15202252296288325862, 8901049526912687276, 11824695302249715491, 8477037444632037091, 10111259653022775679, 9872576991436394594, 13620574761069749666, 10552500864729979640, 18032794979945654604, 153382829717154572, 8442199976350624000, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 665741763369239996, 16242795687146137268, 321461142783715873, 2826379816086788535, 1389982844959459783, 7504428176840094167, 16867052141953300014, 6524645837583534023, 7971642927196132266, 895587693811363643, 14045043160415708545, 17186760898540197468, 11586158328390007250, 12564286920483154715, 14264987096664760063, 13473611649745551608, 3074526273535018608, 8192703318881365638, 11332735769645700919, 16102114657139125593, 17852385312535653754, 2362278605853243291, 7801968558670902550, 8976000347315438733, 13152720785410684086, 15178160026565391559, 16635907827753325426, 2952369032039574593, 2377128724052460864, 4064757387509104114, 5276412771718093926, 8212736248369912082, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 17377183675986858406, 16204388331933209503, 9851558383041711453, 2647731244796610075, 13479103754506160685, 1313884950803363652, 15346175195946058279, 8910192708346993775, 2151299325850503780, 16669085269506854818, 12924378726200437768, 5909277165962634165, 7995732842947875893, 14386798070662103151, 7879022579148049870, 15020611106200374787, 10724238176158470430, 15029834199037822311, 11678935371612262717, 7297009056930466619, 14511898776428524296, 319792799645144231, 13382186579597492216, 2694749223042447691, 13263694931203634375, 6000186529178301892, 16523385558055279056, 7022204645736728964, 5338134468072720249, 15645384100209479912, 9488069924049927331, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 5831108162926480783, 5716807500553500532, 340111207878988785, 18256387944673635196, 10860511098536981986, 8459821732881051520, 6920921369535874813, 16951093806716492481, 13791358524817111974, 5736505110286114902, 6134208873573181149, 9775353746636648794, 10511806043496923148, 16994604820290358508, 8663944065392476082, 7230189013861170101, 5624631671914610235, 6327683047402873297, 4175477208176608783, 954074467059951894, 9430822593953620080, 3254964387338063442, 14616933013502048910, 323829297696706606, 15299582253555179912, 8256585982323809806, 16419251794401517641, 11559790149908051338, 2239581712082993389, 12489932951016483829, 11738733634614750668, 4071281311826053218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 3107344020706784815, 7535295255934147784, 14961534904937133494, 15458110929197782417, 5854257801187918217, 7408528896221680379, 7195773034137126318, 6953015881067099300, 8311075386067189185, 7490596925699016321, 2748780903535738274, 14124675439405907210, 13467811864817035684, 12069265029549314681, 8713544979421645407, 7271740931964389253, 13358005363663908988, 1445604555428043843, 15414631947824553103, 3604233398898996465, 11389542141657004950, 753657943574098354, 16156878489884540028, 1283495432526365661, 15770030010231724104, 4992467617151662209, 9388418952293233141, 12063673466969028652, 6266501778891918617, 17390445613818630245, 3589804369840038271, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 7330889791923421278, 17979691280170131106, 16980963677900604856, 15976151213056828438, 92714918004478284, 17365496272474871894, 17001192471520708179, 3321277494654107778, 16893172732645584491, 2027752104829715962, 15452271030076785961, 2501796678284190373, 5676660220829808154, 13123673595423766920, 26738717326360259, 17483757498059224444, 12817208054146358362, 6986963031258272860, 16687757358165325375, 18027249453476092631, 15075850538217806798, 4190259332272306773, 2553182391312160489, 6173756644452043592, 7042376686216238529, 38980987021367719, 12463158039410249198, 7049795244189838947, 7060420962088551737, 9342274029206616333, 1435264878438078251, 16681111697957494384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 1730400919877242464, 8594455900178560628, 5726930420197336139, 13273590888045863622, 8753781667987110661, 12948922070052129184, 6957781166000927195, 11540514940863049397, 3555060714483297014, 9392868496609143397, 1424153760517090352, 9018810402297148417, 2907590405487611226, 16087116659981325603, 6124015441109604199, 15635572367538115795, 2170747068790740224, 3201993911066137312, 11259421084459541380, 9993917348799810609, 17222088454832638116, 15686086798273471220, 12787265931454127207, 607842291318703015, 13403753643599459835, 10689062953812945200, 12619604521626526557, 3744742376692732597, 7474246814889551252, 12416458660228151392, 11846932079106298851, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 13218130135561237014, 8897450981738644183, 8122025352910807675, 14806163515298168591, 5442054526001626765, 3774836954819930057, 7873436160289973996, 1985577549930980807, 379441097109437269, 1582743467085230093, 8777470251655517715, 10400069677678307421, 1177689384604532813, 16561198203506864486, 18413269984357459958, 1623867674755828306, 5071121402113212599, 11851310101017854885, 17866089753923079131, 12853565947951893885, 6966840703169954718, 2619660424044064391, 4642489055874642868, 6457652449305783921, 3582227845111194274, 9002213586940350635, 8120300831241327696, 7598230464484206583, 432418536618916281, 10696618739033813212, 2085147768356017783, 6160598189905115531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8212736248369912082, 13582507089316059702, 7058022398850579311, 14448859106484550632, 8488923843888712176, 14387511811111000559, 16343533314104084279, 7144420700209912913, 81438176960127805, 11353579355252691279, 15391029939397732169, 13654856085785737791, 17867630563899600855, 15638494238775280514, 15278759115432814741, 9672833929788573796, 8499991101857103008, 4277878641698006595, 12990966731553386694, 325849556554992531, 16823455732252835952, 10325677389248902106, 17215632082750072073, 5871229270093729693, 1418595653525548799, 1623140794865507125, 3521868013962458536, 7592427336074080103, 8813490692122304227, 15033504818965134746, 671768789535371387, 6002676145170957552, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 0, 17344769878280361092, 2672032990889952726, 10966643852490493990, 2592429945178091576, 8172562148455605634, 14004003701484837955, 12834107981647449396, 9875636580100479976, 12047948199477092131, 8025491038733220165, 491259531166040341, 14832623839190995610, 14697509357953676418, 5789610466730383818, 388263584830521272, 7439414156048078496, 15784515228652197776, 11049955424692728889, 14895470599018577003, 7841617945839187879, 17455550201169057010, 2534236084163066389, 6762591351360230328, 5346858927664762265, 7945321262401027963, 10750885965856570936, 12370887997614982110, 16868606775754956395, 12653757924793616214, 11706271638131904220, 10827276321637451859, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4071281311826053218, 8965269515246497704, 4610105990937441552, 14871257653827208567, 17566918610707158078, 4662267156400217313, 11925160665074583703, 7006577898090498820, 8933338746704632990, 14704958557312921128, 283685871938470517, 17049945775096584485, 1735922796599632945, 18137828521183364954, 1233454545325180310, 4616679305450045558, 799989113534058041, 9548215660109667029, 17638736186517997026, 12905149264926481878, 9206641926728869527, 11201231447988338022, 6044555324419572909, 4856995795253621298, 5361647435575923081, 6166078860096154852, 6696272579393185401, 1638259147884844478, 10134861521414682067, 17465898446534646298, 2270472397704099161, 5665896864361060199, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 0, 2858403750276750521, 18287547865064093386, 16643076982183140204, 17607797632632583753, 4606352897788642339, 16669380908105325740, 6888212917900510506, 9887976024132347018, 15672872160122205909, 10605120439023982124, 17832834191852929098, 11180362325911556985, 1797669589287132096, 18316393283013557997, 17455009848636139677, 4212485662162927177, 2684395608227063909, 10865000669694511781, 13048938138389391460, 13946693875892332716, 300901360739248952, 4186546104164144876, 3265288527569414193, 8781944488148208732, 14923610741876695933, 9614148693204557112, 9347068782470538323, 17518823857230050559, 7139121107914525514, 470824845274439747, 1419643695620305796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16681111697957494384, 9850604216542701406, 14292233265078610671, 11560507218468362083, 11435884371355098677, 707619676799722739, 13157092351337171268, 2418773787696448890, 4672379866331806862, 14371817650991869953, 3768839363733198769, 9708763303767628077, 11396390941757961228, 4785785956560501030, 16036499041626449319, 9630510095026498877, 7634220798360289556, 5119649922187981964, 6331607203065781588, 16919596794918736104, 32726321504424883, 10309269913347989302, 14782015448458484884, 14683358530499849942, 7836268277036786901, 15462421617591871273, 12213179217732598594, 14536234064731365163, 3637686875728492502, 2382678006125050452, 14226016292255835291, 589873375673641870, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 18213217674792357841, 6883907187243818989, 10614920431791547888, 13376310260819809150, 970536228322621221, 5786498633534169345, 13904299833493296337, 18182241650367492861, 4671451809489883858, 10519951415050407991, 9409416070961479945, 9277815292140415791, 84450611619755921, 13615028923015526256, 15760906032947657328, 10394291523020808732, 14504653302726904108, 8315708932196998089, 2409075654026148870, 367320422432359503, 6139056775213015570, 6944063758267220406, 4458873320026667405, 12662780608684972080, 15472797447424064358, 4158450525844909688, 2549026714004541517, 3246198533692444934, 3222033110084083257, 5683784147168326312, 7836113917086293276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6160598189905115531, 18025956107099608580, 11512968082996599149, 1159818605994823015, 2364926874595277907, 7943063494760571709, 16605271790117727213, 11825547519897455023, 15342799649049057800, 3763048797193456654, 1295787082959371660, 16691905436935888241, 1915507152031483536, 17009264450373861587, 16328475049153986635, 8830519937889782762, 10115241278692937317, 1750096680784451786, 16653566373055583790, 4332235233085094180, 627717841813244731, 4706384122596616028, 219643739348167868, 10259409981493264670, 13239490680913326732, 182727077359841351, 8469105874522435313, 8517021520884886781, 3404810976915461357, 3829882598743334141, 14062283116063151751, 1610809089415408623, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 4448725490869322134, 16773782102167370766, 9517551778943323923, 9735157781939056258, 13685677539131842935, 74410881992624137, 16112118280329224188, 16455044890046321010, 3166113086359297763, 4123774883019480954, 8049700212209077372, 9143498805844601837, 1269471574449064045, 17099282884571514622, 17951548125515157165, 15320893071039302787, 16371352256021817139, 17154595820341397772, 5088265715035438397, 12952269508513821163, 2910118210482029454, 1585088611936329987, 16759292612217335519, 9851596960932027140, 8679788143435043297, 7792109010626424915, 3420624790371920563, 7480053259498635867, 3615950593461764641, 16487019928286415392, 10289142213544989468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1090670744084208003, 3080746365611415597, 6133575519759388325, 11695447135684149141, 6615075028106709917, 10277147404869816105, 15962120449122821193, 1254198290967296340, 2925289410746405164, 12104312877316532634, 14739488160024614333, 10743573083299131194, 12707577723315108285, 8945689852522735768, 14566241909712907104, 9028236766089923761, 10185013658812384549, 3941868484557913621, 16462538463092115913, 5673651272129016554, 1223470853173331157, 2788160682175050931, 1502692624900434396, 5566335148331577393, 17762829217961409285, 3389969163810664285, 7437527833076252327, 17084466347038006872, 6606368157240498477, 13093088208853880999, 1276807186500217245, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 17344769878280361687, 11249881205591563163, 16071218949222383338, 546830354766363539, 7776682728634159270, 11209888800273182957, 14728140374725612977, 8386791303267182172, 9638626268997275972, 822684530408571288, 16951904742993551809, 825915008780272344, 18209952013401698562, 390611853699198814, 11327187383464966515, 12709202232488054070, 11552589705164935867, 12311030232489101343, 5023941437735028493, 16069569499603265432, 18063718751316981145, 4010755700397089888, 10892805137373131994, 9089377676555868962, 1220818432464721625, 13088066304082794059, 8657669536399661454, 419065699932221163, 3886495484944885171, 1240710433266681785, 5374430875291145484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 2631903040606257959, 11859146482331138479, 12232695746376293294, 995389826954784529, 11949085664163595757, 4404337953750906792, 6908862958628621571, 12608149157887976305, 4754146580783023412, 14308250014803856580, 9454287016901482416, 9789905333959995060, 3771810096516115799, 2150959420327906479, 14538218150241396541, 6425179495446994078, 17565393891424303638, 3667075674391371806, 5731318824387052908, 4241445880929460300, 13107360446062265038, 4176811711023066147, 5250671015911848716, 4722672072326683708, 7171204772415813456, 5618587527864308269, 16458991436693873868, 2626622112813681720, 4599215552676510549, 5363423870755590475, 4352525099414593256, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 85, 2858403750276751031, 1709210755771630360, 11707086547963657475, 2794745820933624420, 2841923277622193225, 16490991381302584921, 5788783276303277595, 14692549583873964816, 9815954444411995352, 16153761647449809543, 6052645635446937049, 17304693813258262086, 11634259222665431081, 12233143040630128964, 8553846008642101336, 18388379526128378444, 15548258272185388836, 15360138454847963029, 3440439455019208235, 7218244406354738621, 5887183982672949081, 15870877452527488142, 15139518776246125573, 5433537245583001116, 13408133831989321267, 4656955130371010155, 14539571260147117550, 17118765335121629772, 3475198118169682060, 11483695604905597390, 11783370765491737635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10468230768888023862, 11664682242720909218, 2500570831459298438, 13004725650794618836, 8624527149940617200, 11524055993362242048, 6182388235200005336, 2589834268393847902, 12931236615531993709, 8584449549244767688, 11899064714918281636, 16246984277558583019, 8772638227416864166, 11946855882944424845, 16440133693312412286, 14737175326378679956, 7842923952979169755, 2398501113047325856, 14599944340506938939, 5936050971291911531, 8286147454062396089, 14343924012975607961, 8190973727913189622, 1134938007864643353, 12054037840221089027, 10050755079785196589, 10469731445849191380, 10906931598039016782, 16150808274840457147, 13280081123993966327, 5571840125263174859, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 18213217674792358096, 13599297410359034734, 11548640197966434952, 16397756946501824199, 4509993724149584481, 15279575547763923315, 14387788336990426452, 1679695851270735493, 737550782574904766, 16619718868892680991, 4189079835826917979, 16548334619034420779, 2523584064344323171, 18357860221728901477, 9223263721501613140, 836498427651453899, 11050299770631141961, 1906255442715510922, 16855485989141196504, 12664144355455319157, 17100007635940521879, 307480490272233054, 14791890923980574308, 14809283111081511220, 1272668898289027998, 1746726629032389326, 781443211491376776, 4235062597258109895, 17016381150799971149, 387032599105912823, 13820432364368151262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 12734367032130478571, 915471480408530766, 18393930191488027312, 13545212286845976163, 18210660875436245579, 1541989510332303929, 5733187932229069792, 8676871105886252208, 15648333801800339703, 12513161021723575557, 9265666514596208448, 10311060571948838328, 15479186567637803235, 9457367929087028434, 10997859361453741844, 4801586725411290698, 8358881080234670725, 14262453638255884367, 3602771739252146288, 6541843013709002421, 3170708104995675453, 10921877432993541182, 10224257779706313529, 15830149545637956450, 13414249448981002451, 11722023958758893627, 18138185027267907899, 13905103948731397841, 9009398081722850699, 16014363687546775515, 10945967283455090973, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 4448725490869322219, 4944140066849387506, 2095785635431009262, 12375413327700682072, 11081872751342419742, 18058781214879352230, 17856276381917295190, 6718639559482054424, 668947051234094647, 3868828750372286402, 12122170781554046887, 4343898307694473975, 12690125861105998824, 16799534473726304569, 15934980937477619093, 3969747009451350970, 7686328019139102331, 3785180857099199084, 11986142858341385519, 2506152622879710750, 18430687071203156938, 3054089675267069232, 8760992635981950709, 11143171037695874494, 4733232646684685861, 1219894586292412814, 12600138307490245388, 824784286256764128, 10170016208525526833, 593495485489349093, 11923860796119339735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(8) }, program_info: ProgramInfo { program_hash: Word([8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 9, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 96, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 6002676145170957552, 5665896864361060199, 589873375673641870, 1610809089415408623, 1276807186500217245, 4352525099414593256, 5571840125263174859, 10945967283455090973, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 10827276321637451859, 1419643695620305796, 7836113917086293276, 10289142213544989468, 5374430875291145484, 11783370765491737635, 13820432364368151262, 11923860796119339735, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 1, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 1, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 1, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 1, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 1, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 1, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 1, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 1, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 1, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 85, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 321461142783715873, 340111207878988785, 16980963677900604856, 8122025352910807675, 2672032990889952726, 18287547865064093386, 6883907187243818989, 16773782102167370766, 11249881205591563163, 1709210755771630360, 13599297410359034734, 4944140066849387506, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2826379816086788535, 18256387944673635196, 15976151213056828438, 14806163515298168591, 10966643852490493990, 16643076982183140204, 10614920431791547888, 9517551778943323923, 16071218949222383338, 11707086547963657475, 11548640197966434952, 2095785635431009262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1389982844959459783, 10860511098536981986, 92714918004478284, 5442054526001626765, 2592429945178091576, 17607797632632583753, 13376310260819809150, 9735157781939056258, 546830354766363539, 2794745820933624420, 16397756946501824199, 12375413327700682072, 1, 0, 0, 0, 1, 0, 7216891187249046669, 17104304802226135179, 213723419203905114, 7504428176840094167, 8459821732881051520, 17365496272474871894, 3774836954819930057, 8172562148455605634, 4606352897788642339, 970536228322621221, 13685677539131842935, 7776682728634159270, 2841923277622193225, 4509993724149584481, 11081872751342419742, 1, 0, 0, 0, 1, 0, 13630982819704974164, 709629587910116102, 10852437178432066259, 7971642927196132266, 13791358524817111974, 16893172732645584491, 379441097109437269, 9875636580100479976, 9887976024132347018, 18182241650367492861, 16455044890046321010, 8386791303267182172, 14692549583873964816, 1679695851270735493, 6718639559482054424, 1, 0, 0, 0, 1, 0, 16461193933015291689, 9011520252233625918, 15300572918329198995, 17186760898540197468, 9775353746636648794, 2501796678284190373, 10400069677678307421, 491259531166040341, 17832834191852929098, 9409416070961479945, 8049700212209077372, 16951904742993551809, 6052645635446937049, 4189079835826917979, 12122170781554046887, 1, 0, 0, 0, 1, 0, 13955125520582449746, 13107809866340143246, 13139247942561227813, 14264987096664760063, 8663944065392476082, 26738717326360259, 18413269984357459958, 5789610466730383818, 18316393283013557997, 13615028923015526256, 17099282884571514622, 390611853699198814, 12233143040630128964, 18357860221728901477, 16799534473726304569, 1, 0, 0, 0, 1, 0, 14763764810165002571, 7475534393389499071, 4111976696170618769, 8192703318881365638, 6327683047402873297, 6986963031258272860, 11851310101017854885, 15784515228652197776, 2684395608227063909, 14504653302726904108, 16371352256021817139, 11552589705164935867, 15548258272185388836, 11050299770631141961, 7686328019139102331, 1, 0, 0, 0, 1, 0, 5685269238246855930, 7640663189411641925, 12336665115542599217, 17852385312535653754, 9430822593953620080, 15075850538217806798, 6966840703169954718, 7841617945839187879, 13946693875892332716, 367320422432359503, 12952269508513821163, 16069569499603265432, 7218244406354738621, 12664144355455319157, 2506152622879710750, 1, 0, 0, 0, 1, 0, 1427472554639263168, 18418882661072479711, 9257829930238828548, 8976000347315438733, 323829297696706606, 6173756644452043592, 6457652449305783921, 6762591351360230328, 3265288527569414193, 4458873320026667405, 16759292612217335519, 10892805137373131994, 15139518776246125573, 14791890923980574308, 8760992635981950709, 1, 0, 0, 0, 1, 0, 7302903671861085826, 0, 0, 16635907827753325426, 16419251794401517641, 12463158039410249198, 8120300831241327696, 10750885965856570936, 9614148693204557112, 4158450525844909688, 7792109010626424915, 13088066304082794059, 4656955130371010155, 1746726629032389326, 1219894586292412814, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2377128724052460864, 2239581712082993389, 7060420962088551737, 432418536618916281, 16868606775754956395, 17518823857230050559, 3246198533692444934, 7480053259498635867, 419065699932221163, 17118765335121629772, 4235062597258109895, 824784286256764128, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4064757387509104114, 12489932951016483829, 9342274029206616333, 10696618739033813212, 12653757924793616214, 7139121107914525514, 3222033110084083257, 3615950593461764641, 3886495484944885171, 3475198118169682060, 17016381150799971149, 10170016208525526833, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5276412771718093926, 11738733634614750668, 1435264878438078251, 2085147768356017783, 11706271638131904220, 470824845274439747, 5683784147168326312, 16487019928286415392, 1240710433266681785, 11483695604905597390, 387032599105912823, 593495485489349093, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 10827276321637451859, 1419643695620305796, 7836113917086293276, 10289142213544989468, 5374430875291145484, 11783370765491737635, 13820432364368151262, 11923860796119339735, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10784649219148085459, 16204388331933209503, 7535295255934147784, 8594455900178560628, 7058022398850579311, 4610105990937441552, 14292233265078610671, 11512968082996599149, 3080746365611415597, 11859146482331138479, 11664682242720909218, 915471480408530766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 128781735205120527, 9851558383041711453, 14961534904937133494, 5726930420197336139, 14448859106484550632, 14871257653827208567, 11560507218468362083, 1159818605994823015, 6133575519759388325, 12232695746376293294, 2500570831459298438, 18393930191488027312, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4547968979093876849, 2647731244796610075, 15458110929197782417, 13273590888045863622, 8488923843888712176, 17566918610707158078, 11435884371355098677, 2364926874595277907, 11695447135684149141, 995389826954784529, 13004725650794618836, 13545212286845976163, 1, 0, 0, 0, 1, 0, 10963869565254465549, 3178875389651486587, 584333678278801940, 3546336675446295543, 13479103754506160685, 5854257801187918217, 8753781667987110661, 14387511811111000559, 4662267156400217313, 707619676799722739, 7943063494760571709, 6615075028106709917, 11949085664163595757, 8624527149940617200, 18210660875436245579, 1, 0, 0, 0, 1, 0, 7672596955217153457, 5064179278899630287, 15824928726849370210, 5493374351233807563, 8910192708346993775, 6953015881067099300, 11540514940863049397, 81438176960127805, 8933338746704632990, 4672379866331806862, 15342799649049057800, 1254198290967296340, 12608149157887976305, 2589834268393847902, 8676871105886252208, 1, 0, 0, 0, 1, 0, 3531253839134075838, 16735896821376739720, 8167081614237821546, 1614874318552505578, 12924378726200437768, 2748780903535738274, 1424153760517090352, 13654856085785737791, 17049945775096584485, 9708763303767628077, 16691905436935888241, 14739488160024614333, 9454287016901482416, 11899064714918281636, 9265666514596208448, 1, 0, 0, 0, 1, 0, 13609225654816031898, 16627834940022015256, 10557198230311183963, 8307036201059139827, 14386798070662103151, 12069265029549314681, 16087116659981325603, 15278759115432814741, 1233454545325180310, 16036499041626449319, 16328475049153986635, 8945689852522735768, 2150959420327906479, 11946855882944424845, 9457367929087028434, 1, 0, 0, 0, 1, 0, 17700630260394682670, 10564666254450756820, 13128612970712110036, 9024048572557701022, 10724238176158470430, 13358005363663908988, 2170747068790740224, 4277878641698006595, 9548215660109667029, 5119649922187981964, 1750096680784451786, 10185013658812384549, 17565393891424303638, 7842923952979169755, 8358881080234670725, 1, 0, 0, 0, 1, 0, 12969929663590209562, 17400427229379047873, 8161725761906333130, 13981710006578989582, 7297009056930466619, 3604233398898996465, 9993917348799810609, 16823455732252835952, 9206641926728869527, 32726321504424883, 627717841813244731, 5673651272129016554, 4241445880929460300, 5936050971291911531, 6541843013709002421, 1, 0, 0, 0, 1, 0, 12686638732510422112, 8915914979000954491, 17429665533669488649, 11824695302249715491, 13382186579597492216, 16156878489884540028, 12787265931454127207, 5871229270093729693, 4856995795253621298, 14683358530499849942, 10259409981493264670, 1502692624900434396, 5250671015911848716, 8190973727913189622, 10224257779706313529, 1, 0, 0, 0, 1, 0, 15763807785631230887, 0, 0, 9872576991436394594, 6000186529178301892, 4992467617151662209, 10689062953812945200, 3521868013962458536, 6696272579393185401, 12213179217732598594, 8469105874522435313, 3389969163810664285, 5618587527864308269, 10050755079785196589, 11722023958758893627, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10552500864729979640, 7022204645736728964, 12063673466969028652, 3744742376692732597, 8813490692122304227, 10134861521414682067, 3637686875728492502, 3404810976915461357, 17084466347038006872, 2626622112813681720, 10906931598039016782, 13905103948731397841, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18032794979945654604, 5338134468072720249, 6266501778891918617, 7474246814889551252, 15033504818965134746, 17465898446534646298, 2382678006125050452, 3829882598743334141, 6606368157240498477, 4599215552676510549, 16150808274840457147, 9009398081722850699, 1, 0, 0, 0, 1, 0, 0, 0, 0, 153382829717154572, 15645384100209479912, 17390445613818630245, 12416458660228151392, 671768789535371387, 2270472397704099161, 14226016292255835291, 14062283116063151751, 13093088208853880999, 5363423870755590475, 13280081123993966327, 16014363687546775515, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 6002676145170957552, 5665896864361060199, 589873375673641870, 1610809089415408623, 1276807186500217245, 4352525099414593256, 5571840125263174859, 10945967283455090973, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(8) }, program_info: ProgramInfo { program_hash: Word([8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 9, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_09.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_09.snap index ea5e0b6e37..24780891db 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_09.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_09.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 97, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 665741763369239996, 5296, 41, 0, 665741763369239996, 8212736248369912082, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000], [18375473735916206629, 0, 1, 1, 18375473735916206629, 5831108162926480783, 0, 65, 65, 5831108162926480783, 4071281311826053218, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331], [2105717247508690050, 0, 0, 0, 2105717247508690050, 7330889791923421278, 0, 0, 0, 7330889791923421278, 16681111697957494384, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271], [1679902783560062568, 0, 0, 0, 1679902783560062568, 13218130135561237014, 0, 0, 0, 13218130135561237014, 6160598189905115531, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851], [8212736248369912082, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4071281311826053218, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16681111697957494384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6160598189905115531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999], [0, 0, 0, 1, 0, 0, 9999, 9999, 0, 9999, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [9999, 9999, 9999, 9999, 9999, 9999, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 8136249212351146192, 10784649219148085459, 128781735205120527, 4547968979093876849, 3546336675446295543, 10817940156349236625, 14189444001012371653, 5493374351233807563, 8311102902317058756, 6249712288789018971, 1614874318552505578, 8181452518454181592, 598477530791288280, 8307036201059139827, 17345949525972330427, 17120430504411685184, 9024048572557701022, 5442249363272202440, 8891889669188699464, 13981710006578989582, 15202252296288325862, 8901049526912687276, 11824695302249715491, 8477037444632037091, 10111259653022775679, 9872576991436394594, 13620574761069749666, 10552500864729979640, 18032794979945654604, 153382829717154572, 8442199976350624000, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 665741763369239996, 16242795687146137268, 321461142783715873, 2826379816086788535, 1389982844959459783, 7504428176840094167, 16867052141953300014, 6524645837583534023, 7971642927196132266, 895587693811363643, 14045043160415708545, 17186760898540197468, 11586158328390007250, 12564286920483154715, 14264987096664760063, 13473611649745551608, 3074526273535018608, 8192703318881365638, 11332735769645700919, 16102114657139125593, 17852385312535653754, 2362278605853243291, 7801968558670902550, 8976000347315438733, 13152720785410684086, 15178160026565391559, 16635907827753325426, 2952369032039574593, 2377128724052460864, 4064757387509104114, 5276412771718093926, 8212736248369912082, 5296, 52960, 6811813611500970866, 12330218901740233931, 16287800225917557614, 2390658038828763199, 4670881323897574211, 15935136064817789611, 2699367049541735206, 5505690989019187676, 4740977976888162022, 5734803687955113279, 14716704723144357988, 4469212567425053522, 15617193812494172197, 4848896952878415343, 18385001813020718595, 3406927099241203725, 6500845817907766790, 14130590127555482700, 10343975768128176185, 15693873175844605389, 2059720903132940981, 3757345954094976880, 3089069334759629752, 18141223932492835937, 11387279664761561894, 5402048984901238600, 12664138717389652380, 8299034149894841811, 4141583402420192864, 665741763369239996, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 17377183675986858406, 16204388331933209503, 9851558383041711453, 2647731244796610075, 13479103754506160685, 1313884950803363652, 15346175195946058279, 8910192708346993775, 2151299325850503780, 16669085269506854818, 12924378726200437768, 5909277165962634165, 7995732842947875893, 14386798070662103151, 7879022579148049870, 15020611106200374787, 10724238176158470430, 15029834199037822311, 11678935371612262717, 7297009056930466619, 14511898776428524296, 319792799645144231, 13382186579597492216, 2694749223042447691, 13263694931203634375, 6000186529178301892, 16523385558055279056, 7022204645736728964, 5338134468072720249, 15645384100209479912, 9488069924049927331, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 5831108162926480783, 5716807500553500532, 340111207878988785, 18256387944673635196, 10860511098536981986, 8459821732881051520, 6920921369535874813, 16951093806716492481, 13791358524817111974, 5736505110286114902, 6134208873573181149, 9775353746636648794, 10511806043496923148, 16994604820290358508, 8663944065392476082, 7230189013861170101, 5624631671914610235, 6327683047402873297, 4175477208176608783, 954074467059951894, 9430822593953620080, 3254964387338063442, 14616933013502048910, 323829297696706606, 15299582253555179912, 8256585982323809806, 16419251794401517641, 11559790149908051338, 2239581712082993389, 12489932951016483829, 11738733634614750668, 4071281311826053218, 0, 42368, 9860311344216082483, 4356844177334189800, 8724150062868049447, 3846911055059526201, 16861225296757755735, 16925961143355054643, 7763338432894318220, 7504506723642096670, 11045006668578082721, 15092595329879644577, 4298948569114582870, 17810272068739440989, 13969944955380272714, 12356982018953263244, 16520418754635432271, 4689628285093180625, 7190852124445770478, 13072354659666011192, 1524422576558323017, 4274963317195893198, 12684756825761097033, 3511571172448102031, 823386573204270152, 9615020079928624381, 16119779393022010645, 17295023900181003317, 16373019178487693626, 13423474518210064130, 10379152206886126257, 5831108162926480783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 3107344020706784815, 7535295255934147784, 14961534904937133494, 15458110929197782417, 5854257801187918217, 7408528896221680379, 7195773034137126318, 6953015881067099300, 8311075386067189185, 7490596925699016321, 2748780903535738274, 14124675439405907210, 13467811864817035684, 12069265029549314681, 8713544979421645407, 7271740931964389253, 13358005363663908988, 1445604555428043843, 15414631947824553103, 3604233398898996465, 11389542141657004950, 753657943574098354, 16156878489884540028, 1283495432526365661, 15770030010231724104, 4992467617151662209, 9388418952293233141, 12063673466969028652, 6266501778891918617, 17390445613818630245, 3589804369840038271, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 7330889791923421278, 17979691280170131106, 16980963677900604856, 15976151213056828438, 92714918004478284, 17365496272474871894, 17001192471520708179, 3321277494654107778, 16893172732645584491, 2027752104829715962, 15452271030076785961, 2501796678284190373, 5676660220829808154, 13123673595423766920, 26738717326360259, 17483757498059224444, 12817208054146358362, 6986963031258272860, 16687757358165325375, 18027249453476092631, 15075850538217806798, 4190259332272306773, 2553182391312160489, 6173756644452043592, 7042376686216238529, 38980987021367719, 12463158039410249198, 7049795244189838947, 7060420962088551737, 9342274029206616333, 1435264878438078251, 16681111697957494384, 0, 10592, 279816225750213135, 3650402777016745376, 1781472746866786234, 10113987313323159199, 9398274187564883752, 16748408482785331310, 30358156203896034, 3074595635178688035, 6205342630873024293, 1697370376582801763, 8815094577559083340, 449557436115663881, 2151092097708635255, 7636620675010033430, 2307825524015342399, 8991051645303444091, 2473911126910605027, 2375720167990024221, 10037026397378548640, 14834683004264726058, 6907102329277961715, 18213897356329070177, 5667698909130756383, 4686287875705541143, 12476469095199609689, 17702654136961983716, 5311930945536331644, 7223353560134237057, 13509433978352760019, 7330889791923421278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 1730400919877242464, 8594455900178560628, 5726930420197336139, 13273590888045863622, 8753781667987110661, 12948922070052129184, 6957781166000927195, 11540514940863049397, 3555060714483297014, 9392868496609143397, 1424153760517090352, 9018810402297148417, 2907590405487611226, 16087116659981325603, 6124015441109604199, 15635572367538115795, 2170747068790740224, 3201993911066137312, 11259421084459541380, 9993917348799810609, 17222088454832638116, 15686086798273471220, 12787265931454127207, 607842291318703015, 13403753643599459835, 10689062953812945200, 12619604521626526557, 3744742376692732597, 7474246814889551252, 12416458660228151392, 11846932079106298851, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 13218130135561237014, 8897450981738644183, 8122025352910807675, 14806163515298168591, 5442054526001626765, 3774836954819930057, 7873436160289973996, 1985577549930980807, 379441097109437269, 1582743467085230093, 8777470251655517715, 10400069677678307421, 1177689384604532813, 16561198203506864486, 18413269984357459958, 1623867674755828306, 5071121402113212599, 11851310101017854885, 17866089753923079131, 12853565947951893885, 6966840703169954718, 2619660424044064391, 4642489055874642868, 6457652449305783921, 3582227845111194274, 9002213586940350635, 8120300831241327696, 7598230464484206583, 432418536618916281, 10696618739033813212, 2085147768356017783, 6160598189905115531, 0, 10592, 1439899159397533405, 14727094498238943916, 10746359213734270257, 1223812058834541930, 1848521703701691504, 1128334504960281357, 6743090978755405998, 7738088049886519458, 17939832698319978092, 13966013418513317366, 2011070876654233589, 12183169551034808723, 9308934663460035993, 3987409101004068842, 6640678206253988218, 15420175838347825984, 2447243913023891846, 16080138638164650345, 11821902144147060712, 5951909302827919869, 138258931412597884, 10064659859509677191, 6862491015452895794, 10574916399821725047, 3278355048806054125, 6884933911815373710, 4616652429570306671, 3777113587480581710, 7620976189553973499, 13218130135561237014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8212736248369912082, 13582507089316059702, 7058022398850579311, 14448859106484550632, 8488923843888712176, 14387511811111000559, 16343533314104084279, 7144420700209912913, 81438176960127805, 11353579355252691279, 15391029939397732169, 13654856085785737791, 17867630563899600855, 15638494238775280514, 15278759115432814741, 9672833929788573796, 8499991101857103008, 4277878641698006595, 12990966731553386694, 325849556554992531, 16823455732252835952, 10325677389248902106, 17215632082750072073, 5871229270093729693, 1418595653525548799, 1623140794865507125, 3521868013962458536, 7592427336074080103, 8813490692122304227, 15033504818965134746, 671768789535371387, 6002676145170957552, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 0, 17344769878280361092, 2672032990889952726, 10966643852490493990, 2592429945178091576, 8172562148455605634, 14004003701484837955, 12834107981647449396, 9875636580100479976, 12047948199477092131, 8025491038733220165, 491259531166040341, 14832623839190995610, 14697509357953676418, 5789610466730383818, 388263584830521272, 7439414156048078496, 15784515228652197776, 11049955424692728889, 14895470599018577003, 7841617945839187879, 17455550201169057010, 2534236084163066389, 6762591351360230328, 5346858927664762265, 7945321262401027963, 10750885965856570936, 12370887997614982110, 16868606775754956395, 12653757924793616214, 11706271638131904220, 10827276321637451859, 0, 26480, 4254579990847524851, 17114576923598071233, 14501968992007296006, 7693932549469059792, 10678009787450266287, 2595890940213877342, 12027612752909244618, 11942792976788752435, 8893673039996221512, 15212529265532680398, 977526836722797909, 3774006073579156026, 17701622526704384546, 15389797735547254619, 13767602282518466067, 10581163748471525208, 4912900994653972152, 1666712169140912317, 11001907572334629439, 18179452850399895424, 1689425248988491264, 724394552750888620, 13424695554257597947, 17992577679858152184, 11468668142758644503, 12524389240992679275, 2671393322368710032, 1059544940949021637, 18127894597596272634, 16116071169182046485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4071281311826053218, 8965269515246497704, 4610105990937441552, 14871257653827208567, 17566918610707158078, 4662267156400217313, 11925160665074583703, 7006577898090498820, 8933338746704632990, 14704958557312921128, 283685871938470517, 17049945775096584485, 1735922796599632945, 18137828521183364954, 1233454545325180310, 4616679305450045558, 799989113534058041, 9548215660109667029, 17638736186517997026, 12905149264926481878, 9206641926728869527, 11201231447988338022, 6044555324419572909, 4856995795253621298, 5361647435575923081, 6166078860096154852, 6696272579393185401, 1638259147884844478, 10134861521414682067, 17465898446534646298, 2270472397704099161, 5665896864361060199, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 0, 2858403750276750521, 18287547865064093386, 16643076982183140204, 17607797632632583753, 4606352897788642339, 16669380908105325740, 6888212917900510506, 9887976024132347018, 15672872160122205909, 10605120439023982124, 17832834191852929098, 11180362325911556985, 1797669589287132096, 18316393283013557997, 17455009848636139677, 4212485662162927177, 2684395608227063909, 10865000669694511781, 13048938138389391460, 13946693875892332716, 300901360739248952, 4186546104164144876, 3265288527569414193, 8781944488148208732, 14923610741876695933, 9614148693204557112, 9347068782470538323, 17518823857230050559, 7139121107914525514, 470824845274439747, 1419643695620305796, 0, 21184, 13079805966919738688, 12218492589526939611, 1562069618543971026, 952986602744509450, 16155494143085714581, 13684626716727802900, 2303575863276843576, 10596243276715621734, 17646165020998189117, 11814345067449767109, 11825442891411236224, 17347702280974326762, 10643130636190759117, 10594562435231095624, 4601317543004968907, 2494640429618639710, 7283529819405604014, 12179021258304518015, 15808731023964574299, 17252671119722267451, 2994890735774817444, 1595171953489970254, 11834064729547782130, 3702466161428093475, 4997071000317359325, 9247736708382385184, 7020445890779083806, 13774982404484476980, 17184349270149775183, 13243492223453509904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16681111697957494384, 9850604216542701406, 14292233265078610671, 11560507218468362083, 11435884371355098677, 707619676799722739, 13157092351337171268, 2418773787696448890, 4672379866331806862, 14371817650991869953, 3768839363733198769, 9708763303767628077, 11396390941757961228, 4785785956560501030, 16036499041626449319, 9630510095026498877, 7634220798360289556, 5119649922187981964, 6331607203065781588, 16919596794918736104, 32726321504424883, 10309269913347989302, 14782015448458484884, 14683358530499849942, 7836268277036786901, 15462421617591871273, 12213179217732598594, 14536234064731365163, 3637686875728492502, 2382678006125050452, 14226016292255835291, 589873375673641870, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 18213217674792357841, 6883907187243818989, 10614920431791547888, 13376310260819809150, 970536228322621221, 5786498633534169345, 13904299833493296337, 18182241650367492861, 4671451809489883858, 10519951415050407991, 9409416070961479945, 9277815292140415791, 84450611619755921, 13615028923015526256, 15760906032947657328, 10394291523020808732, 14504653302726904108, 8315708932196998089, 2409075654026148870, 367320422432359503, 6139056775213015570, 6944063758267220406, 4458873320026667405, 12662780608684972080, 15472797447424064358, 4158450525844909688, 2549026714004541517, 3246198533692444934, 3222033110084083257, 5683784147168326312, 7836113917086293276, 0, 5296, 6743125803107521679, 1867163304908812007, 1669000574108639518, 3582028644269610893, 16317815132307200966, 7118493626667445787, 13566879202183211144, 12402898926771175303, 11408064245891139905, 12248403740758614702, 1261452888691293041, 7470708275017896296, 10608583573536775206, 12594414503848564818, 13990563506880433299, 5287408014276309700, 1194675807210157848, 13081677376179713163, 9790979724735385269, 3429994162335743101, 18282263504341243063, 11073532118063625032, 18241092167097720365, 17490629239865315061, 17451936898459652544, 3705015252668379511, 15646972017585065174, 8948369964312160088, 12421841574297279117, 11600144893983875756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6160598189905115531, 18025956107099608580, 11512968082996599149, 1159818605994823015, 2364926874595277907, 7943063494760571709, 16605271790117727213, 11825547519897455023, 15342799649049057800, 3763048797193456654, 1295787082959371660, 16691905436935888241, 1915507152031483536, 17009264450373861587, 16328475049153986635, 8830519937889782762, 10115241278692937317, 1750096680784451786, 16653566373055583790, 4332235233085094180, 627717841813244731, 4706384122596616028, 219643739348167868, 10259409981493264670, 13239490680913326732, 182727077359841351, 8469105874522435313, 8517021520884886781, 3404810976915461357, 3829882598743334141, 14062283116063151751, 1610809089415408623, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 4448725490869322134, 16773782102167370766, 9517551778943323923, 9735157781939056258, 13685677539131842935, 74410881992624137, 16112118280329224188, 16455044890046321010, 3166113086359297763, 4123774883019480954, 8049700212209077372, 9143498805844601837, 1269471574449064045, 17099282884571514622, 17951548125515157165, 15320893071039302787, 16371352256021817139, 17154595820341397772, 5088265715035438397, 12952269508513821163, 2910118210482029454, 1585088611936329987, 16759292612217335519, 9851596960932027140, 8679788143435043297, 7792109010626424915, 3420624790371920563, 7480053259498635867, 3615950593461764641, 16487019928286415392, 10289142213544989468, 0, 5296, 4681956701739972184, 3297507518564977562, 10978317254779656082, 18354142145846877062, 18082471245109184632, 5915586390509665684, 14991347734816807516, 10215583712512422817, 10329936247150774828, 13253613960908137010, 9477407930706312020, 3959435681151189208, 2924854172257996410, 2653599560818129230, 3882603508690502535, 12153757963762118208, 5905443084652099463, 3326804770534376335, 15700324760341857643, 4711113127161390688, 14532162435088690923, 9731412496448089833, 9087293637868970990, 16672855635472301531, 16157291854026127596, 6164067506556190095, 16340142805513243131, 13982894413446367987, 16491357058269217705, 8055423479702674738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1090670744084208003, 3080746365611415597, 6133575519759388325, 11695447135684149141, 6615075028106709917, 10277147404869816105, 15962120449122821193, 1254198290967296340, 2925289410746405164, 12104312877316532634, 14739488160024614333, 10743573083299131194, 12707577723315108285, 8945689852522735768, 14566241909712907104, 9028236766089923761, 10185013658812384549, 3941868484557913621, 16462538463092115913, 5673651272129016554, 1223470853173331157, 2788160682175050931, 1502692624900434396, 5566335148331577393, 17762829217961409285, 3389969163810664285, 7437527833076252327, 17084466347038006872, 6606368157240498477, 13093088208853880999, 1276807186500217245, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 17344769878280361687, 11249881205591563163, 16071218949222383338, 546830354766363539, 7776682728634159270, 11209888800273182957, 14728140374725612977, 8386791303267182172, 9638626268997275972, 822684530408571288, 16951904742993551809, 825915008780272344, 18209952013401698562, 390611853699198814, 11327187383464966515, 12709202232488054070, 11552589705164935867, 12311030232489101343, 5023941437735028493, 16069569499603265432, 18063718751316981145, 4010755700397089888, 10892805137373131994, 9089377676555868962, 1220818432464721625, 13088066304082794059, 8657669536399661454, 419065699932221163, 3886495484944885171, 1240710433266681785, 5374430875291145484, 0, 26480, 7418486580310857761, 17019749743168160467, 4937487787523099272, 9870317658000082520, 9027489043629892579, 4927345804956144414, 15545533182903182788, 3907169825113221089, 2896862965383757523, 13069247508460875244, 6257437454212159648, 3775904100227399669, 16966215805924461950, 5206554086085975117, 10673185398346121565, 8235209133198882488, 9483230364913556480, 10561284120293439668, 17774065041915838082, 8696583885468400324, 9686516267351636652, 5891290976833577870, 6133144642314902299, 4372983987509841442, 2945651218563202825, 17570690068387731452, 2481092360881257830, 10656699665804756215, 2380753665748314674, 14226887805014239710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 2631903040606257959, 11859146482331138479, 12232695746376293294, 995389826954784529, 11949085664163595757, 4404337953750906792, 6908862958628621571, 12608149157887976305, 4754146580783023412, 14308250014803856580, 9454287016901482416, 9789905333959995060, 3771810096516115799, 2150959420327906479, 14538218150241396541, 6425179495446994078, 17565393891424303638, 3667075674391371806, 5731318824387052908, 4241445880929460300, 13107360446062265038, 4176811711023066147, 5250671015911848716, 4722672072326683708, 7171204772415813456, 5618587527864308269, 16458991436693873868, 2626622112813681720, 4599215552676510549, 5363423870755590475, 4352525099414593256, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 85, 2858403750276751031, 1709210755771630360, 11707086547963657475, 2794745820933624420, 2841923277622193225, 16490991381302584921, 5788783276303277595, 14692549583873964816, 9815954444411995352, 16153761647449809543, 6052645635446937049, 17304693813258262086, 11634259222665431081, 12233143040630128964, 8553846008642101336, 18388379526128378444, 15548258272185388836, 15360138454847963029, 3440439455019208235, 7218244406354738621, 5887183982672949081, 15870877452527488142, 15139518776246125573, 5433537245583001116, 13408133831989321267, 4656955130371010155, 14539571260147117550, 17118765335121629772, 3475198118169682060, 11483695604905597390, 11783370765491737635, 0, 21184, 7994119771983090684, 1155757367334915164, 14020255521522346779, 17824815497741664585, 5614135143986453745, 7146977362179517856, 3824341730458112374, 16894770516791760289, 2879202081945061688, 5646668393535724753, 1923820538236998308, 5244112822855800046, 11523838157115606042, 654162111745526915, 17566215582742419332, 16153951788992043302, 7571027843561021323, 15400774862911119623, 10370417002357863310, 16053800817166961724, 10524854462256237020, 11096622266210541923, 15395378671807683368, 6912701393383240626, 11746170412650491065, 12730613771714545378, 6535987403990440638, 10122156746538229970, 3728282910211741030, 5183721621480304370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10468230768888023862, 11664682242720909218, 2500570831459298438, 13004725650794618836, 8624527149940617200, 11524055993362242048, 6182388235200005336, 2589834268393847902, 12931236615531993709, 8584449549244767688, 11899064714918281636, 16246984277558583019, 8772638227416864166, 11946855882944424845, 16440133693312412286, 14737175326378679956, 7842923952979169755, 2398501113047325856, 14599944340506938939, 5936050971291911531, 8286147454062396089, 14343924012975607961, 8190973727913189622, 1134938007864643353, 12054037840221089027, 10050755079785196589, 10469731445849191380, 10906931598039016782, 16150808274840457147, 13280081123993966327, 5571840125263174859, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 18213217674792358096, 13599297410359034734, 11548640197966434952, 16397756946501824199, 4509993724149584481, 15279575547763923315, 14387788336990426452, 1679695851270735493, 737550782574904766, 16619718868892680991, 4189079835826917979, 16548334619034420779, 2523584064344323171, 18357860221728901477, 9223263721501613140, 836498427651453899, 11050299770631141961, 1906255442715510922, 16855485989141196504, 12664144355455319157, 17100007635940521879, 307480490272233054, 14791890923980574308, 14809283111081511220, 1272668898289027998, 1746726629032389326, 781443211491376776, 4235062597258109895, 17016381150799971149, 387032599105912823, 13820432364368151262, 0, 5296, 13498446627995378981, 6649809143130705797, 9522654220689816851, 7559480440412863769, 14249558742787467865, 4471817386074892784, 8930056613191782368, 9155852006764527165, 18377192855492301434, 12836057040498431452, 12282989683528533601, 3467617432525765103, 13766601347831535388, 2925667013227878460, 12822094630311757386, 6738693051085880966, 15661549307393278485, 7649583626848747165, 14069036937855587505, 9495341522376803417, 534616849927909964, 1899062451757954377, 6407581375465580420, 16442451038823818694, 7698809547406684914, 18232885173941026794, 3104393142368480565, 7738728989754721313, 4802195899845329288, 14925669435061449558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 12734367032130478571, 915471480408530766, 18393930191488027312, 13545212286845976163, 18210660875436245579, 1541989510332303929, 5733187932229069792, 8676871105886252208, 15648333801800339703, 12513161021723575557, 9265666514596208448, 10311060571948838328, 15479186567637803235, 9457367929087028434, 10997859361453741844, 4801586725411290698, 8358881080234670725, 14262453638255884367, 3602771739252146288, 6541843013709002421, 3170708104995675453, 10921877432993541182, 10224257779706313529, 15830149545637956450, 13414249448981002451, 11722023958758893627, 18138185027267907899, 13905103948731397841, 9009398081722850699, 16014363687546775515, 10945967283455090973, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 4448725490869322219, 4944140066849387506, 2095785635431009262, 12375413327700682072, 11081872751342419742, 18058781214879352230, 17856276381917295190, 6718639559482054424, 668947051234094647, 3868828750372286402, 12122170781554046887, 4343898307694473975, 12690125861105998824, 16799534473726304569, 15934980937477619093, 3969747009451350970, 7686328019139102331, 3785180857099199084, 11986142858341385519, 2506152622879710750, 18430687071203156938, 3054089675267069232, 8760992635981950709, 11143171037695874494, 4733232646684685861, 1219894586292412814, 12600138307490245388, 824784286256764128, 10170016208525526833, 593495485489349093, 11923860796119339735, 0, 5296, 12442366360197298238, 6098667720777990098, 15014871424912942550, 15008680935203256586, 5625270093505773824, 14457467770650559296, 10887298179723462085, 16706947956141547836, 13310039786220231748, 6132850845308416918, 12403357056402201263, 1240140770639885705, 15461729627686219061, 6574742069523544220, 3131690396120496930, 17758791276367026584, 10046968584624867256, 16910374147545432071, 12405462687145854473, 9006078559482542456, 13476220060215365999, 8384214154009398478, 10365404322190410833, 6851505899182549268, 18261819862243438027, 2823760450959191582, 17079185842171546000, 2573099324947734045, 9396372422985936818, 6899349384621454800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(12) }, program_info: ProgramInfo { program_hash: Word([8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 13, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 0, 41, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 7, 1, 0, 0, 1, 0, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 7, 1, 9, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 6002676145170957552, 5665896864361060199, 589873375673641870, 1610809089415408623, 1276807186500217245, 4352525099414593256, 5571840125263174859, 10945967283455090973, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 10827276321637451859, 1419643695620305796, 7836113917086293276, 10289142213544989468, 5374430875291145484, 11783370765491737635, 13820432364368151262, 11923860796119339735, 0, 0, 1, 0, 0, 1, 1, 0, 0, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 16116071169182046485, 13243492223453509904, 11600144893983875756, 8055423479702674738, 14226887805014239710, 5183721621480304370, 14925669435061449558, 6899349384621454800, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 1, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 1, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 1, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 1, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 1, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 1, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 1, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 1, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 1, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6811813611500970866, 9860311344216082483, 279816225750213135, 1439899159397533405, 4254579990847524851, 13079805966919738688, 6743125803107521679, 4681956701739972184, 7418486580310857761, 7994119771983090684, 13498446627995378981, 12442366360197298238, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12330218901740233931, 4356844177334189800, 3650402777016745376, 14727094498238943916, 17114576923598071233, 12218492589526939611, 1867163304908812007, 3297507518564977562, 17019749743168160467, 1155757367334915164, 6649809143130705797, 6098667720777990098, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16287800225917557614, 8724150062868049447, 1781472746866786234, 10746359213734270257, 14501968992007296006, 1562069618543971026, 1669000574108639518, 10978317254779656082, 4937487787523099272, 14020255521522346779, 9522654220689816851, 15014871424912942550, 1, 0, 0, 0, 1, 0, 14877174880820946473, 17456558212836048017, 17739158337269775126, 2390658038828763199, 3846911055059526201, 10113987313323159199, 1223812058834541930, 7693932549469059792, 952986602744509450, 3582028644269610893, 18354142145846877062, 9870317658000082520, 17824815497741664585, 7559480440412863769, 15008680935203256586, 1, 0, 0, 0, 1, 0, 13977067499243959482, 11395256034671298845, 7327799218104320227, 2699367049541735206, 7763338432894318220, 30358156203896034, 6743090978755405998, 12027612752909244618, 2303575863276843576, 13566879202183211144, 14991347734816807516, 15545533182903182788, 3824341730458112374, 8930056613191782368, 10887298179723462085, 1, 0, 0, 0, 1, 0, 8858901812137030682, 13558987077266275339, 15564429589094530081, 5734803687955113279, 15092595329879644577, 1697370376582801763, 13966013418513317366, 15212529265532680398, 11814345067449767109, 12248403740758614702, 13253613960908137010, 13069247508460875244, 5646668393535724753, 12836057040498431452, 6132850845308416918, 1, 0, 0, 0, 1, 0, 3289076678693837113, 3306415136959427537, 4595381067892187327, 15617193812494172197, 13969944955380272714, 2151092097708635255, 9308934663460035993, 17701622526704384546, 10643130636190759117, 10608583573536775206, 2924854172257996410, 16966215805924461950, 11523838157115606042, 13766601347831535388, 15461729627686219061, 1, 0, 0, 0, 1, 0, 2861046167966645052, 10889239779607274128, 17320053671944779813, 3406927099241203725, 4689628285093180625, 8991051645303444091, 15420175838347825984, 10581163748471525208, 2494640429618639710, 5287408014276309700, 12153757963762118208, 8235209133198882488, 16153951788992043302, 6738693051085880966, 17758791276367026584, 1, 0, 0, 0, 1, 0, 10308255496352503262, 18121871418048845228, 15889419620549458343, 10343975768128176185, 1524422576558323017, 10037026397378548640, 11821902144147060712, 11001907572334629439, 15808731023964574299, 9790979724735385269, 15700324760341857643, 17774065041915838082, 10370417002357863310, 14069036937855587505, 12405462687145854473, 1, 0, 0, 0, 1, 0, 11515575222719100082, 3607722074361327345, 10538200152279946362, 3757345954094976880, 3511571172448102031, 18213897356329070177, 10064659859509677191, 724394552750888620, 1595171953489970254, 11073532118063625032, 9731412496448089833, 5891290976833577870, 11096622266210541923, 1899062451757954377, 8384214154009398478, 1, 0, 0, 0, 1, 0, 5623476244212125463, 0, 0, 11387279664761561894, 16119779393022010645, 12476469095199609689, 3278355048806054125, 11468668142758644503, 4997071000317359325, 17451936898459652544, 16157291854026127596, 2945651218563202825, 11746170412650491065, 7698809547406684914, 18261819862243438027, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12664138717389652380, 16373019178487693626, 5311930945536331644, 4616652429570306671, 2671393322368710032, 7020445890779083806, 15646972017585065174, 16340142805513243131, 2481092360881257830, 6535987403990440638, 3104393142368480565, 17079185842171546000, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8299034149894841811, 13423474518210064130, 7223353560134237057, 3777113587480581710, 1059544940949021637, 13774982404484476980, 8948369964312160088, 13982894413446367987, 10656699665804756215, 10122156746538229970, 7738728989754721313, 2573099324947734045, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4141583402420192864, 10379152206886126257, 13509433978352760019, 7620976189553973499, 18127894597596272634, 17184349270149775183, 12421841574297279117, 16491357058269217705, 2380753665748314674, 3728282910211741030, 4802195899845329288, 9396372422985936818, 1, 0, 0, 0, 1, 0, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 16116071169182046485, 13243492223453509904, 11600144893983875756, 8055423479702674738, 14226887805014239710, 5183721621480304370, 14925669435061449558, 6899349384621454800, 1, 0, 0, 0, 1, 0, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 85, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 321461142783715873, 340111207878988785, 16980963677900604856, 8122025352910807675, 2672032990889952726, 18287547865064093386, 6883907187243818989, 16773782102167370766, 11249881205591563163, 1709210755771630360, 13599297410359034734, 4944140066849387506, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2826379816086788535, 18256387944673635196, 15976151213056828438, 14806163515298168591, 10966643852490493990, 16643076982183140204, 10614920431791547888, 9517551778943323923, 16071218949222383338, 11707086547963657475, 11548640197966434952, 2095785635431009262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1389982844959459783, 10860511098536981986, 92714918004478284, 5442054526001626765, 2592429945178091576, 17607797632632583753, 13376310260819809150, 9735157781939056258, 546830354766363539, 2794745820933624420, 16397756946501824199, 12375413327700682072, 1, 0, 0, 0, 1, 0, 7216891187249046669, 17104304802226135179, 213723419203905114, 7504428176840094167, 8459821732881051520, 17365496272474871894, 3774836954819930057, 8172562148455605634, 4606352897788642339, 970536228322621221, 13685677539131842935, 7776682728634159270, 2841923277622193225, 4509993724149584481, 11081872751342419742, 1, 0, 0, 0, 1, 0, 13630982819704974164, 709629587910116102, 10852437178432066259, 7971642927196132266, 13791358524817111974, 16893172732645584491, 379441097109437269, 9875636580100479976, 9887976024132347018, 18182241650367492861, 16455044890046321010, 8386791303267182172, 14692549583873964816, 1679695851270735493, 6718639559482054424, 1, 0, 0, 0, 1, 0, 16461193933015291689, 9011520252233625918, 15300572918329198995, 17186760898540197468, 9775353746636648794, 2501796678284190373, 10400069677678307421, 491259531166040341, 17832834191852929098, 9409416070961479945, 8049700212209077372, 16951904742993551809, 6052645635446937049, 4189079835826917979, 12122170781554046887, 1, 0, 0, 0, 1, 0, 13955125520582449746, 13107809866340143246, 13139247942561227813, 14264987096664760063, 8663944065392476082, 26738717326360259, 18413269984357459958, 5789610466730383818, 18316393283013557997, 13615028923015526256, 17099282884571514622, 390611853699198814, 12233143040630128964, 18357860221728901477, 16799534473726304569, 1, 0, 0, 0, 1, 0, 14763764810165002571, 7475534393389499071, 4111976696170618769, 8192703318881365638, 6327683047402873297, 6986963031258272860, 11851310101017854885, 15784515228652197776, 2684395608227063909, 14504653302726904108, 16371352256021817139, 11552589705164935867, 15548258272185388836, 11050299770631141961, 7686328019139102331, 1, 0, 0, 0, 1, 0, 5685269238246855930, 7640663189411641925, 12336665115542599217, 17852385312535653754, 9430822593953620080, 15075850538217806798, 6966840703169954718, 7841617945839187879, 13946693875892332716, 367320422432359503, 12952269508513821163, 16069569499603265432, 7218244406354738621, 12664144355455319157, 2506152622879710750, 1, 0, 0, 0, 1, 0, 1427472554639263168, 18418882661072479711, 9257829930238828548, 8976000347315438733, 323829297696706606, 6173756644452043592, 6457652449305783921, 6762591351360230328, 3265288527569414193, 4458873320026667405, 16759292612217335519, 10892805137373131994, 15139518776246125573, 14791890923980574308, 8760992635981950709, 1, 0, 0, 0, 1, 0, 7302903671861085826, 0, 0, 16635907827753325426, 16419251794401517641, 12463158039410249198, 8120300831241327696, 10750885965856570936, 9614148693204557112, 4158450525844909688, 7792109010626424915, 13088066304082794059, 4656955130371010155, 1746726629032389326, 1219894586292412814, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2377128724052460864, 2239581712082993389, 7060420962088551737, 432418536618916281, 16868606775754956395, 17518823857230050559, 3246198533692444934, 7480053259498635867, 419065699932221163, 17118765335121629772, 4235062597258109895, 824784286256764128, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4064757387509104114, 12489932951016483829, 9342274029206616333, 10696618739033813212, 12653757924793616214, 7139121107914525514, 3222033110084083257, 3615950593461764641, 3886495484944885171, 3475198118169682060, 17016381150799971149, 10170016208525526833, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5276412771718093926, 11738733634614750668, 1435264878438078251, 2085147768356017783, 11706271638131904220, 470824845274439747, 5683784147168326312, 16487019928286415392, 1240710433266681785, 11483695604905597390, 387032599105912823, 593495485489349093, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 10827276321637451859, 1419643695620305796, 7836113917086293276, 10289142213544989468, 5374430875291145484, 11783370765491737635, 13820432364368151262, 11923860796119339735, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10784649219148085459, 16204388331933209503, 7535295255934147784, 8594455900178560628, 7058022398850579311, 4610105990937441552, 14292233265078610671, 11512968082996599149, 3080746365611415597, 11859146482331138479, 11664682242720909218, 915471480408530766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 128781735205120527, 9851558383041711453, 14961534904937133494, 5726930420197336139, 14448859106484550632, 14871257653827208567, 11560507218468362083, 1159818605994823015, 6133575519759388325, 12232695746376293294, 2500570831459298438, 18393930191488027312, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4547968979093876849, 2647731244796610075, 15458110929197782417, 13273590888045863622, 8488923843888712176, 17566918610707158078, 11435884371355098677, 2364926874595277907, 11695447135684149141, 995389826954784529, 13004725650794618836, 13545212286845976163, 1, 0, 0, 0, 1, 0, 10963869565254465549, 3178875389651486587, 584333678278801940, 3546336675446295543, 13479103754506160685, 5854257801187918217, 8753781667987110661, 14387511811111000559, 4662267156400217313, 707619676799722739, 7943063494760571709, 6615075028106709917, 11949085664163595757, 8624527149940617200, 18210660875436245579, 1, 0, 0, 0, 1, 0, 7672596955217153457, 5064179278899630287, 15824928726849370210, 5493374351233807563, 8910192708346993775, 6953015881067099300, 11540514940863049397, 81438176960127805, 8933338746704632990, 4672379866331806862, 15342799649049057800, 1254198290967296340, 12608149157887976305, 2589834268393847902, 8676871105886252208, 1, 0, 0, 0, 1, 0, 3531253839134075838, 16735896821376739720, 8167081614237821546, 1614874318552505578, 12924378726200437768, 2748780903535738274, 1424153760517090352, 13654856085785737791, 17049945775096584485, 9708763303767628077, 16691905436935888241, 14739488160024614333, 9454287016901482416, 11899064714918281636, 9265666514596208448, 1, 0, 0, 0, 1, 0, 13609225654816031898, 16627834940022015256, 10557198230311183963, 8307036201059139827, 14386798070662103151, 12069265029549314681, 16087116659981325603, 15278759115432814741, 1233454545325180310, 16036499041626449319, 16328475049153986635, 8945689852522735768, 2150959420327906479, 11946855882944424845, 9457367929087028434, 1, 0, 0, 0, 1, 0, 17700630260394682670, 10564666254450756820, 13128612970712110036, 9024048572557701022, 10724238176158470430, 13358005363663908988, 2170747068790740224, 4277878641698006595, 9548215660109667029, 5119649922187981964, 1750096680784451786, 10185013658812384549, 17565393891424303638, 7842923952979169755, 8358881080234670725, 1, 0, 0, 0, 1, 0, 12969929663590209562, 17400427229379047873, 8161725761906333130, 13981710006578989582, 7297009056930466619, 3604233398898996465, 9993917348799810609, 16823455732252835952, 9206641926728869527, 32726321504424883, 627717841813244731, 5673651272129016554, 4241445880929460300, 5936050971291911531, 6541843013709002421, 1, 0, 0, 0, 1, 0, 12686638732510422112, 8915914979000954491, 17429665533669488649, 11824695302249715491, 13382186579597492216, 16156878489884540028, 12787265931454127207, 5871229270093729693, 4856995795253621298, 14683358530499849942, 10259409981493264670, 1502692624900434396, 5250671015911848716, 8190973727913189622, 10224257779706313529, 1, 0, 0, 0, 1, 0, 15763807785631230887, 0, 0, 9872576991436394594, 6000186529178301892, 4992467617151662209, 10689062953812945200, 3521868013962458536, 6696272579393185401, 12213179217732598594, 8469105874522435313, 3389969163810664285, 5618587527864308269, 10050755079785196589, 11722023958758893627, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10552500864729979640, 7022204645736728964, 12063673466969028652, 3744742376692732597, 8813490692122304227, 10134861521414682067, 3637686875728492502, 3404810976915461357, 17084466347038006872, 2626622112813681720, 10906931598039016782, 13905103948731397841, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18032794979945654604, 5338134468072720249, 6266501778891918617, 7474246814889551252, 15033504818965134746, 17465898446534646298, 2382678006125050452, 3829882598743334141, 6606368157240498477, 4599215552676510549, 16150808274840457147, 9009398081722850699, 1, 0, 0, 0, 1, 0, 0, 0, 0, 153382829717154572, 15645384100209479912, 17390445613818630245, 12416458660228151392, 671768789535371387, 2270472397704099161, 14226016292255835291, 14062283116063151751, 13093088208853880999, 5363423870755590475, 13280081123993966327, 16014363687546775515, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 6002676145170957552, 5665896864361060199, 589873375673641870, 1610809089415408623, 1276807186500217245, 4352525099414593256, 5571840125263174859, 10945967283455090973, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(12) }, program_info: ProgramInfo { program_hash: Word([8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 13, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_10.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_10.snap index 0c821b02ba..e5e0da9157 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_10.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_10.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 97, 97, 97, 65, 65, 129, 129, 129, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 665741763369239996, 5296, 41, 0, 665741763369239996, 665741763369239996, 5296, 41, 0, 665741763369239996, 8212736248369912082, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000, 8442199976350624000], [18375473735916206629, 0, 1, 1, 18375473735916206629, 5831108162926480783, 0, 65, 65, 5831108162926480783, 5831108162926480783, 0, 65, 65, 5831108162926480783, 4071281311826053218, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331, 9488069924049927331], [2105717247508690050, 0, 0, 0, 2105717247508690050, 7330889791923421278, 0, 0, 0, 7330889791923421278, 7330889791923421278, 0, 0, 0, 7330889791923421278, 16681111697957494384, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271, 3589804369840038271], [1679902783560062568, 0, 0, 0, 1679902783560062568, 13218130135561237014, 0, 0, 0, 13218130135561237014, 13218130135561237014, 0, 0, 0, 13218130135561237014, 6160598189905115531, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851, 11846932079106298851], [8212736248369912082, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4071281311826053218, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16681111697957494384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6160598189905115531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999], [1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 9999, 9999, 0, 9999, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 9999, 9999, 0, 9999, 9999, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [9999, 9999, 9999, 9999, 9999, 9999, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 17, 16, 16, 16, 16, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 8136249212351146192, 10784649219148085459, 128781735205120527, 4547968979093876849, 3546336675446295543, 10817940156349236625, 14189444001012371653, 5493374351233807563, 8311102902317058756, 6249712288789018971, 1614874318552505578, 8181452518454181592, 598477530791288280, 8307036201059139827, 17345949525972330427, 17120430504411685184, 9024048572557701022, 5442249363272202440, 8891889669188699464, 13981710006578989582, 15202252296288325862, 8901049526912687276, 11824695302249715491, 8477037444632037091, 10111259653022775679, 9872576991436394594, 13620574761069749666, 10552500864729979640, 18032794979945654604, 153382829717154572, 8442199976350624000, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 665741763369239996, 16242795687146137268, 321461142783715873, 2826379816086788535, 1389982844959459783, 7504428176840094167, 16867052141953300014, 6524645837583534023, 7971642927196132266, 895587693811363643, 14045043160415708545, 17186760898540197468, 11586158328390007250, 12564286920483154715, 14264987096664760063, 13473611649745551608, 3074526273535018608, 8192703318881365638, 11332735769645700919, 16102114657139125593, 17852385312535653754, 2362278605853243291, 7801968558670902550, 8976000347315438733, 13152720785410684086, 15178160026565391559, 16635907827753325426, 2952369032039574593, 2377128724052460864, 4064757387509104114, 5276412771718093926, 8212736248369912082, 5296, 52960, 6811813611500970866, 12330218901740233931, 16287800225917557614, 2390658038828763199, 4670881323897574211, 15935136064817789611, 2699367049541735206, 5505690989019187676, 4740977976888162022, 5734803687955113279, 14716704723144357988, 4469212567425053522, 15617193812494172197, 4848896952878415343, 18385001813020718595, 3406927099241203725, 6500845817907766790, 14130590127555482700, 10343975768128176185, 15693873175844605389, 2059720903132940981, 3757345954094976880, 3089069334759629752, 18141223932492835937, 11387279664761561894, 5402048984901238600, 12664138717389652380, 8299034149894841811, 4141583402420192864, 665741763369239996, 5296, 52960, 6811813611500970866, 12330218901740233931, 16287800225917557614, 2390658038828763199, 4670881323897574211, 15935136064817789611, 2699367049541735206, 5505690989019187676, 4740977976888162022, 5734803687955113279, 14716704723144357988, 4469212567425053522, 15617193812494172197, 4848896952878415343, 18385001813020718595, 3406927099241203725, 6500845817907766790, 14130590127555482700, 10343975768128176185, 15693873175844605389, 2059720903132940981, 3757345954094976880, 3089069334759629752, 18141223932492835937, 11387279664761561894, 5402048984901238600, 12664138717389652380, 8299034149894841811, 4141583402420192864, 665741763369239996, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 17377183675986858406, 16204388331933209503, 9851558383041711453, 2647731244796610075, 13479103754506160685, 1313884950803363652, 15346175195946058279, 8910192708346993775, 2151299325850503780, 16669085269506854818, 12924378726200437768, 5909277165962634165, 7995732842947875893, 14386798070662103151, 7879022579148049870, 15020611106200374787, 10724238176158470430, 15029834199037822311, 11678935371612262717, 7297009056930466619, 14511898776428524296, 319792799645144231, 13382186579597492216, 2694749223042447691, 13263694931203634375, 6000186529178301892, 16523385558055279056, 7022204645736728964, 5338134468072720249, 15645384100209479912, 9488069924049927331, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 5831108162926480783, 5716807500553500532, 340111207878988785, 18256387944673635196, 10860511098536981986, 8459821732881051520, 6920921369535874813, 16951093806716492481, 13791358524817111974, 5736505110286114902, 6134208873573181149, 9775353746636648794, 10511806043496923148, 16994604820290358508, 8663944065392476082, 7230189013861170101, 5624631671914610235, 6327683047402873297, 4175477208176608783, 954074467059951894, 9430822593953620080, 3254964387338063442, 14616933013502048910, 323829297696706606, 15299582253555179912, 8256585982323809806, 16419251794401517641, 11559790149908051338, 2239581712082993389, 12489932951016483829, 11738733634614750668, 4071281311826053218, 0, 42368, 9860311344216082483, 4356844177334189800, 8724150062868049447, 3846911055059526201, 16861225296757755735, 16925961143355054643, 7763338432894318220, 7504506723642096670, 11045006668578082721, 15092595329879644577, 4298948569114582870, 17810272068739440989, 13969944955380272714, 12356982018953263244, 16520418754635432271, 4689628285093180625, 7190852124445770478, 13072354659666011192, 1524422576558323017, 4274963317195893198, 12684756825761097033, 3511571172448102031, 823386573204270152, 9615020079928624381, 16119779393022010645, 17295023900181003317, 16373019178487693626, 13423474518210064130, 10379152206886126257, 5831108162926480783, 0, 42368, 9860311344216082483, 4356844177334189800, 8724150062868049447, 3846911055059526201, 16861225296757755735, 16925961143355054643, 7763338432894318220, 7504506723642096670, 11045006668578082721, 15092595329879644577, 4298948569114582870, 17810272068739440989, 13969944955380272714, 12356982018953263244, 16520418754635432271, 4689628285093180625, 7190852124445770478, 13072354659666011192, 1524422576558323017, 4274963317195893198, 12684756825761097033, 3511571172448102031, 823386573204270152, 9615020079928624381, 16119779393022010645, 17295023900181003317, 16373019178487693626, 13423474518210064130, 10379152206886126257, 5831108162926480783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 3107344020706784815, 7535295255934147784, 14961534904937133494, 15458110929197782417, 5854257801187918217, 7408528896221680379, 7195773034137126318, 6953015881067099300, 8311075386067189185, 7490596925699016321, 2748780903535738274, 14124675439405907210, 13467811864817035684, 12069265029549314681, 8713544979421645407, 7271740931964389253, 13358005363663908988, 1445604555428043843, 15414631947824553103, 3604233398898996465, 11389542141657004950, 753657943574098354, 16156878489884540028, 1283495432526365661, 15770030010231724104, 4992467617151662209, 9388418952293233141, 12063673466969028652, 6266501778891918617, 17390445613818630245, 3589804369840038271, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 7330889791923421278, 17979691280170131106, 16980963677900604856, 15976151213056828438, 92714918004478284, 17365496272474871894, 17001192471520708179, 3321277494654107778, 16893172732645584491, 2027752104829715962, 15452271030076785961, 2501796678284190373, 5676660220829808154, 13123673595423766920, 26738717326360259, 17483757498059224444, 12817208054146358362, 6986963031258272860, 16687757358165325375, 18027249453476092631, 15075850538217806798, 4190259332272306773, 2553182391312160489, 6173756644452043592, 7042376686216238529, 38980987021367719, 12463158039410249198, 7049795244189838947, 7060420962088551737, 9342274029206616333, 1435264878438078251, 16681111697957494384, 0, 10592, 279816225750213135, 3650402777016745376, 1781472746866786234, 10113987313323159199, 9398274187564883752, 16748408482785331310, 30358156203896034, 3074595635178688035, 6205342630873024293, 1697370376582801763, 8815094577559083340, 449557436115663881, 2151092097708635255, 7636620675010033430, 2307825524015342399, 8991051645303444091, 2473911126910605027, 2375720167990024221, 10037026397378548640, 14834683004264726058, 6907102329277961715, 18213897356329070177, 5667698909130756383, 4686287875705541143, 12476469095199609689, 17702654136961983716, 5311930945536331644, 7223353560134237057, 13509433978352760019, 7330889791923421278, 0, 10592, 279816225750213135, 3650402777016745376, 1781472746866786234, 10113987313323159199, 9398274187564883752, 16748408482785331310, 30358156203896034, 3074595635178688035, 6205342630873024293, 1697370376582801763, 8815094577559083340, 449557436115663881, 2151092097708635255, 7636620675010033430, 2307825524015342399, 8991051645303444091, 2473911126910605027, 2375720167990024221, 10037026397378548640, 14834683004264726058, 6907102329277961715, 18213897356329070177, 5667698909130756383, 4686287875705541143, 12476469095199609689, 17702654136961983716, 5311930945536331644, 7223353560134237057, 13509433978352760019, 7330889791923421278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 1730400919877242464, 8594455900178560628, 5726930420197336139, 13273590888045863622, 8753781667987110661, 12948922070052129184, 6957781166000927195, 11540514940863049397, 3555060714483297014, 9392868496609143397, 1424153760517090352, 9018810402297148417, 2907590405487611226, 16087116659981325603, 6124015441109604199, 15635572367538115795, 2170747068790740224, 3201993911066137312, 11259421084459541380, 9993917348799810609, 17222088454832638116, 15686086798273471220, 12787265931454127207, 607842291318703015, 13403753643599459835, 10689062953812945200, 12619604521626526557, 3744742376692732597, 7474246814889551252, 12416458660228151392, 11846932079106298851, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 13218130135561237014, 8897450981738644183, 8122025352910807675, 14806163515298168591, 5442054526001626765, 3774836954819930057, 7873436160289973996, 1985577549930980807, 379441097109437269, 1582743467085230093, 8777470251655517715, 10400069677678307421, 1177689384604532813, 16561198203506864486, 18413269984357459958, 1623867674755828306, 5071121402113212599, 11851310101017854885, 17866089753923079131, 12853565947951893885, 6966840703169954718, 2619660424044064391, 4642489055874642868, 6457652449305783921, 3582227845111194274, 9002213586940350635, 8120300831241327696, 7598230464484206583, 432418536618916281, 10696618739033813212, 2085147768356017783, 6160598189905115531, 0, 10592, 1439899159397533405, 14727094498238943916, 10746359213734270257, 1223812058834541930, 1848521703701691504, 1128334504960281357, 6743090978755405998, 7738088049886519458, 17939832698319978092, 13966013418513317366, 2011070876654233589, 12183169551034808723, 9308934663460035993, 3987409101004068842, 6640678206253988218, 15420175838347825984, 2447243913023891846, 16080138638164650345, 11821902144147060712, 5951909302827919869, 138258931412597884, 10064659859509677191, 6862491015452895794, 10574916399821725047, 3278355048806054125, 6884933911815373710, 4616652429570306671, 3777113587480581710, 7620976189553973499, 13218130135561237014, 0, 10592, 1439899159397533405, 14727094498238943916, 10746359213734270257, 1223812058834541930, 1848521703701691504, 1128334504960281357, 6743090978755405998, 7738088049886519458, 17939832698319978092, 13966013418513317366, 2011070876654233589, 12183169551034808723, 9308934663460035993, 3987409101004068842, 6640678206253988218, 15420175838347825984, 2447243913023891846, 16080138638164650345, 11821902144147060712, 5951909302827919869, 138258931412597884, 10064659859509677191, 6862491015452895794, 10574916399821725047, 3278355048806054125, 6884933911815373710, 4616652429570306671, 3777113587480581710, 7620976189553973499, 13218130135561237014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8212736248369912082, 13582507089316059702, 7058022398850579311, 14448859106484550632, 8488923843888712176, 14387511811111000559, 16343533314104084279, 7144420700209912913, 81438176960127805, 11353579355252691279, 15391029939397732169, 13654856085785737791, 17867630563899600855, 15638494238775280514, 15278759115432814741, 9672833929788573796, 8499991101857103008, 4277878641698006595, 12990966731553386694, 325849556554992531, 16823455732252835952, 10325677389248902106, 17215632082750072073, 5871229270093729693, 1418595653525548799, 1623140794865507125, 3521868013962458536, 7592427336074080103, 8813490692122304227, 15033504818965134746, 671768789535371387, 6002676145170957552, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 0, 17344769878280361092, 2672032990889952726, 10966643852490493990, 2592429945178091576, 8172562148455605634, 14004003701484837955, 12834107981647449396, 9875636580100479976, 12047948199477092131, 8025491038733220165, 491259531166040341, 14832623839190995610, 14697509357953676418, 5789610466730383818, 388263584830521272, 7439414156048078496, 15784515228652197776, 11049955424692728889, 14895470599018577003, 7841617945839187879, 17455550201169057010, 2534236084163066389, 6762591351360230328, 5346858927664762265, 7945321262401027963, 10750885965856570936, 12370887997614982110, 16868606775754956395, 12653757924793616214, 11706271638131904220, 10827276321637451859, 0, 26480, 4254579990847524851, 17114576923598071233, 14501968992007296006, 7693932549469059792, 10678009787450266287, 2595890940213877342, 12027612752909244618, 11942792976788752435, 8893673039996221512, 15212529265532680398, 977526836722797909, 3774006073579156026, 17701622526704384546, 15389797735547254619, 13767602282518466067, 10581163748471525208, 4912900994653972152, 1666712169140912317, 11001907572334629439, 18179452850399895424, 1689425248988491264, 724394552750888620, 13424695554257597947, 17992577679858152184, 11468668142758644503, 12524389240992679275, 2671393322368710032, 1059544940949021637, 18127894597596272634, 16116071169182046485, 0, 26480, 4254579990847524851, 17114576923598071233, 14501968992007296006, 7693932549469059792, 10678009787450266287, 2595890940213877342, 12027612752909244618, 11942792976788752435, 8893673039996221512, 15212529265532680398, 977526836722797909, 3774006073579156026, 17701622526704384546, 15389797735547254619, 13767602282518466067, 10581163748471525208, 4912900994653972152, 1666712169140912317, 11001907572334629439, 18179452850399895424, 1689425248988491264, 724394552750888620, 13424695554257597947, 17992577679858152184, 11468668142758644503, 12524389240992679275, 2671393322368710032, 1059544940949021637, 18127894597596272634, 16116071169182046485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4071281311826053218, 8965269515246497704, 4610105990937441552, 14871257653827208567, 17566918610707158078, 4662267156400217313, 11925160665074583703, 7006577898090498820, 8933338746704632990, 14704958557312921128, 283685871938470517, 17049945775096584485, 1735922796599632945, 18137828521183364954, 1233454545325180310, 4616679305450045558, 799989113534058041, 9548215660109667029, 17638736186517997026, 12905149264926481878, 9206641926728869527, 11201231447988338022, 6044555324419572909, 4856995795253621298, 5361647435575923081, 6166078860096154852, 6696272579393185401, 1638259147884844478, 10134861521414682067, 17465898446534646298, 2270472397704099161, 5665896864361060199, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 0, 2858403750276750521, 18287547865064093386, 16643076982183140204, 17607797632632583753, 4606352897788642339, 16669380908105325740, 6888212917900510506, 9887976024132347018, 15672872160122205909, 10605120439023982124, 17832834191852929098, 11180362325911556985, 1797669589287132096, 18316393283013557997, 17455009848636139677, 4212485662162927177, 2684395608227063909, 10865000669694511781, 13048938138389391460, 13946693875892332716, 300901360739248952, 4186546104164144876, 3265288527569414193, 8781944488148208732, 14923610741876695933, 9614148693204557112, 9347068782470538323, 17518823857230050559, 7139121107914525514, 470824845274439747, 1419643695620305796, 0, 21184, 13079805966919738688, 12218492589526939611, 1562069618543971026, 952986602744509450, 16155494143085714581, 13684626716727802900, 2303575863276843576, 10596243276715621734, 17646165020998189117, 11814345067449767109, 11825442891411236224, 17347702280974326762, 10643130636190759117, 10594562435231095624, 4601317543004968907, 2494640429618639710, 7283529819405604014, 12179021258304518015, 15808731023964574299, 17252671119722267451, 2994890735774817444, 1595171953489970254, 11834064729547782130, 3702466161428093475, 4997071000317359325, 9247736708382385184, 7020445890779083806, 13774982404484476980, 17184349270149775183, 13243492223453509904, 0, 21184, 13079805966919738688, 12218492589526939611, 1562069618543971026, 952986602744509450, 16155494143085714581, 13684626716727802900, 2303575863276843576, 10596243276715621734, 17646165020998189117, 11814345067449767109, 11825442891411236224, 17347702280974326762, 10643130636190759117, 10594562435231095624, 4601317543004968907, 2494640429618639710, 7283529819405604014, 12179021258304518015, 15808731023964574299, 17252671119722267451, 2994890735774817444, 1595171953489970254, 11834064729547782130, 3702466161428093475, 4997071000317359325, 9247736708382385184, 7020445890779083806, 13774982404484476980, 17184349270149775183, 13243492223453509904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16681111697957494384, 9850604216542701406, 14292233265078610671, 11560507218468362083, 11435884371355098677, 707619676799722739, 13157092351337171268, 2418773787696448890, 4672379866331806862, 14371817650991869953, 3768839363733198769, 9708763303767628077, 11396390941757961228, 4785785956560501030, 16036499041626449319, 9630510095026498877, 7634220798360289556, 5119649922187981964, 6331607203065781588, 16919596794918736104, 32726321504424883, 10309269913347989302, 14782015448458484884, 14683358530499849942, 7836268277036786901, 15462421617591871273, 12213179217732598594, 14536234064731365163, 3637686875728492502, 2382678006125050452, 14226016292255835291, 589873375673641870, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 18213217674792357841, 6883907187243818989, 10614920431791547888, 13376310260819809150, 970536228322621221, 5786498633534169345, 13904299833493296337, 18182241650367492861, 4671451809489883858, 10519951415050407991, 9409416070961479945, 9277815292140415791, 84450611619755921, 13615028923015526256, 15760906032947657328, 10394291523020808732, 14504653302726904108, 8315708932196998089, 2409075654026148870, 367320422432359503, 6139056775213015570, 6944063758267220406, 4458873320026667405, 12662780608684972080, 15472797447424064358, 4158450525844909688, 2549026714004541517, 3246198533692444934, 3222033110084083257, 5683784147168326312, 7836113917086293276, 0, 5296, 6743125803107521679, 1867163304908812007, 1669000574108639518, 3582028644269610893, 16317815132307200966, 7118493626667445787, 13566879202183211144, 12402898926771175303, 11408064245891139905, 12248403740758614702, 1261452888691293041, 7470708275017896296, 10608583573536775206, 12594414503848564818, 13990563506880433299, 5287408014276309700, 1194675807210157848, 13081677376179713163, 9790979724735385269, 3429994162335743101, 18282263504341243063, 11073532118063625032, 18241092167097720365, 17490629239865315061, 17451936898459652544, 3705015252668379511, 15646972017585065174, 8948369964312160088, 12421841574297279117, 11600144893983875756, 0, 5296, 6743125803107521679, 1867163304908812007, 1669000574108639518, 3582028644269610893, 16317815132307200966, 7118493626667445787, 13566879202183211144, 12402898926771175303, 11408064245891139905, 12248403740758614702, 1261452888691293041, 7470708275017896296, 10608583573536775206, 12594414503848564818, 13990563506880433299, 5287408014276309700, 1194675807210157848, 13081677376179713163, 9790979724735385269, 3429994162335743101, 18282263504341243063, 11073532118063625032, 18241092167097720365, 17490629239865315061, 17451936898459652544, 3705015252668379511, 15646972017585065174, 8948369964312160088, 12421841574297279117, 11600144893983875756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6160598189905115531, 18025956107099608580, 11512968082996599149, 1159818605994823015, 2364926874595277907, 7943063494760571709, 16605271790117727213, 11825547519897455023, 15342799649049057800, 3763048797193456654, 1295787082959371660, 16691905436935888241, 1915507152031483536, 17009264450373861587, 16328475049153986635, 8830519937889782762, 10115241278692937317, 1750096680784451786, 16653566373055583790, 4332235233085094180, 627717841813244731, 4706384122596616028, 219643739348167868, 10259409981493264670, 13239490680913326732, 182727077359841351, 8469105874522435313, 8517021520884886781, 3404810976915461357, 3829882598743334141, 14062283116063151751, 1610809089415408623, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 4448725490869322134, 16773782102167370766, 9517551778943323923, 9735157781939056258, 13685677539131842935, 74410881992624137, 16112118280329224188, 16455044890046321010, 3166113086359297763, 4123774883019480954, 8049700212209077372, 9143498805844601837, 1269471574449064045, 17099282884571514622, 17951548125515157165, 15320893071039302787, 16371352256021817139, 17154595820341397772, 5088265715035438397, 12952269508513821163, 2910118210482029454, 1585088611936329987, 16759292612217335519, 9851596960932027140, 8679788143435043297, 7792109010626424915, 3420624790371920563, 7480053259498635867, 3615950593461764641, 16487019928286415392, 10289142213544989468, 0, 5296, 4681956701739972184, 3297507518564977562, 10978317254779656082, 18354142145846877062, 18082471245109184632, 5915586390509665684, 14991347734816807516, 10215583712512422817, 10329936247150774828, 13253613960908137010, 9477407930706312020, 3959435681151189208, 2924854172257996410, 2653599560818129230, 3882603508690502535, 12153757963762118208, 5905443084652099463, 3326804770534376335, 15700324760341857643, 4711113127161390688, 14532162435088690923, 9731412496448089833, 9087293637868970990, 16672855635472301531, 16157291854026127596, 6164067506556190095, 16340142805513243131, 13982894413446367987, 16491357058269217705, 8055423479702674738, 0, 5296, 4681956701739972184, 3297507518564977562, 10978317254779656082, 18354142145846877062, 18082471245109184632, 5915586390509665684, 14991347734816807516, 10215583712512422817, 10329936247150774828, 13253613960908137010, 9477407930706312020, 3959435681151189208, 2924854172257996410, 2653599560818129230, 3882603508690502535, 12153757963762118208, 5905443084652099463, 3326804770534376335, 15700324760341857643, 4711113127161390688, 14532162435088690923, 9731412496448089833, 9087293637868970990, 16672855635472301531, 16157291854026127596, 6164067506556190095, 16340142805513243131, 13982894413446367987, 16491357058269217705, 8055423479702674738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1090670744084208003, 3080746365611415597, 6133575519759388325, 11695447135684149141, 6615075028106709917, 10277147404869816105, 15962120449122821193, 1254198290967296340, 2925289410746405164, 12104312877316532634, 14739488160024614333, 10743573083299131194, 12707577723315108285, 8945689852522735768, 14566241909712907104, 9028236766089923761, 10185013658812384549, 3941868484557913621, 16462538463092115913, 5673651272129016554, 1223470853173331157, 2788160682175050931, 1502692624900434396, 5566335148331577393, 17762829217961409285, 3389969163810664285, 7437527833076252327, 17084466347038006872, 6606368157240498477, 13093088208853880999, 1276807186500217245, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 17344769878280361687, 11249881205591563163, 16071218949222383338, 546830354766363539, 7776682728634159270, 11209888800273182957, 14728140374725612977, 8386791303267182172, 9638626268997275972, 822684530408571288, 16951904742993551809, 825915008780272344, 18209952013401698562, 390611853699198814, 11327187383464966515, 12709202232488054070, 11552589705164935867, 12311030232489101343, 5023941437735028493, 16069569499603265432, 18063718751316981145, 4010755700397089888, 10892805137373131994, 9089377676555868962, 1220818432464721625, 13088066304082794059, 8657669536399661454, 419065699932221163, 3886495484944885171, 1240710433266681785, 5374430875291145484, 0, 26480, 7418486580310857761, 17019749743168160467, 4937487787523099272, 9870317658000082520, 9027489043629892579, 4927345804956144414, 15545533182903182788, 3907169825113221089, 2896862965383757523, 13069247508460875244, 6257437454212159648, 3775904100227399669, 16966215805924461950, 5206554086085975117, 10673185398346121565, 8235209133198882488, 9483230364913556480, 10561284120293439668, 17774065041915838082, 8696583885468400324, 9686516267351636652, 5891290976833577870, 6133144642314902299, 4372983987509841442, 2945651218563202825, 17570690068387731452, 2481092360881257830, 10656699665804756215, 2380753665748314674, 14226887805014239710, 0, 26480, 7418486580310857761, 17019749743168160467, 4937487787523099272, 9870317658000082520, 9027489043629892579, 4927345804956144414, 15545533182903182788, 3907169825113221089, 2896862965383757523, 13069247508460875244, 6257437454212159648, 3775904100227399669, 16966215805924461950, 5206554086085975117, 10673185398346121565, 8235209133198882488, 9483230364913556480, 10561284120293439668, 17774065041915838082, 8696583885468400324, 9686516267351636652, 5891290976833577870, 6133144642314902299, 4372983987509841442, 2945651218563202825, 17570690068387731452, 2481092360881257830, 10656699665804756215, 2380753665748314674, 14226887805014239710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 2631903040606257959, 11859146482331138479, 12232695746376293294, 995389826954784529, 11949085664163595757, 4404337953750906792, 6908862958628621571, 12608149157887976305, 4754146580783023412, 14308250014803856580, 9454287016901482416, 9789905333959995060, 3771810096516115799, 2150959420327906479, 14538218150241396541, 6425179495446994078, 17565393891424303638, 3667075674391371806, 5731318824387052908, 4241445880929460300, 13107360446062265038, 4176811711023066147, 5250671015911848716, 4722672072326683708, 7171204772415813456, 5618587527864308269, 16458991436693873868, 2626622112813681720, 4599215552676510549, 5363423870755590475, 4352525099414593256, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 85, 2858403750276751031, 1709210755771630360, 11707086547963657475, 2794745820933624420, 2841923277622193225, 16490991381302584921, 5788783276303277595, 14692549583873964816, 9815954444411995352, 16153761647449809543, 6052645635446937049, 17304693813258262086, 11634259222665431081, 12233143040630128964, 8553846008642101336, 18388379526128378444, 15548258272185388836, 15360138454847963029, 3440439455019208235, 7218244406354738621, 5887183982672949081, 15870877452527488142, 15139518776246125573, 5433537245583001116, 13408133831989321267, 4656955130371010155, 14539571260147117550, 17118765335121629772, 3475198118169682060, 11483695604905597390, 11783370765491737635, 0, 21184, 7994119771983090684, 1155757367334915164, 14020255521522346779, 17824815497741664585, 5614135143986453745, 7146977362179517856, 3824341730458112374, 16894770516791760289, 2879202081945061688, 5646668393535724753, 1923820538236998308, 5244112822855800046, 11523838157115606042, 654162111745526915, 17566215582742419332, 16153951788992043302, 7571027843561021323, 15400774862911119623, 10370417002357863310, 16053800817166961724, 10524854462256237020, 11096622266210541923, 15395378671807683368, 6912701393383240626, 11746170412650491065, 12730613771714545378, 6535987403990440638, 10122156746538229970, 3728282910211741030, 5183721621480304370, 0, 21184, 7994119771983090684, 1155757367334915164, 14020255521522346779, 17824815497741664585, 5614135143986453745, 7146977362179517856, 3824341730458112374, 16894770516791760289, 2879202081945061688, 5646668393535724753, 1923820538236998308, 5244112822855800046, 11523838157115606042, 654162111745526915, 17566215582742419332, 16153951788992043302, 7571027843561021323, 15400774862911119623, 10370417002357863310, 16053800817166961724, 10524854462256237020, 11096622266210541923, 15395378671807683368, 6912701393383240626, 11746170412650491065, 12730613771714545378, 6535987403990440638, 10122156746538229970, 3728282910211741030, 5183721621480304370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10468230768888023862, 11664682242720909218, 2500570831459298438, 13004725650794618836, 8624527149940617200, 11524055993362242048, 6182388235200005336, 2589834268393847902, 12931236615531993709, 8584449549244767688, 11899064714918281636, 16246984277558583019, 8772638227416864166, 11946855882944424845, 16440133693312412286, 14737175326378679956, 7842923952979169755, 2398501113047325856, 14599944340506938939, 5936050971291911531, 8286147454062396089, 14343924012975607961, 8190973727913189622, 1134938007864643353, 12054037840221089027, 10050755079785196589, 10469731445849191380, 10906931598039016782, 16150808274840457147, 13280081123993966327, 5571840125263174859, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 18213217674792358096, 13599297410359034734, 11548640197966434952, 16397756946501824199, 4509993724149584481, 15279575547763923315, 14387788336990426452, 1679695851270735493, 737550782574904766, 16619718868892680991, 4189079835826917979, 16548334619034420779, 2523584064344323171, 18357860221728901477, 9223263721501613140, 836498427651453899, 11050299770631141961, 1906255442715510922, 16855485989141196504, 12664144355455319157, 17100007635940521879, 307480490272233054, 14791890923980574308, 14809283111081511220, 1272668898289027998, 1746726629032389326, 781443211491376776, 4235062597258109895, 17016381150799971149, 387032599105912823, 13820432364368151262, 0, 5296, 13498446627995378981, 6649809143130705797, 9522654220689816851, 7559480440412863769, 14249558742787467865, 4471817386074892784, 8930056613191782368, 9155852006764527165, 18377192855492301434, 12836057040498431452, 12282989683528533601, 3467617432525765103, 13766601347831535388, 2925667013227878460, 12822094630311757386, 6738693051085880966, 15661549307393278485, 7649583626848747165, 14069036937855587505, 9495341522376803417, 534616849927909964, 1899062451757954377, 6407581375465580420, 16442451038823818694, 7698809547406684914, 18232885173941026794, 3104393142368480565, 7738728989754721313, 4802195899845329288, 14925669435061449558, 0, 5296, 13498446627995378981, 6649809143130705797, 9522654220689816851, 7559480440412863769, 14249558742787467865, 4471817386074892784, 8930056613191782368, 9155852006764527165, 18377192855492301434, 12836057040498431452, 12282989683528533601, 3467617432525765103, 13766601347831535388, 2925667013227878460, 12822094630311757386, 6738693051085880966, 15661549307393278485, 7649583626848747165, 14069036937855587505, 9495341522376803417, 534616849927909964, 1899062451757954377, 6407581375465580420, 16442451038823818694, 7698809547406684914, 18232885173941026794, 3104393142368480565, 7738728989754721313, 4802195899845329288, 14925669435061449558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 12734367032130478571, 915471480408530766, 18393930191488027312, 13545212286845976163, 18210660875436245579, 1541989510332303929, 5733187932229069792, 8676871105886252208, 15648333801800339703, 12513161021723575557, 9265666514596208448, 10311060571948838328, 15479186567637803235, 9457367929087028434, 10997859361453741844, 4801586725411290698, 8358881080234670725, 14262453638255884367, 3602771739252146288, 6541843013709002421, 3170708104995675453, 10921877432993541182, 10224257779706313529, 15830149545637956450, 13414249448981002451, 11722023958758893627, 18138185027267907899, 13905103948731397841, 9009398081722850699, 16014363687546775515, 10945967283455090973, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 4448725490869322219, 4944140066849387506, 2095785635431009262, 12375413327700682072, 11081872751342419742, 18058781214879352230, 17856276381917295190, 6718639559482054424, 668947051234094647, 3868828750372286402, 12122170781554046887, 4343898307694473975, 12690125861105998824, 16799534473726304569, 15934980937477619093, 3969747009451350970, 7686328019139102331, 3785180857099199084, 11986142858341385519, 2506152622879710750, 18430687071203156938, 3054089675267069232, 8760992635981950709, 11143171037695874494, 4733232646684685861, 1219894586292412814, 12600138307490245388, 824784286256764128, 10170016208525526833, 593495485489349093, 11923860796119339735, 0, 5296, 12442366360197298238, 6098667720777990098, 15014871424912942550, 15008680935203256586, 5625270093505773824, 14457467770650559296, 10887298179723462085, 16706947956141547836, 13310039786220231748, 6132850845308416918, 12403357056402201263, 1240140770639885705, 15461729627686219061, 6574742069523544220, 3131690396120496930, 17758791276367026584, 10046968584624867256, 16910374147545432071, 12405462687145854473, 9006078559482542456, 13476220060215365999, 8384214154009398478, 10365404322190410833, 6851505899182549268, 18261819862243438027, 2823760450959191582, 17079185842171546000, 2573099324947734045, 9396372422985936818, 6899349384621454800, 0, 5296, 12442366360197298238, 6098667720777990098, 15014871424912942550, 15008680935203256586, 5625270093505773824, 14457467770650559296, 10887298179723462085, 16706947956141547836, 13310039786220231748, 6132850845308416918, 12403357056402201263, 1240140770639885705, 15461729627686219061, 6574742069523544220, 3131690396120496930, 17758791276367026584, 10046968584624867256, 16910374147545432071, 12405462687145854473, 9006078559482542456, 13476220060215365999, 8384214154009398478, 10365404322190410833, 6851505899182549268, 18261819862243438027, 2823760450959191582, 17079185842171546000, 2573099324947734045, 9396372422985936818, 6899349384621454800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(17) }, program_info: ProgramInfo { program_hash: Word([8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 18, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 160, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 0, 41, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 7, 1, 0, 0, 1, 0, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 7, 1, 9, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 5, 0, 0, 1, 0, 1, 1, 1, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 1, 1, 0, 41, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 9, 1, 0, 0, 1, 0, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 12, 1, 14, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 1, 1, 1, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 6002676145170957552, 5665896864361060199, 589873375673641870, 1610809089415408623, 1276807186500217245, 4352525099414593256, 5571840125263174859, 10945967283455090973, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 10827276321637451859, 1419643695620305796, 7836113917086293276, 10289142213544989468, 5374430875291145484, 11783370765491737635, 13820432364368151262, 11923860796119339735, 0, 0, 1, 0, 0, 1, 1, 0, 0, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 16116071169182046485, 13243492223453509904, 11600144893983875756, 8055423479702674738, 14226887805014239710, 5183721621480304370, 14925669435061449558, 6899349384621454800, 0, 0, 1, 0, 0, 1, 1, 0, 0, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 16116071169182046485, 13243492223453509904, 11600144893983875756, 8055423479702674738, 14226887805014239710, 5183721621480304370, 14925669435061449558, 6899349384621454800, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 1, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 1, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 1, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 1, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 1, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 1, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 1, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 1, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 1, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 6811813611500970866, 9860311344216082483, 279816225750213135, 1439899159397533405, 4254579990847524851, 13079805966919738688, 6743125803107521679, 4681956701739972184, 7418486580310857761, 7994119771983090684, 13498446627995378981, 12442366360197298238, 2, 0, 0, 0, 1, 0, 0, 0, 0, 12330218901740233931, 4356844177334189800, 3650402777016745376, 14727094498238943916, 17114576923598071233, 12218492589526939611, 1867163304908812007, 3297507518564977562, 17019749743168160467, 1155757367334915164, 6649809143130705797, 6098667720777990098, 2, 0, 0, 0, 1, 0, 0, 0, 0, 16287800225917557614, 8724150062868049447, 1781472746866786234, 10746359213734270257, 14501968992007296006, 1562069618543971026, 1669000574108639518, 10978317254779656082, 4937487787523099272, 14020255521522346779, 9522654220689816851, 15014871424912942550, 2, 0, 0, 0, 1, 0, 14877174880820946473, 17456558212836048017, 17739158337269775126, 2390658038828763199, 3846911055059526201, 10113987313323159199, 1223812058834541930, 7693932549469059792, 952986602744509450, 3582028644269610893, 18354142145846877062, 9870317658000082520, 17824815497741664585, 7559480440412863769, 15008680935203256586, 2, 0, 0, 0, 1, 0, 13977067499243959482, 11395256034671298845, 7327799218104320227, 2699367049541735206, 7763338432894318220, 30358156203896034, 6743090978755405998, 12027612752909244618, 2303575863276843576, 13566879202183211144, 14991347734816807516, 15545533182903182788, 3824341730458112374, 8930056613191782368, 10887298179723462085, 2, 0, 0, 0, 1, 0, 8858901812137030682, 13558987077266275339, 15564429589094530081, 5734803687955113279, 15092595329879644577, 1697370376582801763, 13966013418513317366, 15212529265532680398, 11814345067449767109, 12248403740758614702, 13253613960908137010, 13069247508460875244, 5646668393535724753, 12836057040498431452, 6132850845308416918, 2, 0, 0, 0, 1, 0, 3289076678693837113, 3306415136959427537, 4595381067892187327, 15617193812494172197, 13969944955380272714, 2151092097708635255, 9308934663460035993, 17701622526704384546, 10643130636190759117, 10608583573536775206, 2924854172257996410, 16966215805924461950, 11523838157115606042, 13766601347831535388, 15461729627686219061, 2, 0, 0, 0, 1, 0, 2861046167966645052, 10889239779607274128, 17320053671944779813, 3406927099241203725, 4689628285093180625, 8991051645303444091, 15420175838347825984, 10581163748471525208, 2494640429618639710, 5287408014276309700, 12153757963762118208, 8235209133198882488, 16153951788992043302, 6738693051085880966, 17758791276367026584, 2, 0, 0, 0, 1, 0, 10308255496352503262, 18121871418048845228, 15889419620549458343, 10343975768128176185, 1524422576558323017, 10037026397378548640, 11821902144147060712, 11001907572334629439, 15808731023964574299, 9790979724735385269, 15700324760341857643, 17774065041915838082, 10370417002357863310, 14069036937855587505, 12405462687145854473, 2, 0, 0, 0, 1, 0, 11515575222719100082, 3607722074361327345, 10538200152279946362, 3757345954094976880, 3511571172448102031, 18213897356329070177, 10064659859509677191, 724394552750888620, 1595171953489970254, 11073532118063625032, 9731412496448089833, 5891290976833577870, 11096622266210541923, 1899062451757954377, 8384214154009398478, 2, 0, 0, 0, 1, 0, 5623476244212125463, 0, 0, 11387279664761561894, 16119779393022010645, 12476469095199609689, 3278355048806054125, 11468668142758644503, 4997071000317359325, 17451936898459652544, 16157291854026127596, 2945651218563202825, 11746170412650491065, 7698809547406684914, 18261819862243438027, 2, 0, 0, 0, 1, 0, 0, 0, 0, 12664138717389652380, 16373019178487693626, 5311930945536331644, 4616652429570306671, 2671393322368710032, 7020445890779083806, 15646972017585065174, 16340142805513243131, 2481092360881257830, 6535987403990440638, 3104393142368480565, 17079185842171546000, 2, 0, 0, 0, 1, 0, 0, 0, 0, 8299034149894841811, 13423474518210064130, 7223353560134237057, 3777113587480581710, 1059544940949021637, 13774982404484476980, 8948369964312160088, 13982894413446367987, 10656699665804756215, 10122156746538229970, 7738728989754721313, 2573099324947734045, 2, 0, 0, 0, 1, 0, 0, 0, 0, 4141583402420192864, 10379152206886126257, 13509433978352760019, 7620976189553973499, 18127894597596272634, 17184349270149775183, 12421841574297279117, 16491357058269217705, 2380753665748314674, 3728282910211741030, 4802195899845329288, 9396372422985936818, 2, 0, 0, 0, 1, 0, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 16116071169182046485, 13243492223453509904, 11600144893983875756, 8055423479702674738, 14226887805014239710, 5183721621480304370, 14925669435061449558, 6899349384621454800, 2, 0, 0, 0, 1, 0, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 85, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 321461142783715873, 340111207878988785, 16980963677900604856, 8122025352910807675, 2672032990889952726, 18287547865064093386, 6883907187243818989, 16773782102167370766, 11249881205591563163, 1709210755771630360, 13599297410359034734, 4944140066849387506, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2826379816086788535, 18256387944673635196, 15976151213056828438, 14806163515298168591, 10966643852490493990, 16643076982183140204, 10614920431791547888, 9517551778943323923, 16071218949222383338, 11707086547963657475, 11548640197966434952, 2095785635431009262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1389982844959459783, 10860511098536981986, 92714918004478284, 5442054526001626765, 2592429945178091576, 17607797632632583753, 13376310260819809150, 9735157781939056258, 546830354766363539, 2794745820933624420, 16397756946501824199, 12375413327700682072, 1, 0, 0, 0, 1, 0, 7216891187249046669, 17104304802226135179, 213723419203905114, 7504428176840094167, 8459821732881051520, 17365496272474871894, 3774836954819930057, 8172562148455605634, 4606352897788642339, 970536228322621221, 13685677539131842935, 7776682728634159270, 2841923277622193225, 4509993724149584481, 11081872751342419742, 1, 0, 0, 0, 1, 0, 13630982819704974164, 709629587910116102, 10852437178432066259, 7971642927196132266, 13791358524817111974, 16893172732645584491, 379441097109437269, 9875636580100479976, 9887976024132347018, 18182241650367492861, 16455044890046321010, 8386791303267182172, 14692549583873964816, 1679695851270735493, 6718639559482054424, 1, 0, 0, 0, 1, 0, 16461193933015291689, 9011520252233625918, 15300572918329198995, 17186760898540197468, 9775353746636648794, 2501796678284190373, 10400069677678307421, 491259531166040341, 17832834191852929098, 9409416070961479945, 8049700212209077372, 16951904742993551809, 6052645635446937049, 4189079835826917979, 12122170781554046887, 1, 0, 0, 0, 1, 0, 13955125520582449746, 13107809866340143246, 13139247942561227813, 14264987096664760063, 8663944065392476082, 26738717326360259, 18413269984357459958, 5789610466730383818, 18316393283013557997, 13615028923015526256, 17099282884571514622, 390611853699198814, 12233143040630128964, 18357860221728901477, 16799534473726304569, 1, 0, 0, 0, 1, 0, 14763764810165002571, 7475534393389499071, 4111976696170618769, 8192703318881365638, 6327683047402873297, 6986963031258272860, 11851310101017854885, 15784515228652197776, 2684395608227063909, 14504653302726904108, 16371352256021817139, 11552589705164935867, 15548258272185388836, 11050299770631141961, 7686328019139102331, 1, 0, 0, 0, 1, 0, 5685269238246855930, 7640663189411641925, 12336665115542599217, 17852385312535653754, 9430822593953620080, 15075850538217806798, 6966840703169954718, 7841617945839187879, 13946693875892332716, 367320422432359503, 12952269508513821163, 16069569499603265432, 7218244406354738621, 12664144355455319157, 2506152622879710750, 1, 0, 0, 0, 1, 0, 1427472554639263168, 18418882661072479711, 9257829930238828548, 8976000347315438733, 323829297696706606, 6173756644452043592, 6457652449305783921, 6762591351360230328, 3265288527569414193, 4458873320026667405, 16759292612217335519, 10892805137373131994, 15139518776246125573, 14791890923980574308, 8760992635981950709, 1, 0, 0, 0, 1, 0, 7302903671861085826, 0, 0, 16635907827753325426, 16419251794401517641, 12463158039410249198, 8120300831241327696, 10750885965856570936, 9614148693204557112, 4158450525844909688, 7792109010626424915, 13088066304082794059, 4656955130371010155, 1746726629032389326, 1219894586292412814, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2377128724052460864, 2239581712082993389, 7060420962088551737, 432418536618916281, 16868606775754956395, 17518823857230050559, 3246198533692444934, 7480053259498635867, 419065699932221163, 17118765335121629772, 4235062597258109895, 824784286256764128, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4064757387509104114, 12489932951016483829, 9342274029206616333, 10696618739033813212, 12653757924793616214, 7139121107914525514, 3222033110084083257, 3615950593461764641, 3886495484944885171, 3475198118169682060, 17016381150799971149, 10170016208525526833, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5276412771718093926, 11738733634614750668, 1435264878438078251, 2085147768356017783, 11706271638131904220, 470824845274439747, 5683784147168326312, 16487019928286415392, 1240710433266681785, 11483695604905597390, 387032599105912823, 593495485489349093, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 10827276321637451859, 1419643695620305796, 7836113917086293276, 10289142213544989468, 5374430875291145484, 11783370765491737635, 13820432364368151262, 11923860796119339735, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8212736248369912082, 4071281311826053218, 16681111697957494384, 6160598189905115531, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10784649219148085459, 16204388331933209503, 7535295255934147784, 8594455900178560628, 7058022398850579311, 4610105990937441552, 14292233265078610671, 11512968082996599149, 3080746365611415597, 11859146482331138479, 11664682242720909218, 915471480408530766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 128781735205120527, 9851558383041711453, 14961534904937133494, 5726930420197336139, 14448859106484550632, 14871257653827208567, 11560507218468362083, 1159818605994823015, 6133575519759388325, 12232695746376293294, 2500570831459298438, 18393930191488027312, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4547968979093876849, 2647731244796610075, 15458110929197782417, 13273590888045863622, 8488923843888712176, 17566918610707158078, 11435884371355098677, 2364926874595277907, 11695447135684149141, 995389826954784529, 13004725650794618836, 13545212286845976163, 1, 0, 0, 0, 1, 0, 10963869565254465549, 3178875389651486587, 584333678278801940, 3546336675446295543, 13479103754506160685, 5854257801187918217, 8753781667987110661, 14387511811111000559, 4662267156400217313, 707619676799722739, 7943063494760571709, 6615075028106709917, 11949085664163595757, 8624527149940617200, 18210660875436245579, 1, 0, 0, 0, 1, 0, 7672596955217153457, 5064179278899630287, 15824928726849370210, 5493374351233807563, 8910192708346993775, 6953015881067099300, 11540514940863049397, 81438176960127805, 8933338746704632990, 4672379866331806862, 15342799649049057800, 1254198290967296340, 12608149157887976305, 2589834268393847902, 8676871105886252208, 1, 0, 0, 0, 1, 0, 3531253839134075838, 16735896821376739720, 8167081614237821546, 1614874318552505578, 12924378726200437768, 2748780903535738274, 1424153760517090352, 13654856085785737791, 17049945775096584485, 9708763303767628077, 16691905436935888241, 14739488160024614333, 9454287016901482416, 11899064714918281636, 9265666514596208448, 1, 0, 0, 0, 1, 0, 13609225654816031898, 16627834940022015256, 10557198230311183963, 8307036201059139827, 14386798070662103151, 12069265029549314681, 16087116659981325603, 15278759115432814741, 1233454545325180310, 16036499041626449319, 16328475049153986635, 8945689852522735768, 2150959420327906479, 11946855882944424845, 9457367929087028434, 1, 0, 0, 0, 1, 0, 17700630260394682670, 10564666254450756820, 13128612970712110036, 9024048572557701022, 10724238176158470430, 13358005363663908988, 2170747068790740224, 4277878641698006595, 9548215660109667029, 5119649922187981964, 1750096680784451786, 10185013658812384549, 17565393891424303638, 7842923952979169755, 8358881080234670725, 1, 0, 0, 0, 1, 0, 12969929663590209562, 17400427229379047873, 8161725761906333130, 13981710006578989582, 7297009056930466619, 3604233398898996465, 9993917348799810609, 16823455732252835952, 9206641926728869527, 32726321504424883, 627717841813244731, 5673651272129016554, 4241445880929460300, 5936050971291911531, 6541843013709002421, 1, 0, 0, 0, 1, 0, 12686638732510422112, 8915914979000954491, 17429665533669488649, 11824695302249715491, 13382186579597492216, 16156878489884540028, 12787265931454127207, 5871229270093729693, 4856995795253621298, 14683358530499849942, 10259409981493264670, 1502692624900434396, 5250671015911848716, 8190973727913189622, 10224257779706313529, 1, 0, 0, 0, 1, 0, 15763807785631230887, 0, 0, 9872576991436394594, 6000186529178301892, 4992467617151662209, 10689062953812945200, 3521868013962458536, 6696272579393185401, 12213179217732598594, 8469105874522435313, 3389969163810664285, 5618587527864308269, 10050755079785196589, 11722023958758893627, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10552500864729979640, 7022204645736728964, 12063673466969028652, 3744742376692732597, 8813490692122304227, 10134861521414682067, 3637686875728492502, 3404810976915461357, 17084466347038006872, 2626622112813681720, 10906931598039016782, 13905103948731397841, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18032794979945654604, 5338134468072720249, 6266501778891918617, 7474246814889551252, 15033504818965134746, 17465898446534646298, 2382678006125050452, 3829882598743334141, 6606368157240498477, 4599215552676510549, 16150808274840457147, 9009398081722850699, 1, 0, 0, 0, 1, 0, 0, 0, 0, 153382829717154572, 15645384100209479912, 17390445613818630245, 12416458660228151392, 671768789535371387, 2270472397704099161, 14226016292255835291, 14062283116063151751, 13093088208853880999, 5363423870755590475, 13280081123993966327, 16014363687546775515, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851, 6002676145170957552, 5665896864361060199, 589873375673641870, 1610809089415408623, 1276807186500217245, 4352525099414593256, 5571840125263174859, 10945967283455090973, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(17) }, program_info: ProgramInfo { program_hash: Word([8442199976350624000, 9488069924049927331, 3589804369840038271, 11846932079106298851]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 18, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_11.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_11.snap index 40691a79f7..a246ce02de 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_11.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_11.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 7458506668679174706, 7458506668679174706, 7458506668679174706, 7458506668679174706, 7458506668679174706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 18375473735916206629, 18375473735916206629, 18375473735916206629, 18375473735916206629, 18375473735916206629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2105717247508690050, 2105717247508690050, 2105717247508690050, 2105717247508690050, 2105717247508690050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1679902783560062568, 1679902783560062568, 1679902783560062568, 1679902783560062568, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 97, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 7458506668679174706, 1032, 8, 0, 7458506668679174706, 8038422000946611307, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111], [18375473735916206629, 0, 1, 1, 18375473735916206629, 18375473735916206629, 0, 65, 65, 18375473735916206629, 14346009158187546482, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290], [2105717247508690050, 0, 0, 0, 2105717247508690050, 2105717247508690050, 0, 0, 0, 2105717247508690050, 2190566822905267077, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045], [1679902783560062568, 0, 0, 0, 1679902783560062568, 1679902783560062568, 0, 0, 0, 1679902783560062568, 2591468219526413421, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704], [8038422000946611307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [14346009158187546482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2190566822905267077, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2591468219526413421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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], [2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2188, 4375, 6562, 8749, 10936, 13123, 15310, 17497, 19684, 21871, 24058, 26245, 28432, 30619, 32806, 34993, 37180, 39367, 41554, 43741, 45928, 48115, 50302, 52489, 54676, 56863, 59050, 61237, 63424, 64153, 64882, 65125, 65368, 65449, 65530, 65533, 65534, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 17096349974747592886, 18361620591822500183, 16289398515402274208, 12841425204405288471, 15487398038599823036, 14276138499607098431, 10749365977722278245, 6523151203286366650, 4335325190849710619, 15614163639554121613, 12559670426893619349, 2624231249184618532, 172006848477927500, 14464825374273596237, 17032775430832607567, 5313985443683323356, 5926060660140296438, 17163852599398532090, 13307451342254896743, 6745543631073250405, 5541607425778637052, 17242934273716413404, 8175629301673337378, 9641946119039093964, 13376211201769313404, 3983555747063229007, 2734833199126280117, 726265693390881232, 14561475405601408308, 12499075216226282978, 385638883771950111, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 7458506668679174706, 14091156936533878352, 9449073279161460587, 12931192181764701571, 984010488942368543, 9685532581221734183, 7253373568681004065, 3375237562644883775, 6753674160453463758, 3441205833090784550, 2852031204586017293, 17888529253300920997, 14261166963032608042, 7584983368183421126, 6933428701043454429, 6613788239612360156, 12188550669627194766, 11116051071552283912, 12942594340955341249, 15973329405569184071, 6599410081338642359, 9166275669564489461, 16205691190134424749, 10240544379350652389, 617488447888956772, 10444963251954281557, 1760171480459315772, 225922431704781657, 6781621337133548780, 6905620312272855934, 11742310966982885025, 8038422000946611307, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 4928386710787932510, 1059957073285149997, 7414794499417747342, 8707706418338537128, 18233967745224015541, 14225356453364529209, 16969240713191698060, 2722387933855210372, 10882627342955990743, 8403803192675895448, 16245041381764943451, 3708333802929870625, 6959279407809842059, 13217946414061638961, 18053036458820754856, 14921461448469870468, 560525447297576809, 7018646217871183595, 13178251276894296346, 6921572661546485589, 15572457938054287524, 2649667358943828601, 7478653578860599304, 10687080159641340324, 2690283767645584259, 18436093682323240213, 7844418673662650289, 14896924519547367367, 5700869957895642798, 1468047895374295633, 14533042520471865290, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 18375473735916206629, 11043817201346618265, 1121487758252150877, 11145191037714825824, 1213485180702191508, 7846971226962020365, 6910576852826920348, 16299106229207932049, 13494897806355030713, 14683406224909707924, 7225022863877466358, 8659258489615358612, 1007283657566761474, 3461275599657397285, 13991061905462032659, 7694544543570254942, 13915724103240909421, 3035711690563019728, 12166494415818485436, 8309121944568509175, 14938409169697365298, 8594201398583676528, 10975429338366528094, 12203611326855107051, 13805253251340915462, 17236773525845958123, 8285118005586313889, 4578896616328629575, 4956581778649408453, 2207149270543631094, 14846185326871759573, 14346009158187546482, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 10107555422114249811, 10238372411792495411, 5045095827015758924, 712045908447132336, 5489587686936736744, 16325305247621291738, 3474647312056323841, 17923261380734419001, 6422147522697035080, 14808436219267178190, 498420322150313505, 13431378003732567637, 7624522606684096342, 16563220449590599184, 17295714046586140515, 670583892751407031, 2602239721821758274, 6195887607206027232, 2861627473244922884, 4750941303537176677, 9649080575881148937, 13116712088373847968, 6713440703831969386, 8417294471144249339, 1401889430288725516, 4371677581775699941, 4682611113744629451, 15268715163867613574, 18046680204045439410, 4916517868000584486, 12416920551073560045, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 2105717247508690050, 3724970573052107073, 8941582041334934334, 8312329417918475026, 1987590179830007973, 2110379688364488268, 2640821370997726846, 8705349523122969177, 17635305137043271645, 5321945504199945322, 14864981808156728804, 12170067272088757680, 9570740252338888760, 8752234911193229380, 7657051830321493279, 10054332690091372507, 9785276524271352823, 11645316320468991699, 16682105615873122608, 11466817788450225616, 11077840439234171924, 8390120315669274279, 15664297021877418193, 9890840092123213718, 14010940161066467221, 6608692618887145744, 7336759030812521166, 6773864172894681873, 14718016860648898221, 10620364686165750780, 13091258350263300328, 2190566822905267077, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 4294967292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 6240831473992650349, 7295075507077524016, 1708983071443589586, 5101441454781013927, 1762085221214582981, 4624893715923722401, 5034791698378793493, 2426086071573235308, 5506620828865036918, 7907851684587935310, 191858132690363422, 12189827080513272685, 4161952004851845371, 3113047032182286095, 9384643295764542420, 16611260466052466604, 10297192864125327962, 8420396089584454313, 17843538048800435721, 49291998290789182, 15454664486445800726, 3574645404922812405, 11401680143523240515, 4109004423430966857, 16206235872347886942, 1597537279118331686, 11520518532281367191, 3135755890995221672, 15097801996593502346, 4266164594774171363, 6947485957721124704, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 1679902783560062568, 14885555914322696710, 11595861135030037790, 15790255405818319154, 1788244094476607025, 3713346340151405890, 10088532170345334842, 17854024334494248585, 12211195930325373909, 14810607828402585285, 6176927505545789216, 7340196426348852368, 4385801084072612889, 14434159451233581456, 16984288007453782663, 5968497068768213078, 13891165676869534375, 11051615708535243788, 18406940479749704351, 4657122466881791459, 11427117893432527856, 9342747858627858744, 4615623292891883658, 2986843800380659541, 3219777777177975421, 8998753509000282586, 14589941254121359798, 3914101860949270917, 12606215244329868526, 16670383938906392554, 9639583597360292920, 2591468219526413421, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8038422000946611307, 13055964544694368769, 7749914311668337250, 2490550827364591193, 4834428694324052171, 1237735850038716981, 8896240793576304991, 6582069168543167041, 3706649958322292721, 6839310826708053103, 12095513884410398346, 12922970210395916603, 12358523363220613934, 16454123186601925336, 4991814670781152799, 2040061269519504799, 17488717307568714132, 17317480533129930885, 2098096181527665460, 4697187904025813178, 1478747224857255407, 4468957360091397608, 17536692358706723977, 13559769323964866828, 10531481423547827694, 5398218750581689859, 8391144048742825188, 16471665752727725784, 3043860411079700945, 3316394317418127534, 7755478137750309004, 15345115023987982060, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 0, 7045578468266939554, 7760605592330700907, 8360793687611805321, 738095676972904954, 15564477193367915463, 5876321119815014086, 17552573089477749612, 11411212736325006200, 13815587307529680030, 17156301712489415615, 17351081171119935003, 8966918709601352564, 3417326002908165374, 5362234606277969799, 6579629986598330856, 12247315276947966697, 18410067321498813805, 16182198715872613358, 11840483485843621799, 10053996112039279419, 8402815695409633837, 14225254012036856662, 269445170964238763, 7745973219325669511, 13587984894488746939, 8094627026199116369, 3994495212216710235, 9140718271797260749, 16931156974940547986, 14990750302990274425, 2224156252998910395, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [14346009158187546482, 2514419654263230233, 10868075426920088717, 14626639685450047092, 15824191413144451094, 3872785008711037698, 15159572856872914175, 13499848828490637487, 12504162360551599075, 6704874092885621909, 8482918267067478031, 11182299479692082524, 1644784474325024851, 10866220166037749110, 13011220300525187244, 5714286046111667701, 3271812982662883550, 4912758288798487759, 12958366352003970496, 11568317646859944473, 1188141313951948960, 12777681205968064182, 13771180111214880533, 3688955093092273987, 1949816493804567768, 12058362437595143266, 18379600813280833240, 11754259659339519197, 7370638446447886746, 2915034789487291427, 17553720084081617212, 15041334301981527295, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 0, 14745280635380601617, 3718367898484243235, 9018263790739496394, 11183632545038441118, 11084602196898449287, 10533306301610546918, 1420887495241955081, 4459785951807836148, 12821108383646715262, 10486453955800644813, 1149237165662367781, 14820375481022552179, 16262631485420346362, 15566979183400849953, 16057390897683363413, 11254638356144199099, 15872210457308658069, 81952248385650954, 18028966990791016994, 6002088535876283975, 14457561209066214295, 12899353015952976468, 2384048206878222613, 11488447290357428274, 7532999527428712911, 63498412877849097, 17284768262212667433, 15648250834702978300, 8529394818161928928, 12738537911867917740, 15275140426936934232, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2190566822905267077, 5404282949943047077, 5620556269036690141, 14491113445439742990, 3583407126333665201, 11553681770295205503, 1216093779061977398, 9009035935586042381, 10160118687758838044, 5189341129501661569, 552602416783565214, 13892332176168710533, 4210303372183975982, 9918111397467437847, 13191859809007430670, 12682554283327491677, 6159734265799796346, 3655472932705407889, 6138462302257325090, 9507551446430113809, 477055463074084789, 5562148904013569055, 16089614614433980121, 11132173538218883660, 2369773375363070297, 8734570802518415843, 13624820787911837119, 15026940072471861444, 10407697142160461181, 14258174989754257767, 11934701342627358954, 17583525004205959015, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 11085857321233345859, 6502498117283132750, 10381882708453841125, 13452669420839074331, 4680755747100261382, 2695613323752232712, 17146809849277743421, 9239864853466318604, 14768453813159795872, 18276894718067265811, 17257251339549225733, 5284904431001214307, 5764961239481152941, 10517783806308559735, 15410914971073808541, 3344855092587244940, 10472918269298152403, 12402503503713090948, 2754408248470837514, 15057664949131650205, 4187574032621547594, 5855521755089516239, 13990442832618678273, 14308234035637757543, 11933928216400818327, 15524863835262422966, 11531650814746237864, 7664866084994005813, 6402603575808426205, 15478402516028642985, 9020969347685648365, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2591468219526413421, 8600073145915840029, 9972703476491052945, 7474968551123382164, 7181997692355145187, 15428345773987404117, 11743605500774065098, 11268864392770353056, 12211833414579612038, 15717209816757714363, 890156557088959300, 4859169418838628114, 17769229151585966679, 14412689958488784376, 3341988471057096642, 3129947071292798718, 17633680398960744148, 9040916820504033241, 5930774742161220001, 13876115104798876568, 6388325427377182963, 14330705119681412991, 15768069489925358116, 6157532873490141938, 2469680878449864864, 12328809527998355692, 16304509166225849524, 3168032149605842623, 935982989392333515, 1210836981232166821, 15698638297176561506, 17830733542807512157, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 7442777957161348409, 12950881678740459660, 6646706469455563416, 5900873935105415470, 17072140113884084441, 13172589932512713520, 5522401646053069342, 3133914205806983551, 13779823240426764791, 17224433130794138533, 14489298897463599319, 1940759318652413905, 7694480472126993559, 17366018125192157291, 16887976527497663730, 1916565854454348991, 2294268388330909452, 8983416234083684410, 11974102734257880906, 11534526793163396841, 10005306190103088231, 12997092893241557181, 2268817966601289631, 8051413784985211055, 5191686653404052624, 18373940558834700052, 4703711900874228713, 2364324903714729084, 11224300914395639224, 6723817418214557043, 2429828201690573781, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10050771506480654697, 13420837528738763520, 8496521368864059734, 2484674105691110618, 14534130756197581682, 5302125583480436763, 17447925507451726835, 6158355997654729039, 2747272733640735637, 16008460117209203149, 7966664559987380274, 12228289745234304260, 5769015309045246106, 10117630725268935850, 1928165892714903315, 13757138220331554723, 3415891051222089939, 9614135373790971720, 15460760939838461118, 3083939397091390513, 5208743639505571028, 10512816629673800187, 1038453745979635965, 11152507394095411482, 16277833565401448399, 1857640599304385129, 15507736315414043252, 10006390466474490543, 14803299263866517418, 15066726409373257878, 5538305542985598681, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 7045578468266940310, 11422404183367723688, 4734813192583045175, 16795465921267519808, 12362009349652409415, 3020519614827991855, 2942658800463567237, 18428726703177922018, 10231394582054281621, 8503976903131851970, 11539035678955040518, 6287740157380564628, 3273842793073629785, 15356197472622263350, 8793463497412363872, 15129820397597713369, 2881507314714938985, 10712615481926377093, 9279961334386063516, 4068525996563916658, 13774208723083831405, 17700397171958035166, 18249110448117027038, 8906205380227326203, 4362400237726204205, 16281776889210602562, 4962687005987029339, 5046527547997136739, 15389940485215503504, 8078314735919109828, 5959378659908477764, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 2147483648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 8629850144821916384, 4475574334214635511, 15844375305567102825, 10178368558488980289, 366424541133389116, 14318718192085040201, 11141735015346329315, 14736248158977353058, 6659594400091594161, 9354501143254856958, 1788553586845505120, 13567541605223635136, 18116490434673131256, 3267515885574430559, 4026772730948844076, 2031101258349406169, 1067905233090125355, 3177657145644554672, 3126867087711378899, 2351734901108666112, 7401562071196444455, 11029998200473456200, 12823977733512090066, 9220325101017945081, 9541188526080901705, 9807406399356825925, 11614758863876097772, 7718195260684522704, 12447607757449687684, 2284861843754100216, 16982814561187843115, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 108, 14745280635380602265, 1030231790864474253, 8493304069558799424, 3813500112725093016, 1584024639278012914, 6691630066548896421, 12744785931761802081, 8312414042457270416, 15913285332885706950, 11904695260466451537, 4503780104272324718, 3020894344784966101, 8121142696445856470, 7323566571197968291, 15900985531249599446, 7156364108131320107, 15910943131140158025, 14526518136578598747, 6720684608059903461, 17378127155945101975, 8120421969064271148, 12903874735177520891, 4533560749542240026, 13603960728052470511, 5595478722910465584, 1530061232442071378, 8451873054224800759, 7908366039873426748, 17285432733773675712, 7133857220640768475, 4076807723615210075, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 17468442170295488858, 9773381208787513234, 2185606873808106597, 5326701750299677540, 18331867594591263096, 548097224697282340, 10547562414019002308, 13272144351666153699, 15855067207807736351, 4370081121859711944, 2612761535881667398, 16433499902516242349, 5490313979471750512, 12242667433588409287, 13667932040054721093, 11397361705799260268, 13352179165506178583, 18130276598071715349, 5367905172204163759, 13899921222016942193, 16739429834098497391, 9456664549854782490, 18285262020229949627, 11267975946641671449, 4164320394230196430, 17698213099167806270, 5464680925773178239, 16672746771430202203, 17570877581179860050, 2661602147392096981, 17592358249594079251, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 11085857321233346183, 17340772818369048990, 4710612857210121909, 6383904020814938565, 2185295286363661452, 57911040231161987, 16587511410977976694, 2708167856204711091, 10934568936892706192, 16945176268586506094, 6648082856126081802, 13508616389857401321, 2042841450297716791, 14424400955124662023, 4566271445414618189, 6323391233814555017, 5903620650725668621, 10799633056255259898, 7254762119029478931, 8510983625183148698, 11995653210052429396, 8580571627687871547, 6611487504966808602, 4153539838331475868, 485956658090184855, 13092360131462553695, 16519639797422070758, 15931672450436655146, 1240279786436372570, 14570949492747980696, 1405895934075613917, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 17244797586245886456, 15751718828876603764, 11509908635527699125, 11475332140491226913, 17384989371947212455, 334761494745252139, 7616687658781298414, 14780080241553087954, 12346184924771259853, 16185631853241338171, 895339354972846288, 4068422042358699181, 17829363972116539489, 16616980036078363960, 11802237368737486290, 5517794271194351375, 1340602429246747412, 6137287375961878929, 9089335960846268476, 10715486062907500431, 9038952715608883929, 3376751855710232954, 9293572206177681748, 5274360121930626670, 10385953241879043200, 15812468027446779083, 17985531203042807174, 4527163876177139455, 1244842376420464745, 7071163393872573565, 10505779527452689750, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 7442777957161348517, 15511565770182079598, 17588127306488605836, 12156963648059548539, 9855001437726729603, 750212215289098948, 3057342424889339513, 12076679785316333126, 4754090667046207383, 5287048869294162247, 13665676832765504604, 7892998254318929425, 10986386945260945625, 650038937356756422, 1562289959612081521, 18390988039078367877, 10259188468824740395, 8732714546322097295, 7010052931953742806, 17653496644410780843, 12884831098778763497, 17079843757158488506, 5971369750353050420, 3223792838828500232, 6029903770259711111, 16004411386897649153, 5901432683519548685, 18030233803416436591, 18259374036374690916, 15125936605156360851, 1558963802307733462, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(12) }, program_info: ProgramInfo { program_hash: Word([385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 13, range_trace_len: 41, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 1, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 6, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 5, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 6, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 7, 0, 0, 0, 1, 0, 0, 0, 8, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 6, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 6, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 7, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 6, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 5, 0, 0, 0, 0, 1, 1, 1, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 15345115023987982060, 15041334301981527295, 17583525004205959015, 17830733542807512157, 5538305542985598681, 16982814561187843115, 17592358249594079251, 10505779527452689750, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 2224156252998910395, 15275140426936934232, 9020969347685648365, 2429828201690573781, 5959378659908477764, 4076807723615210075, 1405895934075613917, 1558963802307733462, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 2, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 2, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 2, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 2, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 2, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 2, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 2, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 2, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 2, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 2, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 2, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 2, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 2, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 2, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 2, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 108, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9449073279161460587, 1121487758252150877, 8941582041334934334, 11595861135030037790, 7760605592330700907, 3718367898484243235, 6502498117283132750, 12950881678740459660, 11422404183367723688, 1030231790864474253, 17340772818369048990, 15511565770182079598, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12931192181764701571, 11145191037714825824, 8312329417918475026, 15790255405818319154, 8360793687611805321, 9018263790739496394, 10381882708453841125, 6646706469455563416, 4734813192583045175, 8493304069558799424, 4710612857210121909, 17588127306488605836, 1, 0, 0, 0, 1, 0, 0, 0, 0, 984010488942368543, 1213485180702191508, 1987590179830007973, 1788244094476607025, 738095676972904954, 11183632545038441118, 13452669420839074331, 5900873935105415470, 16795465921267519808, 3813500112725093016, 6383904020814938565, 12156963648059548539, 1, 0, 0, 0, 1, 0, 17823833418367433838, 10163261575005260622, 16867152799881751267, 9685532581221734183, 7846971226962020365, 2110379688364488268, 3713346340151405890, 15564477193367915463, 11084602196898449287, 4680755747100261382, 17072140113884084441, 12362009349652409415, 1584024639278012914, 2185295286363661452, 9855001437726729603, 1, 0, 0, 0, 1, 0, 16263253970534166960, 18299548522351097591, 2763752469532803404, 6753674160453463758, 13494897806355030713, 17635305137043271645, 12211195930325373909, 11411212736325006200, 4459785951807836148, 9239864853466318604, 3133914205806983551, 18428726703177922018, 8312414042457270416, 2708167856204711091, 12076679785316333126, 1, 0, 0, 0, 1, 0, 9250560550349672379, 4111731623463033163, 12435642223369362064, 17888529253300920997, 8659258489615358612, 12170067272088757680, 7340196426348852368, 17351081171119935003, 1149237165662367781, 17257251339549225733, 14489298897463599319, 11539035678955040518, 4503780104272324718, 6648082856126081802, 13665676832765504604, 1, 0, 0, 0, 1, 0, 15411388868694405084, 8403298620076719772, 9672760334604751932, 6933428701043454429, 13991061905462032659, 7657051830321493279, 16984288007453782663, 5362234606277969799, 15566979183400849953, 10517783806308559735, 17366018125192157291, 15356197472622263350, 7323566571197968291, 14424400955124662023, 650038937356756422, 1, 0, 0, 0, 1, 0, 1186775770822648218, 3847522256362703115, 803671992030916978, 11116051071552283912, 3035711690563019728, 11645316320468991699, 11051615708535243788, 18410067321498813805, 15872210457308658069, 10472918269298152403, 2294268388330909452, 2881507314714938985, 15910943131140158025, 5903620650725668621, 10259188468824740395, 1, 0, 0, 0, 1, 0, 4455783957351365745, 4244879931623960089, 5077946946054782793, 6599410081338642359, 14938409169697365298, 11077840439234171924, 11427117893432527856, 10053996112039279419, 6002088535876283975, 15057664949131650205, 11534526793163396841, 4068525996563916658, 17378127155945101975, 8510983625183148698, 17653496644410780843, 1, 0, 0, 0, 1, 0, 15773002892562336276, 10082181176672218839, 7305364504534574394, 10240544379350652389, 12203611326855107051, 9890840092123213718, 2986843800380659541, 269445170964238763, 2384048206878222613, 13990442832618678273, 2268817966601289631, 18249110448117027038, 4533560749542240026, 6611487504966808602, 5971369750353050420, 1, 0, 0, 0, 1, 0, 11384058812288717888, 0, 0, 1760171480459315772, 8285118005586313889, 7336759030812521166, 14589941254121359798, 8094627026199116369, 63498412877849097, 15524863835262422966, 18373940558834700052, 16281776889210602562, 1530061232442071378, 13092360131462553695, 16004411386897649153, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6781621337133548780, 4956581778649408453, 14718016860648898221, 12606215244329868526, 9140718271797260749, 15648250834702978300, 7664866084994005813, 2364324903714729084, 5046527547997136739, 7908366039873426748, 15931672450436655146, 18030233803416436591, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6905620312272855934, 2207149270543631094, 10620364686165750780, 16670383938906392554, 16931156974940547986, 8529394818161928928, 6402603575808426205, 11224300914395639224, 15389940485215503504, 17285432733773675712, 1240279786436372570, 18259374036374690916, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11742310966982885025, 14846185326871759573, 13091258350263300328, 9639583597360292920, 14990750302990274425, 12738537911867917740, 15478402516028642985, 6723817418214557043, 8078314735919109828, 7133857220640768475, 14570949492747980696, 15125936605156360851, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 2224156252998910395, 15275140426936934232, 9020969347685648365, 2429828201690573781, 5959378659908477764, 4076807723615210075, 1405895934075613917, 1558963802307733462, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18361620591822500183, 1059957073285149997, 10238372411792495411, 7295075507077524016, 7749914311668337250, 10868075426920088717, 5620556269036690141, 9972703476491052945, 13420837528738763520, 4475574334214635511, 9773381208787513234, 15751718828876603764, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16289398515402274208, 7414794499417747342, 5045095827015758924, 1708983071443589586, 2490550827364591193, 14626639685450047092, 14491113445439742990, 7474968551123382164, 8496521368864059734, 15844375305567102825, 2185606873808106597, 11509908635527699125, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12841425204405288471, 8707706418338537128, 712045908447132336, 5101441454781013927, 4834428694324052171, 15824191413144451094, 3583407126333665201, 7181997692355145187, 2484674105691110618, 10178368558488980289, 5326701750299677540, 11475332140491226913, 1, 0, 0, 0, 1, 0, 11645643459830071782, 17452639128133136408, 12995847406362179797, 15487398038599823036, 18233967745224015541, 5489587686936736744, 1762085221214582981, 1237735850038716981, 3872785008711037698, 11553681770295205503, 15428345773987404117, 14534130756197581682, 366424541133389116, 18331867594591263096, 17384989371947212455, 1, 0, 0, 0, 1, 0, 4487072367900477878, 7171904450118919866, 17827188519504780939, 6523151203286366650, 2722387933855210372, 17923261380734419001, 2426086071573235308, 3706649958322292721, 12504162360551599075, 10160118687758838044, 12211833414579612038, 6158355997654729039, 14736248158977353058, 13272144351666153699, 14780080241553087954, 1, 0, 0, 0, 1, 0, 13422884527210045309, 14780013685457338092, 5091415823979132990, 12559670426893619349, 16245041381764943451, 498420322150313505, 191858132690363422, 12922970210395916603, 11182299479692082524, 13892332176168710533, 4859169418838628114, 7966664559987380274, 1788553586845505120, 2612761535881667398, 895339354972846288, 1, 0, 0, 0, 1, 0, 945499751187771083, 17506834482620543131, 17636928664480131737, 14464825374273596237, 13217946414061638961, 16563220449590599184, 3113047032182286095, 4991814670781152799, 13011220300525187244, 13191859809007430670, 3341988471057096642, 10117630725268935850, 3267515885574430559, 12242667433588409287, 16616980036078363960, 1, 0, 0, 0, 1, 0, 7009760878916999172, 14463989071067232357, 6299414349120672984, 5926060660140296438, 560525447297576809, 2602239721821758274, 10297192864125327962, 17317480533129930885, 4912758288798487759, 3655472932705407889, 9040916820504033241, 3415891051222089939, 1067905233090125355, 13352179165506178583, 1340602429246747412, 1, 0, 0, 0, 1, 0, 4766670773273829174, 6721482847518652360, 12310728229379388686, 6745543631073250405, 6921572661546485589, 4750941303537176677, 49291998290789182, 1478747224857255407, 1188141313951948960, 477055463074084789, 6388325427377182963, 3083939397091390513, 2351734901108666112, 13899921222016942193, 10715486062907500431, 1, 0, 0, 0, 1, 0, 16138236286182850912, 18300827445906265048, 6811282905011593847, 8175629301673337378, 7478653578860599304, 6713440703831969386, 11401680143523240515, 13559769323964866828, 3688955093092273987, 11132173538218883660, 6157532873490141938, 1038453745979635965, 12823977733512090066, 18285262020229949627, 9293572206177681748, 1, 0, 0, 0, 1, 0, 2600985046105704136, 0, 0, 3983555747063229007, 18436093682323240213, 4371677581775699941, 1597537279118331686, 8391144048742825188, 18379600813280833240, 13624820787911837119, 16304509166225849524, 1857640599304385129, 9807406399356825925, 17698213099167806270, 15812468027446779083, 1, 0, 0, 0, 1, 0, 0, 0, 0, 726265693390881232, 14896924519547367367, 15268715163867613574, 3135755890995221672, 3043860411079700945, 7370638446447886746, 10407697142160461181, 935982989392333515, 10006390466474490543, 7718195260684522704, 16672746771430202203, 4527163876177139455, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14561475405601408308, 5700869957895642798, 18046680204045439410, 15097801996593502346, 3316394317418127534, 2915034789487291427, 14258174989754257767, 1210836981232166821, 14803299263866517418, 12447607757449687684, 17570877581179860050, 1244842376420464745, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12499075216226282978, 1468047895374295633, 4916517868000584486, 4266164594774171363, 7755478137750309004, 17553720084081617212, 11934701342627358954, 15698638297176561506, 15066726409373257878, 2284861843754100216, 2661602147392096981, 7071163393872573565, 1, 0, 0, 0, 1, 0, 0, 0, 0, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 15345115023987982060, 15041334301981527295, 17583525004205959015, 17830733542807512157, 5538305542985598681, 16982814561187843115, 17592358249594079251, 10505779527452689750, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 4294967292, 0, 1, 5, 0, 0, 2147483648, 0, 1, 0, 1, 1, 65535, 16383, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2188, 4375, 6562, 8749, 10936, 13123, 15310, 16039, 16282, 16363, 16372, 16381, 16382, 16383, 18570, 20757, 22944, 25131, 27318, 29505, 31692, 33879, 36066, 38253, 40440, 42627, 44814, 47001, 49188, 51375, 53562, 55749, 57936, 60123, 62310, 64497, 65226, 65469, 65496, 65523, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(12) }, program_info: ProgramInfo { program_hash: Word([385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 13, range_trace_len: 45, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 1, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_12.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_12.snap index 40691a79f7..a246ce02de 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_12.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_12.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 7458506668679174706, 7458506668679174706, 7458506668679174706, 7458506668679174706, 7458506668679174706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 18375473735916206629, 18375473735916206629, 18375473735916206629, 18375473735916206629, 18375473735916206629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2105717247508690050, 2105717247508690050, 2105717247508690050, 2105717247508690050, 2105717247508690050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1679902783560062568, 1679902783560062568, 1679902783560062568, 1679902783560062568, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 97, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 7458506668679174706, 1032, 8, 0, 7458506668679174706, 8038422000946611307, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111, 385638883771950111], [18375473735916206629, 0, 1, 1, 18375473735916206629, 18375473735916206629, 0, 65, 65, 18375473735916206629, 14346009158187546482, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290, 14533042520471865290], [2105717247508690050, 0, 0, 0, 2105717247508690050, 2105717247508690050, 0, 0, 0, 2105717247508690050, 2190566822905267077, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045, 12416920551073560045], [1679902783560062568, 0, 0, 0, 1679902783560062568, 1679902783560062568, 0, 0, 0, 1679902783560062568, 2591468219526413421, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704, 6947485957721124704], [8038422000946611307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [14346009158187546482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2190566822905267077, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2591468219526413421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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], [2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2188, 4375, 6562, 8749, 10936, 13123, 15310, 17497, 19684, 21871, 24058, 26245, 28432, 30619, 32806, 34993, 37180, 39367, 41554, 43741, 45928, 48115, 50302, 52489, 54676, 56863, 59050, 61237, 63424, 64153, 64882, 65125, 65368, 65449, 65530, 65533, 65534, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 17096349974747592886, 18361620591822500183, 16289398515402274208, 12841425204405288471, 15487398038599823036, 14276138499607098431, 10749365977722278245, 6523151203286366650, 4335325190849710619, 15614163639554121613, 12559670426893619349, 2624231249184618532, 172006848477927500, 14464825374273596237, 17032775430832607567, 5313985443683323356, 5926060660140296438, 17163852599398532090, 13307451342254896743, 6745543631073250405, 5541607425778637052, 17242934273716413404, 8175629301673337378, 9641946119039093964, 13376211201769313404, 3983555747063229007, 2734833199126280117, 726265693390881232, 14561475405601408308, 12499075216226282978, 385638883771950111, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 7458506668679174706, 14091156936533878352, 9449073279161460587, 12931192181764701571, 984010488942368543, 9685532581221734183, 7253373568681004065, 3375237562644883775, 6753674160453463758, 3441205833090784550, 2852031204586017293, 17888529253300920997, 14261166963032608042, 7584983368183421126, 6933428701043454429, 6613788239612360156, 12188550669627194766, 11116051071552283912, 12942594340955341249, 15973329405569184071, 6599410081338642359, 9166275669564489461, 16205691190134424749, 10240544379350652389, 617488447888956772, 10444963251954281557, 1760171480459315772, 225922431704781657, 6781621337133548780, 6905620312272855934, 11742310966982885025, 8038422000946611307, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 4928386710787932510, 1059957073285149997, 7414794499417747342, 8707706418338537128, 18233967745224015541, 14225356453364529209, 16969240713191698060, 2722387933855210372, 10882627342955990743, 8403803192675895448, 16245041381764943451, 3708333802929870625, 6959279407809842059, 13217946414061638961, 18053036458820754856, 14921461448469870468, 560525447297576809, 7018646217871183595, 13178251276894296346, 6921572661546485589, 15572457938054287524, 2649667358943828601, 7478653578860599304, 10687080159641340324, 2690283767645584259, 18436093682323240213, 7844418673662650289, 14896924519547367367, 5700869957895642798, 1468047895374295633, 14533042520471865290, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 18375473735916206629, 11043817201346618265, 1121487758252150877, 11145191037714825824, 1213485180702191508, 7846971226962020365, 6910576852826920348, 16299106229207932049, 13494897806355030713, 14683406224909707924, 7225022863877466358, 8659258489615358612, 1007283657566761474, 3461275599657397285, 13991061905462032659, 7694544543570254942, 13915724103240909421, 3035711690563019728, 12166494415818485436, 8309121944568509175, 14938409169697365298, 8594201398583676528, 10975429338366528094, 12203611326855107051, 13805253251340915462, 17236773525845958123, 8285118005586313889, 4578896616328629575, 4956581778649408453, 2207149270543631094, 14846185326871759573, 14346009158187546482, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 10107555422114249811, 10238372411792495411, 5045095827015758924, 712045908447132336, 5489587686936736744, 16325305247621291738, 3474647312056323841, 17923261380734419001, 6422147522697035080, 14808436219267178190, 498420322150313505, 13431378003732567637, 7624522606684096342, 16563220449590599184, 17295714046586140515, 670583892751407031, 2602239721821758274, 6195887607206027232, 2861627473244922884, 4750941303537176677, 9649080575881148937, 13116712088373847968, 6713440703831969386, 8417294471144249339, 1401889430288725516, 4371677581775699941, 4682611113744629451, 15268715163867613574, 18046680204045439410, 4916517868000584486, 12416920551073560045, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 2105717247508690050, 3724970573052107073, 8941582041334934334, 8312329417918475026, 1987590179830007973, 2110379688364488268, 2640821370997726846, 8705349523122969177, 17635305137043271645, 5321945504199945322, 14864981808156728804, 12170067272088757680, 9570740252338888760, 8752234911193229380, 7657051830321493279, 10054332690091372507, 9785276524271352823, 11645316320468991699, 16682105615873122608, 11466817788450225616, 11077840439234171924, 8390120315669274279, 15664297021877418193, 9890840092123213718, 14010940161066467221, 6608692618887145744, 7336759030812521166, 6773864172894681873, 14718016860648898221, 10620364686165750780, 13091258350263300328, 2190566822905267077, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 4294967292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 6240831473992650349, 7295075507077524016, 1708983071443589586, 5101441454781013927, 1762085221214582981, 4624893715923722401, 5034791698378793493, 2426086071573235308, 5506620828865036918, 7907851684587935310, 191858132690363422, 12189827080513272685, 4161952004851845371, 3113047032182286095, 9384643295764542420, 16611260466052466604, 10297192864125327962, 8420396089584454313, 17843538048800435721, 49291998290789182, 15454664486445800726, 3574645404922812405, 11401680143523240515, 4109004423430966857, 16206235872347886942, 1597537279118331686, 11520518532281367191, 3135755890995221672, 15097801996593502346, 4266164594774171363, 6947485957721124704, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 1679902783560062568, 14885555914322696710, 11595861135030037790, 15790255405818319154, 1788244094476607025, 3713346340151405890, 10088532170345334842, 17854024334494248585, 12211195930325373909, 14810607828402585285, 6176927505545789216, 7340196426348852368, 4385801084072612889, 14434159451233581456, 16984288007453782663, 5968497068768213078, 13891165676869534375, 11051615708535243788, 18406940479749704351, 4657122466881791459, 11427117893432527856, 9342747858627858744, 4615623292891883658, 2986843800380659541, 3219777777177975421, 8998753509000282586, 14589941254121359798, 3914101860949270917, 12606215244329868526, 16670383938906392554, 9639583597360292920, 2591468219526413421, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8038422000946611307, 13055964544694368769, 7749914311668337250, 2490550827364591193, 4834428694324052171, 1237735850038716981, 8896240793576304991, 6582069168543167041, 3706649958322292721, 6839310826708053103, 12095513884410398346, 12922970210395916603, 12358523363220613934, 16454123186601925336, 4991814670781152799, 2040061269519504799, 17488717307568714132, 17317480533129930885, 2098096181527665460, 4697187904025813178, 1478747224857255407, 4468957360091397608, 17536692358706723977, 13559769323964866828, 10531481423547827694, 5398218750581689859, 8391144048742825188, 16471665752727725784, 3043860411079700945, 3316394317418127534, 7755478137750309004, 15345115023987982060, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 0, 7045578468266939554, 7760605592330700907, 8360793687611805321, 738095676972904954, 15564477193367915463, 5876321119815014086, 17552573089477749612, 11411212736325006200, 13815587307529680030, 17156301712489415615, 17351081171119935003, 8966918709601352564, 3417326002908165374, 5362234606277969799, 6579629986598330856, 12247315276947966697, 18410067321498813805, 16182198715872613358, 11840483485843621799, 10053996112039279419, 8402815695409633837, 14225254012036856662, 269445170964238763, 7745973219325669511, 13587984894488746939, 8094627026199116369, 3994495212216710235, 9140718271797260749, 16931156974940547986, 14990750302990274425, 2224156252998910395, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [14346009158187546482, 2514419654263230233, 10868075426920088717, 14626639685450047092, 15824191413144451094, 3872785008711037698, 15159572856872914175, 13499848828490637487, 12504162360551599075, 6704874092885621909, 8482918267067478031, 11182299479692082524, 1644784474325024851, 10866220166037749110, 13011220300525187244, 5714286046111667701, 3271812982662883550, 4912758288798487759, 12958366352003970496, 11568317646859944473, 1188141313951948960, 12777681205968064182, 13771180111214880533, 3688955093092273987, 1949816493804567768, 12058362437595143266, 18379600813280833240, 11754259659339519197, 7370638446447886746, 2915034789487291427, 17553720084081617212, 15041334301981527295, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 0, 14745280635380601617, 3718367898484243235, 9018263790739496394, 11183632545038441118, 11084602196898449287, 10533306301610546918, 1420887495241955081, 4459785951807836148, 12821108383646715262, 10486453955800644813, 1149237165662367781, 14820375481022552179, 16262631485420346362, 15566979183400849953, 16057390897683363413, 11254638356144199099, 15872210457308658069, 81952248385650954, 18028966990791016994, 6002088535876283975, 14457561209066214295, 12899353015952976468, 2384048206878222613, 11488447290357428274, 7532999527428712911, 63498412877849097, 17284768262212667433, 15648250834702978300, 8529394818161928928, 12738537911867917740, 15275140426936934232, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2190566822905267077, 5404282949943047077, 5620556269036690141, 14491113445439742990, 3583407126333665201, 11553681770295205503, 1216093779061977398, 9009035935586042381, 10160118687758838044, 5189341129501661569, 552602416783565214, 13892332176168710533, 4210303372183975982, 9918111397467437847, 13191859809007430670, 12682554283327491677, 6159734265799796346, 3655472932705407889, 6138462302257325090, 9507551446430113809, 477055463074084789, 5562148904013569055, 16089614614433980121, 11132173538218883660, 2369773375363070297, 8734570802518415843, 13624820787911837119, 15026940072471861444, 10407697142160461181, 14258174989754257767, 11934701342627358954, 17583525004205959015, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 11085857321233345859, 6502498117283132750, 10381882708453841125, 13452669420839074331, 4680755747100261382, 2695613323752232712, 17146809849277743421, 9239864853466318604, 14768453813159795872, 18276894718067265811, 17257251339549225733, 5284904431001214307, 5764961239481152941, 10517783806308559735, 15410914971073808541, 3344855092587244940, 10472918269298152403, 12402503503713090948, 2754408248470837514, 15057664949131650205, 4187574032621547594, 5855521755089516239, 13990442832618678273, 14308234035637757543, 11933928216400818327, 15524863835262422966, 11531650814746237864, 7664866084994005813, 6402603575808426205, 15478402516028642985, 9020969347685648365, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2591468219526413421, 8600073145915840029, 9972703476491052945, 7474968551123382164, 7181997692355145187, 15428345773987404117, 11743605500774065098, 11268864392770353056, 12211833414579612038, 15717209816757714363, 890156557088959300, 4859169418838628114, 17769229151585966679, 14412689958488784376, 3341988471057096642, 3129947071292798718, 17633680398960744148, 9040916820504033241, 5930774742161220001, 13876115104798876568, 6388325427377182963, 14330705119681412991, 15768069489925358116, 6157532873490141938, 2469680878449864864, 12328809527998355692, 16304509166225849524, 3168032149605842623, 935982989392333515, 1210836981232166821, 15698638297176561506, 17830733542807512157, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 7442777957161348409, 12950881678740459660, 6646706469455563416, 5900873935105415470, 17072140113884084441, 13172589932512713520, 5522401646053069342, 3133914205806983551, 13779823240426764791, 17224433130794138533, 14489298897463599319, 1940759318652413905, 7694480472126993559, 17366018125192157291, 16887976527497663730, 1916565854454348991, 2294268388330909452, 8983416234083684410, 11974102734257880906, 11534526793163396841, 10005306190103088231, 12997092893241557181, 2268817966601289631, 8051413784985211055, 5191686653404052624, 18373940558834700052, 4703711900874228713, 2364324903714729084, 11224300914395639224, 6723817418214557043, 2429828201690573781, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10050771506480654697, 13420837528738763520, 8496521368864059734, 2484674105691110618, 14534130756197581682, 5302125583480436763, 17447925507451726835, 6158355997654729039, 2747272733640735637, 16008460117209203149, 7966664559987380274, 12228289745234304260, 5769015309045246106, 10117630725268935850, 1928165892714903315, 13757138220331554723, 3415891051222089939, 9614135373790971720, 15460760939838461118, 3083939397091390513, 5208743639505571028, 10512816629673800187, 1038453745979635965, 11152507394095411482, 16277833565401448399, 1857640599304385129, 15507736315414043252, 10006390466474490543, 14803299263866517418, 15066726409373257878, 5538305542985598681, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 7045578468266940310, 11422404183367723688, 4734813192583045175, 16795465921267519808, 12362009349652409415, 3020519614827991855, 2942658800463567237, 18428726703177922018, 10231394582054281621, 8503976903131851970, 11539035678955040518, 6287740157380564628, 3273842793073629785, 15356197472622263350, 8793463497412363872, 15129820397597713369, 2881507314714938985, 10712615481926377093, 9279961334386063516, 4068525996563916658, 13774208723083831405, 17700397171958035166, 18249110448117027038, 8906205380227326203, 4362400237726204205, 16281776889210602562, 4962687005987029339, 5046527547997136739, 15389940485215503504, 8078314735919109828, 5959378659908477764, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 2147483648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 8629850144821916384, 4475574334214635511, 15844375305567102825, 10178368558488980289, 366424541133389116, 14318718192085040201, 11141735015346329315, 14736248158977353058, 6659594400091594161, 9354501143254856958, 1788553586845505120, 13567541605223635136, 18116490434673131256, 3267515885574430559, 4026772730948844076, 2031101258349406169, 1067905233090125355, 3177657145644554672, 3126867087711378899, 2351734901108666112, 7401562071196444455, 11029998200473456200, 12823977733512090066, 9220325101017945081, 9541188526080901705, 9807406399356825925, 11614758863876097772, 7718195260684522704, 12447607757449687684, 2284861843754100216, 16982814561187843115, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 108, 14745280635380602265, 1030231790864474253, 8493304069558799424, 3813500112725093016, 1584024639278012914, 6691630066548896421, 12744785931761802081, 8312414042457270416, 15913285332885706950, 11904695260466451537, 4503780104272324718, 3020894344784966101, 8121142696445856470, 7323566571197968291, 15900985531249599446, 7156364108131320107, 15910943131140158025, 14526518136578598747, 6720684608059903461, 17378127155945101975, 8120421969064271148, 12903874735177520891, 4533560749542240026, 13603960728052470511, 5595478722910465584, 1530061232442071378, 8451873054224800759, 7908366039873426748, 17285432733773675712, 7133857220640768475, 4076807723615210075, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 17468442170295488858, 9773381208787513234, 2185606873808106597, 5326701750299677540, 18331867594591263096, 548097224697282340, 10547562414019002308, 13272144351666153699, 15855067207807736351, 4370081121859711944, 2612761535881667398, 16433499902516242349, 5490313979471750512, 12242667433588409287, 13667932040054721093, 11397361705799260268, 13352179165506178583, 18130276598071715349, 5367905172204163759, 13899921222016942193, 16739429834098497391, 9456664549854782490, 18285262020229949627, 11267975946641671449, 4164320394230196430, 17698213099167806270, 5464680925773178239, 16672746771430202203, 17570877581179860050, 2661602147392096981, 17592358249594079251, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 11085857321233346183, 17340772818369048990, 4710612857210121909, 6383904020814938565, 2185295286363661452, 57911040231161987, 16587511410977976694, 2708167856204711091, 10934568936892706192, 16945176268586506094, 6648082856126081802, 13508616389857401321, 2042841450297716791, 14424400955124662023, 4566271445414618189, 6323391233814555017, 5903620650725668621, 10799633056255259898, 7254762119029478931, 8510983625183148698, 11995653210052429396, 8580571627687871547, 6611487504966808602, 4153539838331475868, 485956658090184855, 13092360131462553695, 16519639797422070758, 15931672450436655146, 1240279786436372570, 14570949492747980696, 1405895934075613917, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 17244797586245886456, 15751718828876603764, 11509908635527699125, 11475332140491226913, 17384989371947212455, 334761494745252139, 7616687658781298414, 14780080241553087954, 12346184924771259853, 16185631853241338171, 895339354972846288, 4068422042358699181, 17829363972116539489, 16616980036078363960, 11802237368737486290, 5517794271194351375, 1340602429246747412, 6137287375961878929, 9089335960846268476, 10715486062907500431, 9038952715608883929, 3376751855710232954, 9293572206177681748, 5274360121930626670, 10385953241879043200, 15812468027446779083, 17985531203042807174, 4527163876177139455, 1244842376420464745, 7071163393872573565, 10505779527452689750, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 7442777957161348517, 15511565770182079598, 17588127306488605836, 12156963648059548539, 9855001437726729603, 750212215289098948, 3057342424889339513, 12076679785316333126, 4754090667046207383, 5287048869294162247, 13665676832765504604, 7892998254318929425, 10986386945260945625, 650038937356756422, 1562289959612081521, 18390988039078367877, 10259188468824740395, 8732714546322097295, 7010052931953742806, 17653496644410780843, 12884831098778763497, 17079843757158488506, 5971369750353050420, 3223792838828500232, 6029903770259711111, 16004411386897649153, 5901432683519548685, 18030233803416436591, 18259374036374690916, 15125936605156360851, 1558963802307733462, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(12) }, program_info: ProgramInfo { program_hash: Word([385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 13, range_trace_len: 41, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 1, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 6, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 5, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 6, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 7, 0, 0, 0, 1, 0, 0, 0, 8, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 6, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 6, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 7, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 6, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 5, 0, 0, 0, 0, 1, 1, 1, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 15345115023987982060, 15041334301981527295, 17583525004205959015, 17830733542807512157, 5538305542985598681, 16982814561187843115, 17592358249594079251, 10505779527452689750, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 2224156252998910395, 15275140426936934232, 9020969347685648365, 2429828201690573781, 5959378659908477764, 4076807723615210075, 1405895934075613917, 1558963802307733462, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 2, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 2, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 2, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 2, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 2, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 2, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 2, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 2, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 2, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 2, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 2, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 2, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 2, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 2, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 2, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 108, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9449073279161460587, 1121487758252150877, 8941582041334934334, 11595861135030037790, 7760605592330700907, 3718367898484243235, 6502498117283132750, 12950881678740459660, 11422404183367723688, 1030231790864474253, 17340772818369048990, 15511565770182079598, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12931192181764701571, 11145191037714825824, 8312329417918475026, 15790255405818319154, 8360793687611805321, 9018263790739496394, 10381882708453841125, 6646706469455563416, 4734813192583045175, 8493304069558799424, 4710612857210121909, 17588127306488605836, 1, 0, 0, 0, 1, 0, 0, 0, 0, 984010488942368543, 1213485180702191508, 1987590179830007973, 1788244094476607025, 738095676972904954, 11183632545038441118, 13452669420839074331, 5900873935105415470, 16795465921267519808, 3813500112725093016, 6383904020814938565, 12156963648059548539, 1, 0, 0, 0, 1, 0, 17823833418367433838, 10163261575005260622, 16867152799881751267, 9685532581221734183, 7846971226962020365, 2110379688364488268, 3713346340151405890, 15564477193367915463, 11084602196898449287, 4680755747100261382, 17072140113884084441, 12362009349652409415, 1584024639278012914, 2185295286363661452, 9855001437726729603, 1, 0, 0, 0, 1, 0, 16263253970534166960, 18299548522351097591, 2763752469532803404, 6753674160453463758, 13494897806355030713, 17635305137043271645, 12211195930325373909, 11411212736325006200, 4459785951807836148, 9239864853466318604, 3133914205806983551, 18428726703177922018, 8312414042457270416, 2708167856204711091, 12076679785316333126, 1, 0, 0, 0, 1, 0, 9250560550349672379, 4111731623463033163, 12435642223369362064, 17888529253300920997, 8659258489615358612, 12170067272088757680, 7340196426348852368, 17351081171119935003, 1149237165662367781, 17257251339549225733, 14489298897463599319, 11539035678955040518, 4503780104272324718, 6648082856126081802, 13665676832765504604, 1, 0, 0, 0, 1, 0, 15411388868694405084, 8403298620076719772, 9672760334604751932, 6933428701043454429, 13991061905462032659, 7657051830321493279, 16984288007453782663, 5362234606277969799, 15566979183400849953, 10517783806308559735, 17366018125192157291, 15356197472622263350, 7323566571197968291, 14424400955124662023, 650038937356756422, 1, 0, 0, 0, 1, 0, 1186775770822648218, 3847522256362703115, 803671992030916978, 11116051071552283912, 3035711690563019728, 11645316320468991699, 11051615708535243788, 18410067321498813805, 15872210457308658069, 10472918269298152403, 2294268388330909452, 2881507314714938985, 15910943131140158025, 5903620650725668621, 10259188468824740395, 1, 0, 0, 0, 1, 0, 4455783957351365745, 4244879931623960089, 5077946946054782793, 6599410081338642359, 14938409169697365298, 11077840439234171924, 11427117893432527856, 10053996112039279419, 6002088535876283975, 15057664949131650205, 11534526793163396841, 4068525996563916658, 17378127155945101975, 8510983625183148698, 17653496644410780843, 1, 0, 0, 0, 1, 0, 15773002892562336276, 10082181176672218839, 7305364504534574394, 10240544379350652389, 12203611326855107051, 9890840092123213718, 2986843800380659541, 269445170964238763, 2384048206878222613, 13990442832618678273, 2268817966601289631, 18249110448117027038, 4533560749542240026, 6611487504966808602, 5971369750353050420, 1, 0, 0, 0, 1, 0, 11384058812288717888, 0, 0, 1760171480459315772, 8285118005586313889, 7336759030812521166, 14589941254121359798, 8094627026199116369, 63498412877849097, 15524863835262422966, 18373940558834700052, 16281776889210602562, 1530061232442071378, 13092360131462553695, 16004411386897649153, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6781621337133548780, 4956581778649408453, 14718016860648898221, 12606215244329868526, 9140718271797260749, 15648250834702978300, 7664866084994005813, 2364324903714729084, 5046527547997136739, 7908366039873426748, 15931672450436655146, 18030233803416436591, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6905620312272855934, 2207149270543631094, 10620364686165750780, 16670383938906392554, 16931156974940547986, 8529394818161928928, 6402603575808426205, 11224300914395639224, 15389940485215503504, 17285432733773675712, 1240279786436372570, 18259374036374690916, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11742310966982885025, 14846185326871759573, 13091258350263300328, 9639583597360292920, 14990750302990274425, 12738537911867917740, 15478402516028642985, 6723817418214557043, 8078314735919109828, 7133857220640768475, 14570949492747980696, 15125936605156360851, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 2224156252998910395, 15275140426936934232, 9020969347685648365, 2429828201690573781, 5959378659908477764, 4076807723615210075, 1405895934075613917, 1558963802307733462, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 8038422000946611307, 14346009158187546482, 2190566822905267077, 2591468219526413421, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18361620591822500183, 1059957073285149997, 10238372411792495411, 7295075507077524016, 7749914311668337250, 10868075426920088717, 5620556269036690141, 9972703476491052945, 13420837528738763520, 4475574334214635511, 9773381208787513234, 15751718828876603764, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16289398515402274208, 7414794499417747342, 5045095827015758924, 1708983071443589586, 2490550827364591193, 14626639685450047092, 14491113445439742990, 7474968551123382164, 8496521368864059734, 15844375305567102825, 2185606873808106597, 11509908635527699125, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12841425204405288471, 8707706418338537128, 712045908447132336, 5101441454781013927, 4834428694324052171, 15824191413144451094, 3583407126333665201, 7181997692355145187, 2484674105691110618, 10178368558488980289, 5326701750299677540, 11475332140491226913, 1, 0, 0, 0, 1, 0, 11645643459830071782, 17452639128133136408, 12995847406362179797, 15487398038599823036, 18233967745224015541, 5489587686936736744, 1762085221214582981, 1237735850038716981, 3872785008711037698, 11553681770295205503, 15428345773987404117, 14534130756197581682, 366424541133389116, 18331867594591263096, 17384989371947212455, 1, 0, 0, 0, 1, 0, 4487072367900477878, 7171904450118919866, 17827188519504780939, 6523151203286366650, 2722387933855210372, 17923261380734419001, 2426086071573235308, 3706649958322292721, 12504162360551599075, 10160118687758838044, 12211833414579612038, 6158355997654729039, 14736248158977353058, 13272144351666153699, 14780080241553087954, 1, 0, 0, 0, 1, 0, 13422884527210045309, 14780013685457338092, 5091415823979132990, 12559670426893619349, 16245041381764943451, 498420322150313505, 191858132690363422, 12922970210395916603, 11182299479692082524, 13892332176168710533, 4859169418838628114, 7966664559987380274, 1788553586845505120, 2612761535881667398, 895339354972846288, 1, 0, 0, 0, 1, 0, 945499751187771083, 17506834482620543131, 17636928664480131737, 14464825374273596237, 13217946414061638961, 16563220449590599184, 3113047032182286095, 4991814670781152799, 13011220300525187244, 13191859809007430670, 3341988471057096642, 10117630725268935850, 3267515885574430559, 12242667433588409287, 16616980036078363960, 1, 0, 0, 0, 1, 0, 7009760878916999172, 14463989071067232357, 6299414349120672984, 5926060660140296438, 560525447297576809, 2602239721821758274, 10297192864125327962, 17317480533129930885, 4912758288798487759, 3655472932705407889, 9040916820504033241, 3415891051222089939, 1067905233090125355, 13352179165506178583, 1340602429246747412, 1, 0, 0, 0, 1, 0, 4766670773273829174, 6721482847518652360, 12310728229379388686, 6745543631073250405, 6921572661546485589, 4750941303537176677, 49291998290789182, 1478747224857255407, 1188141313951948960, 477055463074084789, 6388325427377182963, 3083939397091390513, 2351734901108666112, 13899921222016942193, 10715486062907500431, 1, 0, 0, 0, 1, 0, 16138236286182850912, 18300827445906265048, 6811282905011593847, 8175629301673337378, 7478653578860599304, 6713440703831969386, 11401680143523240515, 13559769323964866828, 3688955093092273987, 11132173538218883660, 6157532873490141938, 1038453745979635965, 12823977733512090066, 18285262020229949627, 9293572206177681748, 1, 0, 0, 0, 1, 0, 2600985046105704136, 0, 0, 3983555747063229007, 18436093682323240213, 4371677581775699941, 1597537279118331686, 8391144048742825188, 18379600813280833240, 13624820787911837119, 16304509166225849524, 1857640599304385129, 9807406399356825925, 17698213099167806270, 15812468027446779083, 1, 0, 0, 0, 1, 0, 0, 0, 0, 726265693390881232, 14896924519547367367, 15268715163867613574, 3135755890995221672, 3043860411079700945, 7370638446447886746, 10407697142160461181, 935982989392333515, 10006390466474490543, 7718195260684522704, 16672746771430202203, 4527163876177139455, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14561475405601408308, 5700869957895642798, 18046680204045439410, 15097801996593502346, 3316394317418127534, 2915034789487291427, 14258174989754257767, 1210836981232166821, 14803299263866517418, 12447607757449687684, 17570877581179860050, 1244842376420464745, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12499075216226282978, 1468047895374295633, 4916517868000584486, 4266164594774171363, 7755478137750309004, 17553720084081617212, 11934701342627358954, 15698638297176561506, 15066726409373257878, 2284861843754100216, 2661602147392096981, 7071163393872573565, 1, 0, 0, 0, 1, 0, 0, 0, 0, 385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704, 15345115023987982060, 15041334301981527295, 17583525004205959015, 17830733542807512157, 5538305542985598681, 16982814561187843115, 17592358249594079251, 10505779527452689750, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 4294967292, 0, 1, 5, 0, 0, 2147483648, 0, 1, 0, 1, 1, 65535, 16383, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2188, 4375, 6562, 8749, 10936, 13123, 15310, 16039, 16282, 16363, 16372, 16381, 16382, 16383, 18570, 20757, 22944, 25131, 27318, 29505, 31692, 33879, 36066, 38253, 40440, 42627, 44814, 47001, 49188, 51375, 53562, 55749, 57936, 60123, 62310, 64497, 65226, 65469, 65496, 65523, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(12) }, program_info: ProgramInfo { program_hash: Word([385638883771950111, 14533042520471865290, 12416920551073560045, 6947485957721124704]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 13, range_trace_len: 45, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 1, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_13.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_13.snap index 7effc433de..587d090fb9 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_13.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_13.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 97, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 7458506668679174706, 1032, 8, 0, 7458506668679174706, 10762639943655126491, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706], [18375473735916206629, 0, 1, 1, 18375473735916206629, 18375473735916206629, 0, 65, 65, 18375473735916206629, 8123069549705052795, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571], [2105717247508690050, 0, 0, 0, 2105717247508690050, 2105717247508690050, 0, 0, 0, 2105717247508690050, 10333571018226702209, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072], [1679902783560062568, 0, 0, 0, 1679902783560062568, 1679902783560062568, 0, 0, 0, 1679902783560062568, 3763553361837852375, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968], [10762639943655126491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8123069549705052795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10333571018226702209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3763553361837852375, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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], [2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 17262866120583049312, 1604139919365911138, 5113851726573374470, 13536996102937200288, 5144547684530650448, 3655783001982481850, 17854454697671763355, 16371583576737997647, 15021252922727947001, 17129020395602960691, 12027296227437859344, 15768109424081379298, 5534448791232096558, 5035998873325494463, 58659117798024738, 1950987668385367835, 1047959670635367230, 7199802506274179843, 11627650263155381900, 4361064659696575038, 10347120495653094676, 14070050808875715623, 75544510591201674, 10341266954735171749, 16977730335508259685, 2978522689205632800, 8395315594913867980, 3061960129452262767, 5601779727658274094, 17491526265780712239, 15233389079858696706, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 7458506668679174706, 14091156936533878324, 7375572182970693729, 14515360628218652783, 7553352677317462240, 10955938084877387415, 1034062223635325003, 16019914937455843830, 15206938952668638091, 4012447997079815331, 5665102116197551876, 3770800016172304546, 5393161755790695273, 11037954541995943116, 1538549641630821923, 82458381601698052, 11256540292329595942, 3662649950675088442, 9310380056949111902, 9078793057127894263, 12413466243433342378, 11963713252400458519, 17170011751313180080, 3131690541743081493, 1565661301057382940, 1661897422826290746, 14617639341020367486, 14014187841969039807, 6350121359078755518, 1074154985721744973, 8576960520729553430, 10762639943655126491, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 6249454237774489531, 9157878094690374909, 6425669842054368493, 2701132623000331756, 17379641915532686294, 5560495940744274531, 11612441789282260948, 16999709768989875265, 6996700069669527727, 18218056048932681656, 17323420959416556496, 466802243942182139, 11973093936801453371, 9146724945876234312, 7489576767990881255, 17520081994390187724, 12872469591277262776, 16839284714279473816, 8284906559011073539, 2830433105177125840, 13008883457151437178, 7615615770295186136, 8044553197656770543, 10297444041327462885, 5697734349102267077, 10790124910810980155, 9679484750905502198, 13726494118104201951, 15750438276851199178, 7407323102906641682, 4869430190272581571, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 18375473735916206629, 11043817201346618241, 11930265205656561266, 10224097019891343377, 748994844361267888, 16702335214860257337, 12190724893927857742, 15379261811913612411, 16916810907472200588, 3208814004368724195, 3855578449388338708, 14165119338755346303, 6632649140152805373, 2797795394808561009, 15650881762132647945, 17209782644178391817, 13783743867565375293, 10090924967376195547, 7343319863281531122, 3154891837622088858, 15555070991869858832, 3720214064901529690, 16228854173327781424, 14339877087618729700, 6737780555657097058, 10816148347772460352, 6888313430102783827, 11552248269785226165, 16919207520546831674, 859159578513939084, 3809060186754369406, 8123069549705052795, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 6189083373333363630, 2656177146482477345, 1057347249925241992, 12877193726173516655, 12251509207411105210, 1152241254719451449, 9876796305008770402, 13886895990537049692, 5955094425987607481, 1554095718593181827, 13216497717183331409, 776902023022590964, 5811111240012717463, 4275189229324905850, 13670290926832689868, 5572024486552078020, 17065492216843752601, 3297004024924317076, 14424352157875397982, 17390634589199639220, 6197470634991589920, 4408358210817562027, 2934098723242191367, 1959730788177155769, 17690050280182053134, 3272945528020851774, 10688942373536545422, 2313436297690393057, 9701508002112089263, 1542465249691690504, 15500832090051527072, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 2105717247508690050, 3724970573052107061, 4114673899889075534, 9176940842530023940, 7547336479279255184, 11656391078860305642, 295623386594127504, 16942248732504945228, 13682452505450251602, 1932912055656971408, 2726480361376479149, 8421050872483387862, 15290165883438443901, 1096575918097796357, 18242297745273113718, 17017163620459148710, 4241087992417717505, 2254013451933557848, 3831151314405580129, 3571435480437187779, 3526382752987906743, 10913818845540317263, 2010650094200565990, 11538983127386740908, 2393120920072159035, 9645620379287089841, 14221268644167684727, 14318256705345657556, 2619120800729679292, 841980681719838180, 13388339383354858226, 10333571018226702209, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 7458506668679174706, 7458506668679174706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 5453149304543877456, 9595010673478717796, 2952696768975672640, 8134038032300527981, 11332133599874182390, 9024753214576304672, 857162913496477952, 12013033971053205979, 4600756375093602184, 14082822594797913170, 8883202514107224654, 2439806288455133669, 5376354024916878032, 7594752061560203213, 5093440171701971002, 11786562020391663198, 1236915402111178740, 13738296853496739000, 7765385093473679298, 8013578318153954341, 11778596345025144994, 14965315602871180353, 15355585492520345027, 3683028660232663225, 6851384090147864767, 10508624984882018667, 1397413665818442288, 2862574062899872918, 292885921741812279, 12978790960819480190, 15232111199771387968, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 1679902783560062568, 14885555914322696706, 357898588148103340, 5295486817886607656, 12813840270094930087, 14997912950175773344, 3065571107994870550, 6045840981748218070, 6913190410219799142, 10694613226894070186, 13202643588773009520, 12618454603290221396, 4286869539192998442, 14688825675433502322, 6261505341338998374, 11526290763485067527, 13595735573859078719, 11176916463285615298, 18361875051234113789, 7745326199098368365, 16699599314531576118, 1870816068625375840, 15123892811152051673, 13015893667273525423, 9102343296676237120, 3339334071833702047, 15390057062148905453, 7122136282318587603, 9966134226732180184, 5538826350883883796, 9989685048829963204, 3763553361837852375, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 18375473735916206629, 18375473735916206629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10762639943655126491, 13388996836365281621, 18292910592958568240, 12237721921963192287, 8943209618246977520, 17924245204927493750, 8434099123041054143, 10575898537057061569, 7340771781180054840, 12844549286514316999, 12231131842570129507, 16875123239233429747, 3964564537195320111, 5715220285758953899, 12754036126848799562, 18436803950002947068, 1770169068010173560, 9424981723294470612, 17771283980301938781, 15212703043278891550, 16986576216468074674, 11657506507106753305, 12474701290169643873, 13224479227546334120, 2845122065365884365, 13589399096280778905, 4675637374086440016, 2796167990897236857, 3556539463682311357, 15865424937925414652, 3385987959754514103, 8819338964313765439, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 0, 7045578468266939526, 7285583783616369700, 2341840897571774669, 7986574489568710564, 12566560672680462445, 16276641203995750872, 1484828875872057093, 1043080754823121706, 14953544298592652410, 1857761078137818000, 6862941658795962417, 7623278478713901054, 9161331715698713896, 2770593420692286823, 3760546371254144518, 9012199850736714078, 16164469939521445727, 3279768234486766882, 1877833914786208431, 6746861716770001362, 8593640503056413152, 8414605328494867260, 10458069463001905889, 16457099907011561259, 16703249241540341232, 12864763495673156246, 6953851240052973821, 11069840221589825139, 2743129109919723025, 8185888587159810481, 9760033137073938718, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 2105717247508690050, 2105717247508690050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8123069549705052795, 5156554708236344275, 14240818815081743895, 9867313438556302162, 15795460020964061272, 4746638863317237450, 13819676251412656237, 4727422680796194490, 8335480078758159858, 9036771623022810541, 8351265204536669701, 9236720663990755838, 11452649604190176127, 17344644189632397547, 141238439626841910, 5940293383350715760, 13513881994175113234, 1766672227767985245, 5047254911149411718, 11537743148965787196, 11119902426374535999, 10562233986963391039, 5709991789928772648, 8741809910406193485, 8455014431114507154, 1111308100041845231, 4725453465222465298, 18262636953418597987, 3114326789966402908, 14795199298580283463, 1803230571695746105, 6301331656216941589, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 0, 14745280635380601593, 17607190493438925163, 11648589526377348791, 6243809814482637102, 16161225923217405001, 4968707009078818352, 7850088573615079578, 16921347809582866242, 14652545103008190675, 3872738867357780593, 2726731287352881882, 192228728999281395, 7091916593754280269, 16410861698623401699, 1724516719793133637, 2030640503060349569, 8472956584581079805, 4062370463253756874, 17250202004686581488, 14985797666948203666, 16191245541264589205, 4308256905478940952, 7707331357694852335, 16083843991369764206, 2809575014506442646, 2531361488896305650, 4074765595145570620, 16198584180859672852, 2331298026793641183, 10607839477677695183, 18135156828501150556, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 1679902783560062568, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10333571018226702209, 16014082921795859036, 12629006099543903781, 11629549595353476530, 12391817649960371746, 18215572691662216416, 9770277866850602303, 15952392766460324197, 15252935280552519544, 15112355243278003890, 11730975142866437995, 14381423242728406980, 10300190929163106289, 5789021531153320332, 9467399003606204480, 16325741572454755376, 8742203160529149671, 5901287082041632906, 6770325052904344921, 9452634477113688134, 3864284104719206717, 1425502383761932940, 2603361438916393613, 13866368315332604201, 9048180624295164267, 16476448149297980239, 2875474760261200724, 13145957222015138318, 10421862999996593301, 1295265690517985261, 16925389328505591881, 10498339818362385984, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 11085857321233345847, 2980560268975659509, 16677115946292689576, 6374023427586874052, 13803600456482333144, 17431196185821251777, 10464217353719819983, 6438571068779754291, 13603500087699002662, 16932213864431306166, 2730762088957911453, 12429723114079333001, 8118452627061731933, 8355576936208207930, 16312459584950423998, 13584079343885951211, 10089145279525513149, 11716103245047864025, 18203686573852208977, 4067749319688593665, 3265941627325086351, 5632283698331253382, 15760522752058781932, 12058385795435302938, 9091954158859286830, 6057235671332894001, 8049826081078855168, 8520182244182315667, 11739746407539790532, 15346229459908117188, 12074025836888921857, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3763553361837852375, 7024708807018294243, 17577226387288678131, 13716375462026905857, 14482978747921062164, 17754397088096536098, 2341715857705720364, 3724235583902658756, 12360261201437984812, 730185504501270972, 15524246669712397578, 7810652382804679854, 5971697062339273781, 5708809062652245260, 16177446039571837537, 7755082824309561098, 1927394300565043315, 1165019439709787271, 6617008402134939344, 3603778144996964306, 176242085391797703, 909081700857492913, 17467207375025427139, 2699428799277364714, 13677833070933733895, 466181988870620953, 6186708066785434963, 15657067447011081019, 14062022826502957095, 761626268401747468, 4218839459301981158, 16913863751850228813, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 7442777957161348405, 9840729387235286710, 5900691155193699968, 4972370306575754106, 9622663477343810731, 8634190114258092107, 3115968329113702329, 407029562402079548, 8621676138210350854, 17169697721720642078, 13787761240489595746, 4665424646389854706, 15962032776378499122, 10283190965555694067, 13646278760603062560, 14461293318223306846, 15816981584402185692, 10710878099338717350, 8561420609988943751, 11090271778037546558, 17906181318089402198, 13930473893330665754, 1680786918385336269, 4346813073489505623, 588116911830026470, 1138114433189805556, 12813431130535659481, 17403245364016302552, 4250865385724499409, 2341302228431136742, 12052022490343773172, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10217287652316111123, 13517781640136319575, 1661113771033030694, 16589784235244657737, 17095733862217014640, 12034870070859925254, 3362052720054026253, 14837478738765105779, 3912940502921138924, 4669997399462018425, 17270138094532924819, 1214102817436621233, 9054176820646026827, 14620454815482057063, 14379345126022103590, 1237842674755258205, 7292827283948466879, 7427352618130823166, 7062449106203043729, 4684102489113893021, 9822227459662699800, 8534835061687915045, 6887380873242738838, 14418031150463989616, 221488275360631569, 10086890380770548477, 6262776103179261925, 1645321375146597351, 16239201862143352504, 15053642145439578838, 2190556552135086015, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 7045578468266940254, 4295968767249300726, 5119947407811220060, 9698255539411717765, 12731464969523549591, 10964642791546394204, 7030591121083126444, 7491881549557152759, 8712880758165105101, 17597004205156968556, 3440400661109297059, 18367279145997928908, 7289973069099595657, 16259498994873975520, 16637999468821149367, 13016124245267804117, 3041300342890742581, 15830253523429142702, 4124978113326913000, 18280219261996495240, 13678174604107677296, 11027937708781352184, 9524461836107268283, 7086746505450311592, 7319928310078430930, 11146341134166142886, 14000752730312100679, 8776837767210836349, 7842835560601620329, 9613994929417659617, 12679002698944454251, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 9950917671808473405, 3554228101202979253, 9306806947978771582, 4401882774217375917, 15315969540976862758, 16886025621791162858, 10861900348873787927, 5957397384759471696, 13244465343946802573, 6540213681196691440, 11070522019866408102, 3801445557467335639, 12532452847683566938, 11669769547992992357, 12808908716587726858, 17995649345722530812, 698204761262232508, 6333121561150411801, 4032763150397248777, 14008259259755136035, 6979651972374810449, 7911828305365051593, 3932176613876828948, 7810471060559602612, 10015863907140938459, 8849830318071758779, 7592172000473889159, 5876504027679413408, 17878067193823269498, 15447825779474026874, 5053260159826664462, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 104, 14745280635380602217, 1277989312750492883, 17882043915102295645, 8402260971363137004, 11464571068891742851, 15059523259116208792, 4259151281546711306, 12299499890598148513, 16319371075448400987, 8885641423428293370, 16309893991999277564, 2619218791994734454, 17151450962136165028, 17614551442000447874, 17230858587654278062, 19705201673078532, 2732075625107327721, 6566262129896944024, 689808164767473390, 11564905194821649437, 14876340024025687860, 10936017910631925277, 10540913652282428134, 10843077561784740363, 5250262515785863526, 8273371701363724667, 16366540385334083230, 9631977100618497396, 18413271307798397411, 1499758295592994876, 14053004056904301616, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 13549970121514602677, 473829894064878094, 13789183496966727565, 1955350239938339874, 7201082322234349663, 9016022097577899196, 6529222281750641224, 17689702079462878790, 10156549575434042429, 7248885352501816322, 12178683397221723524, 6850524170552426967, 8689264751605527455, 1407059625629950522, 9144161729371790458, 3267820578940859361, 10961895042020971306, 15803107242779899332, 13169126454128015246, 6297730490781618091, 16325028460633105625, 1221092837168607222, 8986628150783184058, 17306851421758051833, 15205710348050472951, 2733211805524420436, 13936580861462477484, 16716871354996632672, 2773281916155934536, 9099902973067746305, 12285155954580341409, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 11085857321233346159, 750403697714635224, 15867156494024459966, 7866397620702682136, 5793298599059911546, 5158478207966654343, 16510537027687425322, 4650635265747757214, 2676532104357997308, 10285794245095273390, 13247727332705294758, 17671377272587403594, 8030571597136649189, 1289802346192453208, 14103228039950804909, 4124512422853870088, 3056884801892714758, 4767720916160432521, 3187398915591767652, 16919717526667459899, 18271533057078737338, 4118950315111493430, 5321954010838991352, 4375178466595687599, 13452922166654240382, 18416629007910574933, 663957419786385993, 3920191287070292962, 1103793272511562248, 4364510604874202960, 18207465128223513961, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 16457115416797113563, 16239155032122797832, 14849238236368251159, 9108419460474808576, 1033211373414661409, 14502772570466296089, 4038467972202515368, 1460799694261663366, 12439775236546072843, 16427603058194514665, 14959440030310041613, 3845590175102547346, 1301757407011623611, 17501633393315606025, 11009053095286438923, 3009367688589025768, 6965916889756314709, 4517155861865643415, 15896658462307045811, 9681943962122261504, 9968758826692797274, 5829992311401516243, 15782779420328542209, 11631298814075616775, 12222681008501641705, 12020699456941818376, 16842897778485981781, 4735042970479906379, 3151070592229922496, 3062023609160919321, 9514569903823065872, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 7442777957161348509, 3036215591853057143, 16090863638087042910, 3963133567703228598, 17908349476423851244, 7001924323395444874, 17338586306104572036, 14119937534703630749, 4242994035168829398, 2363031437222084351, 3255777517629291140, 124459613086078350, 13938492907317794048, 4899661652548582019, 1296301487511431772, 14599398842157535330, 4565191284080628584, 9612849067002171183, 10046653166326882870, 1539793980828004113, 15261415128186745093, 15065597191535528607, 16001910338161660328, 12471346680264155869, 6112064272743521679, 16130747048670899171, 1508047113079150807, 8501241071240823019, 9778047403489538902, 4539108168956164212, 12867780329443177182, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(12) }, program_info: ProgramInfo { program_hash: Word([15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968]), kernel: Kernel([Word([7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568])]) }, stack_outputs: StackOutputs { elements: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 13, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 2 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 8, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 8819338964313765439, 6301331656216941589, 10498339818362385984, 16913863751850228813, 2190556552135086015, 5053260159826664462, 12285155954580341409, 9514569903823065872, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 9760033137073938718, 18135156828501150556, 12074025836888921857, 12052022490343773172, 12679002698944454251, 14053004056904301616, 18207465128223513961, 12867780329443177182, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 2, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 2, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 2, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 2, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 2, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 2, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 2, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 2, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 2, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 2, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 2, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 2, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 2, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 2, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 2, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 104, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7375572182970693729, 11930265205656561266, 4114673899889075534, 357898588148103340, 7285583783616369700, 17607190493438925163, 2980560268975659509, 9840729387235286710, 4295968767249300726, 1277989312750492883, 750403697714635224, 3036215591853057143, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14515360628218652783, 10224097019891343377, 9176940842530023940, 5295486817886607656, 2341840897571774669, 11648589526377348791, 16677115946292689576, 5900691155193699968, 5119947407811220060, 17882043915102295645, 15867156494024459966, 16090863638087042910, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7553352677317462240, 748994844361267888, 7547336479279255184, 12813840270094930087, 7986574489568710564, 6243809814482637102, 6374023427586874052, 4972370306575754106, 9698255539411717765, 8402260971363137004, 7866397620702682136, 3963133567703228598, 1, 0, 0, 0, 1, 0, 15510098368304846681, 10644465099124152288, 2271893550708134116, 10955938084877387415, 16702335214860257337, 11656391078860305642, 14997912950175773344, 12566560672680462445, 16161225923217405001, 13803600456482333144, 9622663477343810731, 12731464969523549591, 11464571068891742851, 5793298599059911546, 17908349476423851244, 1, 0, 0, 0, 1, 0, 12704676709042589133, 8367245878409879047, 17481658025575124860, 15206938952668638091, 16916810907472200588, 13682452505450251602, 6913190410219799142, 1043080754823121706, 16921347809582866242, 6438571068779754291, 407029562402079548, 7491881549557152759, 12299499890598148513, 4650635265747757214, 14119937534703630749, 1, 0, 0, 0, 1, 0, 11149845077031369245, 2828390198417285325, 1437182573471948930, 3770800016172304546, 14165119338755346303, 8421050872483387862, 12618454603290221396, 6862941658795962417, 2726731287352881882, 2730762088957911453, 13787761240489595746, 3440400661109297059, 16309893991999277564, 13247727332705294758, 3255777517629291140, 1, 0, 0, 0, 1, 0, 2963531580527002330, 18404342494026067789, 8946460796590193361, 1538549641630821923, 15650881762132647945, 18242297745273113718, 6261505341338998374, 2770593420692286823, 16410861698623401699, 8355576936208207930, 10283190965555694067, 16259498994873975520, 17614551442000447874, 1289802346192453208, 4899661652548582019, 1, 0, 0, 0, 1, 0, 13795959527436426530, 6394716821350311316, 2551462825531745932, 3662649950675088442, 10090924967376195547, 2254013451933557848, 11176916463285615298, 16164469939521445727, 8472956584581079805, 10089145279525513149, 15816981584402185692, 3041300342890742581, 2732075625107327721, 3056884801892714758, 4565191284080628584, 1, 0, 0, 0, 1, 0, 2429876679052810374, 14279937437711708270, 9838079327257734045, 12413466243433342378, 15555070991869858832, 3526382752987906743, 16699599314531576118, 6746861716770001362, 14985797666948203666, 4067749319688593665, 11090271778037546558, 18280219261996495240, 11564905194821649437, 16919717526667459899, 1539793980828004113, 1, 0, 0, 0, 1, 0, 1990799780330028812, 4458925970043167095, 6416024086417711900, 3131690541743081493, 14339877087618729700, 11538983127386740908, 13015893667273525423, 10458069463001905889, 7707331357694852335, 15760522752058781932, 1680786918385336269, 9524461836107268283, 10540913652282428134, 5321954010838991352, 16001910338161660328, 1, 0, 0, 0, 1, 0, 11742883737114426823, 0, 0, 14617639341020367486, 6888313430102783827, 14221268644167684727, 15390057062148905453, 12864763495673156246, 2531361488896305650, 6057235671332894001, 1138114433189805556, 11146341134166142886, 8273371701363724667, 18416629007910574933, 16130747048670899171, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6350121359078755518, 16919207520546831674, 2619120800729679292, 9966134226732180184, 11069840221589825139, 16198584180859672852, 8520182244182315667, 17403245364016302552, 8776837767210836349, 9631977100618497396, 3920191287070292962, 8501241071240823019, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1074154985721744973, 859159578513939084, 841980681719838180, 5538826350883883796, 2743129109919723025, 2331298026793641183, 11739746407539790532, 4250865385724499409, 7842835560601620329, 18413271307798397411, 1103793272511562248, 9778047403489538902, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8576960520729553430, 3809060186754369406, 13388339383354858226, 9989685048829963204, 8185888587159810481, 10607839477677695183, 15346229459908117188, 2341302228431136742, 9613994929417659617, 1499758295592994876, 4364510604874202960, 4539108168956164212, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 9760033137073938718, 18135156828501150556, 12074025836888921857, 12052022490343773172, 12679002698944454251, 14053004056904301616, 18207465128223513961, 12867780329443177182, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1604139919365911138, 9157878094690374909, 2656177146482477345, 9595010673478717796, 18292910592958568240, 14240818815081743895, 12629006099543903781, 17577226387288678131, 13517781640136319575, 3554228101202979253, 473829894064878094, 16239155032122797832, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5113851726573374470, 6425669842054368493, 1057347249925241992, 2952696768975672640, 12237721921963192287, 9867313438556302162, 11629549595353476530, 13716375462026905857, 1661113771033030694, 9306806947978771582, 13789183496966727565, 14849238236368251159, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13536996102937200288, 2701132623000331756, 12877193726173516655, 8134038032300527981, 8943209618246977520, 15795460020964061272, 12391817649960371746, 14482978747921062164, 16589784235244657737, 4401882774217375917, 1955350239938339874, 9108419460474808576, 1, 0, 0, 0, 1, 0, 13741625400428142458, 6805797720165266820, 7573379462002338985, 5144547684530650448, 17379641915532686294, 12251509207411105210, 11332133599874182390, 17924245204927493750, 4746638863317237450, 18215572691662216416, 17754397088096536098, 17095733862217014640, 15315969540976862758, 7201082322234349663, 1033211373414661409, 1, 0, 0, 0, 1, 0, 5385253294000484754, 11621535865369202745, 13691845344148475921, 16371583576737997647, 16999709768989875265, 13886895990537049692, 12013033971053205979, 7340771781180054840, 8335480078758159858, 15252935280552519544, 12360261201437984812, 14837478738765105779, 5957397384759471696, 17689702079462878790, 1460799694261663366, 1, 0, 0, 0, 1, 0, 14229824574460883104, 5588198437801824133, 5994642830237759289, 12027296227437859344, 17323420959416556496, 13216497717183331409, 8883202514107224654, 16875123239233429747, 9236720663990755838, 14381423242728406980, 7810652382804679854, 17270138094532924819, 11070522019866408102, 12178683397221723524, 14959440030310041613, 1, 0, 0, 0, 1, 0, 15796969868683012980, 1642423218726500300, 3179106321758018022, 5035998873325494463, 9146724945876234312, 4275189229324905850, 7594752061560203213, 12754036126848799562, 141238439626841910, 9467399003606204480, 16177446039571837537, 14620454815482057063, 11669769547992992357, 1407059625629950522, 17501633393315606025, 1, 0, 0, 0, 1, 0, 390779239285142343, 5422605986428300552, 649897912096622127, 1047959670635367230, 12872469591277262776, 17065492216843752601, 1236915402111178740, 9424981723294470612, 1766672227767985245, 5901287082041632906, 1165019439709787271, 7292827283948466879, 698204761262232508, 10961895042020971306, 6965916889756314709, 1, 0, 0, 0, 1, 0, 6428661020051792515, 12499036857819316123, 9939962836196470535, 4361064659696575038, 2830433105177125840, 17390634589199639220, 8013578318153954341, 16986576216468074674, 11119902426374535999, 3864284104719206717, 176242085391797703, 4684102489113893021, 14008259259755136035, 6297730490781618091, 9681943962122261504, 1, 0, 0, 0, 1, 0, 14984052988656032524, 8105747836402174106, 9110117087846343256, 75544510591201674, 8044553197656770543, 2934098723242191367, 15355585492520345027, 13224479227546334120, 8741809910406193485, 13866368315332604201, 2699428799277364714, 6887380873242738838, 3932176613876828948, 8986628150783184058, 15782779420328542209, 1, 0, 0, 0, 1, 0, 12952470821017167846, 0, 0, 2978522689205632800, 10790124910810980155, 3272945528020851774, 10508624984882018667, 4675637374086440016, 4725453465222465298, 2875474760261200724, 6186708066785434963, 10086890380770548477, 8849830318071758779, 2733211805524420436, 12020699456941818376, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3061960129452262767, 13726494118104201951, 2313436297690393057, 2862574062899872918, 3556539463682311357, 3114326789966402908, 10421862999996593301, 14062022826502957095, 1645321375146597351, 5876504027679413408, 16716871354996632672, 4735042970479906379, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5601779727658274094, 15750438276851199178, 9701508002112089263, 292885921741812279, 15865424937925414652, 14795199298580283463, 1295265690517985261, 761626268401747468, 16239201862143352504, 17878067193823269498, 2773281916155934536, 3151070592229922496, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17491526265780712239, 7407323102906641682, 1542465249691690504, 12978790960819480190, 3385987959754514103, 1803230571695746105, 16925389328505591881, 4218839459301981158, 15053642145439578838, 15447825779474026874, 9099902973067746305, 3062023609160919321, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 8819338964313765439, 6301331656216941589, 10498339818362385984, 16913863751850228813, 2190556552135086015, 5053260159826664462, 12285155954580341409, 9514569903823065872, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(12) }, program_info: ProgramInfo { program_hash: Word([15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968]), kernel: Kernel([Word([7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568])]) }, stack_outputs: StackOutputs { elements: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 13, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 2 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_14.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_14.snap index 7effc433de..587d090fb9 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_14.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_14.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 97, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 1032, 8, 0, 7458506668679174706, 7458506668679174706, 1032, 8, 0, 7458506668679174706, 10762639943655126491, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706, 15233389079858696706], [18375473735916206629, 0, 1, 1, 18375473735916206629, 18375473735916206629, 0, 65, 65, 18375473735916206629, 8123069549705052795, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571, 4869430190272581571], [2105717247508690050, 0, 0, 0, 2105717247508690050, 2105717247508690050, 0, 0, 0, 2105717247508690050, 10333571018226702209, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072, 15500832090051527072], [1679902783560062568, 0, 0, 0, 1679902783560062568, 1679902783560062568, 0, 0, 0, 1679902783560062568, 3763553361837852375, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968, 15232111199771387968], [10762639943655126491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8123069549705052795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10333571018226702209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3763553361837852375, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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], [2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 17262866120583049312, 1604139919365911138, 5113851726573374470, 13536996102937200288, 5144547684530650448, 3655783001982481850, 17854454697671763355, 16371583576737997647, 15021252922727947001, 17129020395602960691, 12027296227437859344, 15768109424081379298, 5534448791232096558, 5035998873325494463, 58659117798024738, 1950987668385367835, 1047959670635367230, 7199802506274179843, 11627650263155381900, 4361064659696575038, 10347120495653094676, 14070050808875715623, 75544510591201674, 10341266954735171749, 16977730335508259685, 2978522689205632800, 8395315594913867980, 3061960129452262767, 5601779727658274094, 17491526265780712239, 15233389079858696706, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 7458506668679174706, 14091156936533878324, 7375572182970693729, 14515360628218652783, 7553352677317462240, 10955938084877387415, 1034062223635325003, 16019914937455843830, 15206938952668638091, 4012447997079815331, 5665102116197551876, 3770800016172304546, 5393161755790695273, 11037954541995943116, 1538549641630821923, 82458381601698052, 11256540292329595942, 3662649950675088442, 9310380056949111902, 9078793057127894263, 12413466243433342378, 11963713252400458519, 17170011751313180080, 3131690541743081493, 1565661301057382940, 1661897422826290746, 14617639341020367486, 14014187841969039807, 6350121359078755518, 1074154985721744973, 8576960520729553430, 10762639943655126491, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [18375473735916206629, 6249454237774489531, 9157878094690374909, 6425669842054368493, 2701132623000331756, 17379641915532686294, 5560495940744274531, 11612441789282260948, 16999709768989875265, 6996700069669527727, 18218056048932681656, 17323420959416556496, 466802243942182139, 11973093936801453371, 9146724945876234312, 7489576767990881255, 17520081994390187724, 12872469591277262776, 16839284714279473816, 8284906559011073539, 2830433105177125840, 13008883457151437178, 7615615770295186136, 8044553197656770543, 10297444041327462885, 5697734349102267077, 10790124910810980155, 9679484750905502198, 13726494118104201951, 15750438276851199178, 7407323102906641682, 4869430190272581571, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 18375473735916206629, 11043817201346618241, 11930265205656561266, 10224097019891343377, 748994844361267888, 16702335214860257337, 12190724893927857742, 15379261811913612411, 16916810907472200588, 3208814004368724195, 3855578449388338708, 14165119338755346303, 6632649140152805373, 2797795394808561009, 15650881762132647945, 17209782644178391817, 13783743867565375293, 10090924967376195547, 7343319863281531122, 3154891837622088858, 15555070991869858832, 3720214064901529690, 16228854173327781424, 14339877087618729700, 6737780555657097058, 10816148347772460352, 6888313430102783827, 11552248269785226165, 16919207520546831674, 859159578513939084, 3809060186754369406, 8123069549705052795, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 6189083373333363630, 2656177146482477345, 1057347249925241992, 12877193726173516655, 12251509207411105210, 1152241254719451449, 9876796305008770402, 13886895990537049692, 5955094425987607481, 1554095718593181827, 13216497717183331409, 776902023022590964, 5811111240012717463, 4275189229324905850, 13670290926832689868, 5572024486552078020, 17065492216843752601, 3297004024924317076, 14424352157875397982, 17390634589199639220, 6197470634991589920, 4408358210817562027, 2934098723242191367, 1959730788177155769, 17690050280182053134, 3272945528020851774, 10688942373536545422, 2313436297690393057, 9701508002112089263, 1542465249691690504, 15500832090051527072, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 2105717247508690050, 3724970573052107061, 4114673899889075534, 9176940842530023940, 7547336479279255184, 11656391078860305642, 295623386594127504, 16942248732504945228, 13682452505450251602, 1932912055656971408, 2726480361376479149, 8421050872483387862, 15290165883438443901, 1096575918097796357, 18242297745273113718, 17017163620459148710, 4241087992417717505, 2254013451933557848, 3831151314405580129, 3571435480437187779, 3526382752987906743, 10913818845540317263, 2010650094200565990, 11538983127386740908, 2393120920072159035, 9645620379287089841, 14221268644167684727, 14318256705345657556, 2619120800729679292, 841980681719838180, 13388339383354858226, 10333571018226702209, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 7458506668679174706, 7458506668679174706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 5453149304543877456, 9595010673478717796, 2952696768975672640, 8134038032300527981, 11332133599874182390, 9024753214576304672, 857162913496477952, 12013033971053205979, 4600756375093602184, 14082822594797913170, 8883202514107224654, 2439806288455133669, 5376354024916878032, 7594752061560203213, 5093440171701971002, 11786562020391663198, 1236915402111178740, 13738296853496739000, 7765385093473679298, 8013578318153954341, 11778596345025144994, 14965315602871180353, 15355585492520345027, 3683028660232663225, 6851384090147864767, 10508624984882018667, 1397413665818442288, 2862574062899872918, 292885921741812279, 12978790960819480190, 15232111199771387968, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 1679902783560062568, 14885555914322696706, 357898588148103340, 5295486817886607656, 12813840270094930087, 14997912950175773344, 3065571107994870550, 6045840981748218070, 6913190410219799142, 10694613226894070186, 13202643588773009520, 12618454603290221396, 4286869539192998442, 14688825675433502322, 6261505341338998374, 11526290763485067527, 13595735573859078719, 11176916463285615298, 18361875051234113789, 7745326199098368365, 16699599314531576118, 1870816068625375840, 15123892811152051673, 13015893667273525423, 9102343296676237120, 3339334071833702047, 15390057062148905453, 7122136282318587603, 9966134226732180184, 5538826350883883796, 9989685048829963204, 3763553361837852375, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 18375473735916206629, 18375473735916206629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10762639943655126491, 13388996836365281621, 18292910592958568240, 12237721921963192287, 8943209618246977520, 17924245204927493750, 8434099123041054143, 10575898537057061569, 7340771781180054840, 12844549286514316999, 12231131842570129507, 16875123239233429747, 3964564537195320111, 5715220285758953899, 12754036126848799562, 18436803950002947068, 1770169068010173560, 9424981723294470612, 17771283980301938781, 15212703043278891550, 16986576216468074674, 11657506507106753305, 12474701290169643873, 13224479227546334120, 2845122065365884365, 13589399096280778905, 4675637374086440016, 2796167990897236857, 3556539463682311357, 15865424937925414652, 3385987959754514103, 8819338964313765439, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 0, 7045578468266939526, 7285583783616369700, 2341840897571774669, 7986574489568710564, 12566560672680462445, 16276641203995750872, 1484828875872057093, 1043080754823121706, 14953544298592652410, 1857761078137818000, 6862941658795962417, 7623278478713901054, 9161331715698713896, 2770593420692286823, 3760546371254144518, 9012199850736714078, 16164469939521445727, 3279768234486766882, 1877833914786208431, 6746861716770001362, 8593640503056413152, 8414605328494867260, 10458069463001905889, 16457099907011561259, 16703249241540341232, 12864763495673156246, 6953851240052973821, 11069840221589825139, 2743129109919723025, 8185888587159810481, 9760033137073938718, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 2105717247508690050, 2105717247508690050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8123069549705052795, 5156554708236344275, 14240818815081743895, 9867313438556302162, 15795460020964061272, 4746638863317237450, 13819676251412656237, 4727422680796194490, 8335480078758159858, 9036771623022810541, 8351265204536669701, 9236720663990755838, 11452649604190176127, 17344644189632397547, 141238439626841910, 5940293383350715760, 13513881994175113234, 1766672227767985245, 5047254911149411718, 11537743148965787196, 11119902426374535999, 10562233986963391039, 5709991789928772648, 8741809910406193485, 8455014431114507154, 1111308100041845231, 4725453465222465298, 18262636953418597987, 3114326789966402908, 14795199298580283463, 1803230571695746105, 6301331656216941589, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 0, 14745280635380601593, 17607190493438925163, 11648589526377348791, 6243809814482637102, 16161225923217405001, 4968707009078818352, 7850088573615079578, 16921347809582866242, 14652545103008190675, 3872738867357780593, 2726731287352881882, 192228728999281395, 7091916593754280269, 16410861698623401699, 1724516719793133637, 2030640503060349569, 8472956584581079805, 4062370463253756874, 17250202004686581488, 14985797666948203666, 16191245541264589205, 4308256905478940952, 7707331357694852335, 16083843991369764206, 2809575014506442646, 2531361488896305650, 4074765595145570620, 16198584180859672852, 2331298026793641183, 10607839477677695183, 18135156828501150556, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 1679902783560062568, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10333571018226702209, 16014082921795859036, 12629006099543903781, 11629549595353476530, 12391817649960371746, 18215572691662216416, 9770277866850602303, 15952392766460324197, 15252935280552519544, 15112355243278003890, 11730975142866437995, 14381423242728406980, 10300190929163106289, 5789021531153320332, 9467399003606204480, 16325741572454755376, 8742203160529149671, 5901287082041632906, 6770325052904344921, 9452634477113688134, 3864284104719206717, 1425502383761932940, 2603361438916393613, 13866368315332604201, 9048180624295164267, 16476448149297980239, 2875474760261200724, 13145957222015138318, 10421862999996593301, 1295265690517985261, 16925389328505591881, 10498339818362385984, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 11085857321233345847, 2980560268975659509, 16677115946292689576, 6374023427586874052, 13803600456482333144, 17431196185821251777, 10464217353719819983, 6438571068779754291, 13603500087699002662, 16932213864431306166, 2730762088957911453, 12429723114079333001, 8118452627061731933, 8355576936208207930, 16312459584950423998, 13584079343885951211, 10089145279525513149, 11716103245047864025, 18203686573852208977, 4067749319688593665, 3265941627325086351, 5632283698331253382, 15760522752058781932, 12058385795435302938, 9091954158859286830, 6057235671332894001, 8049826081078855168, 8520182244182315667, 11739746407539790532, 15346229459908117188, 12074025836888921857, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3763553361837852375, 7024708807018294243, 17577226387288678131, 13716375462026905857, 14482978747921062164, 17754397088096536098, 2341715857705720364, 3724235583902658756, 12360261201437984812, 730185504501270972, 15524246669712397578, 7810652382804679854, 5971697062339273781, 5708809062652245260, 16177446039571837537, 7755082824309561098, 1927394300565043315, 1165019439709787271, 6617008402134939344, 3603778144996964306, 176242085391797703, 909081700857492913, 17467207375025427139, 2699428799277364714, 13677833070933733895, 466181988870620953, 6186708066785434963, 15657067447011081019, 14062022826502957095, 761626268401747468, 4218839459301981158, 16913863751850228813, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 7442777957161348405, 9840729387235286710, 5900691155193699968, 4972370306575754106, 9622663477343810731, 8634190114258092107, 3115968329113702329, 407029562402079548, 8621676138210350854, 17169697721720642078, 13787761240489595746, 4665424646389854706, 15962032776378499122, 10283190965555694067, 13646278760603062560, 14461293318223306846, 15816981584402185692, 10710878099338717350, 8561420609988943751, 11090271778037546558, 17906181318089402198, 13930473893330665754, 1680786918385336269, 4346813073489505623, 588116911830026470, 1138114433189805556, 12813431130535659481, 17403245364016302552, 4250865385724499409, 2341302228431136742, 12052022490343773172, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10217287652316111123, 13517781640136319575, 1661113771033030694, 16589784235244657737, 17095733862217014640, 12034870070859925254, 3362052720054026253, 14837478738765105779, 3912940502921138924, 4669997399462018425, 17270138094532924819, 1214102817436621233, 9054176820646026827, 14620454815482057063, 14379345126022103590, 1237842674755258205, 7292827283948466879, 7427352618130823166, 7062449106203043729, 4684102489113893021, 9822227459662699800, 8534835061687915045, 6887380873242738838, 14418031150463989616, 221488275360631569, 10086890380770548477, 6262776103179261925, 1645321375146597351, 16239201862143352504, 15053642145439578838, 2190556552135086015, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 7045578468266940254, 4295968767249300726, 5119947407811220060, 9698255539411717765, 12731464969523549591, 10964642791546394204, 7030591121083126444, 7491881549557152759, 8712880758165105101, 17597004205156968556, 3440400661109297059, 18367279145997928908, 7289973069099595657, 16259498994873975520, 16637999468821149367, 13016124245267804117, 3041300342890742581, 15830253523429142702, 4124978113326913000, 18280219261996495240, 13678174604107677296, 11027937708781352184, 9524461836107268283, 7086746505450311592, 7319928310078430930, 11146341134166142886, 14000752730312100679, 8776837767210836349, 7842835560601620329, 9613994929417659617, 12679002698944454251, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 9950917671808473405, 3554228101202979253, 9306806947978771582, 4401882774217375917, 15315969540976862758, 16886025621791162858, 10861900348873787927, 5957397384759471696, 13244465343946802573, 6540213681196691440, 11070522019866408102, 3801445557467335639, 12532452847683566938, 11669769547992992357, 12808908716587726858, 17995649345722530812, 698204761262232508, 6333121561150411801, 4032763150397248777, 14008259259755136035, 6979651972374810449, 7911828305365051593, 3932176613876828948, 7810471060559602612, 10015863907140938459, 8849830318071758779, 7592172000473889159, 5876504027679413408, 17878067193823269498, 15447825779474026874, 5053260159826664462, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 104, 14745280635380602217, 1277989312750492883, 17882043915102295645, 8402260971363137004, 11464571068891742851, 15059523259116208792, 4259151281546711306, 12299499890598148513, 16319371075448400987, 8885641423428293370, 16309893991999277564, 2619218791994734454, 17151450962136165028, 17614551442000447874, 17230858587654278062, 19705201673078532, 2732075625107327721, 6566262129896944024, 689808164767473390, 11564905194821649437, 14876340024025687860, 10936017910631925277, 10540913652282428134, 10843077561784740363, 5250262515785863526, 8273371701363724667, 16366540385334083230, 9631977100618497396, 18413271307798397411, 1499758295592994876, 14053004056904301616, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 13549970121514602677, 473829894064878094, 13789183496966727565, 1955350239938339874, 7201082322234349663, 9016022097577899196, 6529222281750641224, 17689702079462878790, 10156549575434042429, 7248885352501816322, 12178683397221723524, 6850524170552426967, 8689264751605527455, 1407059625629950522, 9144161729371790458, 3267820578940859361, 10961895042020971306, 15803107242779899332, 13169126454128015246, 6297730490781618091, 16325028460633105625, 1221092837168607222, 8986628150783184058, 17306851421758051833, 15205710348050472951, 2733211805524420436, 13936580861462477484, 16716871354996632672, 2773281916155934536, 9099902973067746305, 12285155954580341409, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 11085857321233346159, 750403697714635224, 15867156494024459966, 7866397620702682136, 5793298599059911546, 5158478207966654343, 16510537027687425322, 4650635265747757214, 2676532104357997308, 10285794245095273390, 13247727332705294758, 17671377272587403594, 8030571597136649189, 1289802346192453208, 14103228039950804909, 4124512422853870088, 3056884801892714758, 4767720916160432521, 3187398915591767652, 16919717526667459899, 18271533057078737338, 4118950315111493430, 5321954010838991352, 4375178466595687599, 13452922166654240382, 18416629007910574933, 663957419786385993, 3920191287070292962, 1103793272511562248, 4364510604874202960, 18207465128223513961, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 16457115416797113563, 16239155032122797832, 14849238236368251159, 9108419460474808576, 1033211373414661409, 14502772570466296089, 4038467972202515368, 1460799694261663366, 12439775236546072843, 16427603058194514665, 14959440030310041613, 3845590175102547346, 1301757407011623611, 17501633393315606025, 11009053095286438923, 3009367688589025768, 6965916889756314709, 4517155861865643415, 15896658462307045811, 9681943962122261504, 9968758826692797274, 5829992311401516243, 15782779420328542209, 11631298814075616775, 12222681008501641705, 12020699456941818376, 16842897778485981781, 4735042970479906379, 3151070592229922496, 3062023609160919321, 9514569903823065872, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 7442777957161348509, 3036215591853057143, 16090863638087042910, 3963133567703228598, 17908349476423851244, 7001924323395444874, 17338586306104572036, 14119937534703630749, 4242994035168829398, 2363031437222084351, 3255777517629291140, 124459613086078350, 13938492907317794048, 4899661652548582019, 1296301487511431772, 14599398842157535330, 4565191284080628584, 9612849067002171183, 10046653166326882870, 1539793980828004113, 15261415128186745093, 15065597191535528607, 16001910338161660328, 12471346680264155869, 6112064272743521679, 16130747048670899171, 1508047113079150807, 8501241071240823019, 9778047403489538902, 4539108168956164212, 12867780329443177182, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(12) }, program_info: ProgramInfo { program_hash: Word([15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968]), kernel: Kernel([Word([7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568])]) }, stack_outputs: StackOutputs { elements: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 13, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 2 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 8, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 8819338964313765439, 6301331656216941589, 10498339818362385984, 16913863751850228813, 2190556552135086015, 5053260159826664462, 12285155954580341409, 9514569903823065872, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 9760033137073938718, 18135156828501150556, 12074025836888921857, 12052022490343773172, 12679002698944454251, 14053004056904301616, 18207465128223513961, 12867780329443177182, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 2, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 2, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 2, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 2, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 2, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 2, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 2, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 2, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 2, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 2, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 2, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 2, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 2, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 2, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 2, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 104, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7375572182970693729, 11930265205656561266, 4114673899889075534, 357898588148103340, 7285583783616369700, 17607190493438925163, 2980560268975659509, 9840729387235286710, 4295968767249300726, 1277989312750492883, 750403697714635224, 3036215591853057143, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14515360628218652783, 10224097019891343377, 9176940842530023940, 5295486817886607656, 2341840897571774669, 11648589526377348791, 16677115946292689576, 5900691155193699968, 5119947407811220060, 17882043915102295645, 15867156494024459966, 16090863638087042910, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7553352677317462240, 748994844361267888, 7547336479279255184, 12813840270094930087, 7986574489568710564, 6243809814482637102, 6374023427586874052, 4972370306575754106, 9698255539411717765, 8402260971363137004, 7866397620702682136, 3963133567703228598, 1, 0, 0, 0, 1, 0, 15510098368304846681, 10644465099124152288, 2271893550708134116, 10955938084877387415, 16702335214860257337, 11656391078860305642, 14997912950175773344, 12566560672680462445, 16161225923217405001, 13803600456482333144, 9622663477343810731, 12731464969523549591, 11464571068891742851, 5793298599059911546, 17908349476423851244, 1, 0, 0, 0, 1, 0, 12704676709042589133, 8367245878409879047, 17481658025575124860, 15206938952668638091, 16916810907472200588, 13682452505450251602, 6913190410219799142, 1043080754823121706, 16921347809582866242, 6438571068779754291, 407029562402079548, 7491881549557152759, 12299499890598148513, 4650635265747757214, 14119937534703630749, 1, 0, 0, 0, 1, 0, 11149845077031369245, 2828390198417285325, 1437182573471948930, 3770800016172304546, 14165119338755346303, 8421050872483387862, 12618454603290221396, 6862941658795962417, 2726731287352881882, 2730762088957911453, 13787761240489595746, 3440400661109297059, 16309893991999277564, 13247727332705294758, 3255777517629291140, 1, 0, 0, 0, 1, 0, 2963531580527002330, 18404342494026067789, 8946460796590193361, 1538549641630821923, 15650881762132647945, 18242297745273113718, 6261505341338998374, 2770593420692286823, 16410861698623401699, 8355576936208207930, 10283190965555694067, 16259498994873975520, 17614551442000447874, 1289802346192453208, 4899661652548582019, 1, 0, 0, 0, 1, 0, 13795959527436426530, 6394716821350311316, 2551462825531745932, 3662649950675088442, 10090924967376195547, 2254013451933557848, 11176916463285615298, 16164469939521445727, 8472956584581079805, 10089145279525513149, 15816981584402185692, 3041300342890742581, 2732075625107327721, 3056884801892714758, 4565191284080628584, 1, 0, 0, 0, 1, 0, 2429876679052810374, 14279937437711708270, 9838079327257734045, 12413466243433342378, 15555070991869858832, 3526382752987906743, 16699599314531576118, 6746861716770001362, 14985797666948203666, 4067749319688593665, 11090271778037546558, 18280219261996495240, 11564905194821649437, 16919717526667459899, 1539793980828004113, 1, 0, 0, 0, 1, 0, 1990799780330028812, 4458925970043167095, 6416024086417711900, 3131690541743081493, 14339877087618729700, 11538983127386740908, 13015893667273525423, 10458069463001905889, 7707331357694852335, 15760522752058781932, 1680786918385336269, 9524461836107268283, 10540913652282428134, 5321954010838991352, 16001910338161660328, 1, 0, 0, 0, 1, 0, 11742883737114426823, 0, 0, 14617639341020367486, 6888313430102783827, 14221268644167684727, 15390057062148905453, 12864763495673156246, 2531361488896305650, 6057235671332894001, 1138114433189805556, 11146341134166142886, 8273371701363724667, 18416629007910574933, 16130747048670899171, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6350121359078755518, 16919207520546831674, 2619120800729679292, 9966134226732180184, 11069840221589825139, 16198584180859672852, 8520182244182315667, 17403245364016302552, 8776837767210836349, 9631977100618497396, 3920191287070292962, 8501241071240823019, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1074154985721744973, 859159578513939084, 841980681719838180, 5538826350883883796, 2743129109919723025, 2331298026793641183, 11739746407539790532, 4250865385724499409, 7842835560601620329, 18413271307798397411, 1103793272511562248, 9778047403489538902, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8576960520729553430, 3809060186754369406, 13388339383354858226, 9989685048829963204, 8185888587159810481, 10607839477677695183, 15346229459908117188, 2341302228431136742, 9613994929417659617, 1499758295592994876, 4364510604874202960, 4539108168956164212, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 9760033137073938718, 18135156828501150556, 12074025836888921857, 12052022490343773172, 12679002698944454251, 14053004056904301616, 18207465128223513961, 12867780329443177182, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 10762639943655126491, 8123069549705052795, 10333571018226702209, 3763553361837852375, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1604139919365911138, 9157878094690374909, 2656177146482477345, 9595010673478717796, 18292910592958568240, 14240818815081743895, 12629006099543903781, 17577226387288678131, 13517781640136319575, 3554228101202979253, 473829894064878094, 16239155032122797832, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5113851726573374470, 6425669842054368493, 1057347249925241992, 2952696768975672640, 12237721921963192287, 9867313438556302162, 11629549595353476530, 13716375462026905857, 1661113771033030694, 9306806947978771582, 13789183496966727565, 14849238236368251159, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13536996102937200288, 2701132623000331756, 12877193726173516655, 8134038032300527981, 8943209618246977520, 15795460020964061272, 12391817649960371746, 14482978747921062164, 16589784235244657737, 4401882774217375917, 1955350239938339874, 9108419460474808576, 1, 0, 0, 0, 1, 0, 13741625400428142458, 6805797720165266820, 7573379462002338985, 5144547684530650448, 17379641915532686294, 12251509207411105210, 11332133599874182390, 17924245204927493750, 4746638863317237450, 18215572691662216416, 17754397088096536098, 17095733862217014640, 15315969540976862758, 7201082322234349663, 1033211373414661409, 1, 0, 0, 0, 1, 0, 5385253294000484754, 11621535865369202745, 13691845344148475921, 16371583576737997647, 16999709768989875265, 13886895990537049692, 12013033971053205979, 7340771781180054840, 8335480078758159858, 15252935280552519544, 12360261201437984812, 14837478738765105779, 5957397384759471696, 17689702079462878790, 1460799694261663366, 1, 0, 0, 0, 1, 0, 14229824574460883104, 5588198437801824133, 5994642830237759289, 12027296227437859344, 17323420959416556496, 13216497717183331409, 8883202514107224654, 16875123239233429747, 9236720663990755838, 14381423242728406980, 7810652382804679854, 17270138094532924819, 11070522019866408102, 12178683397221723524, 14959440030310041613, 1, 0, 0, 0, 1, 0, 15796969868683012980, 1642423218726500300, 3179106321758018022, 5035998873325494463, 9146724945876234312, 4275189229324905850, 7594752061560203213, 12754036126848799562, 141238439626841910, 9467399003606204480, 16177446039571837537, 14620454815482057063, 11669769547992992357, 1407059625629950522, 17501633393315606025, 1, 0, 0, 0, 1, 0, 390779239285142343, 5422605986428300552, 649897912096622127, 1047959670635367230, 12872469591277262776, 17065492216843752601, 1236915402111178740, 9424981723294470612, 1766672227767985245, 5901287082041632906, 1165019439709787271, 7292827283948466879, 698204761262232508, 10961895042020971306, 6965916889756314709, 1, 0, 0, 0, 1, 0, 6428661020051792515, 12499036857819316123, 9939962836196470535, 4361064659696575038, 2830433105177125840, 17390634589199639220, 8013578318153954341, 16986576216468074674, 11119902426374535999, 3864284104719206717, 176242085391797703, 4684102489113893021, 14008259259755136035, 6297730490781618091, 9681943962122261504, 1, 0, 0, 0, 1, 0, 14984052988656032524, 8105747836402174106, 9110117087846343256, 75544510591201674, 8044553197656770543, 2934098723242191367, 15355585492520345027, 13224479227546334120, 8741809910406193485, 13866368315332604201, 2699428799277364714, 6887380873242738838, 3932176613876828948, 8986628150783184058, 15782779420328542209, 1, 0, 0, 0, 1, 0, 12952470821017167846, 0, 0, 2978522689205632800, 10790124910810980155, 3272945528020851774, 10508624984882018667, 4675637374086440016, 4725453465222465298, 2875474760261200724, 6186708066785434963, 10086890380770548477, 8849830318071758779, 2733211805524420436, 12020699456941818376, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3061960129452262767, 13726494118104201951, 2313436297690393057, 2862574062899872918, 3556539463682311357, 3114326789966402908, 10421862999996593301, 14062022826502957095, 1645321375146597351, 5876504027679413408, 16716871354996632672, 4735042970479906379, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5601779727658274094, 15750438276851199178, 9701508002112089263, 292885921741812279, 15865424937925414652, 14795199298580283463, 1295265690517985261, 761626268401747468, 16239201862143352504, 17878067193823269498, 2773281916155934536, 3151070592229922496, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17491526265780712239, 7407323102906641682, 1542465249691690504, 12978790960819480190, 3385987959754514103, 1803230571695746105, 16925389328505591881, 4218839459301981158, 15053642145439578838, 15447825779474026874, 9099902973067746305, 3062023609160919321, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968, 8819338964313765439, 6301331656216941589, 10498339818362385984, 16913863751850228813, 2190556552135086015, 5053260159826664462, 12285155954580341409, 9514569903823065872, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(12) }, program_info: ProgramInfo { program_hash: Word([15233389079858696706, 4869430190272581571, 15500832090051527072, 15232111199771387968]), kernel: Kernel([Word([7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568])]) }, stack_outputs: StackOutputs { elements: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 13, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 2 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_15.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_15.snap index a5f0d94b28..75867bc4db 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_15.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_15.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 1, 65, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11182969138190702361, 11656, 91, 0, 0, 11182969138190702361, 41, 0, 11006573531383828351, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010], [1109628455053940361, 42, 1, 1, 1, 1109628455053940361, 0, 1, 10983413158656624898, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331], [13928676565061410159, 0, 0, 0, 0, 13928676565061410159, 0, 0, 4869282124135316831, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319], [297470094449022674, 0, 0, 0, 0, 297470094449022674, 0, 0, 5899798166361732461, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694], [11006573531383828351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [2, 2, 2, 1, 2, 2, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 3, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11182969138190702361, 16344194729581826754, 15045917672181612303, 3672327111134984977, 11902001817992340801, 97480563262877602, 1831626543952762702, 12062163654685913941, 1451330498122947575, 1742063333427513989, 2331114102915733339, 8550984974115591347, 8960841496031156142, 13720918668577423004, 5779906183691085674, 3198599991840782485, 13728843979899181292, 7239115491427587826, 12128894594351473931, 15480692841914867508, 8817470180767843173, 10548371713427919789, 10315264763691724912, 1023167627240586914, 3818953450339058320, 14941570263133670432, 12615841091071546269, 15435370781163068976, 15373572920503822367, 11769995123877236600, 3762647969008011219, 8269653645296248010, 11656, 117148, 6714198787893475936, 5262284953624879131, 6828048997998717653, 14647846255598321281, 12213957512096072087, 15486993862206988880, 9916068016290756984, 12311676223031039230, 6798558233575208094, 6061515485015027193, 9178825932447902299, 16451694760407086053, 9245574117575493602, 6706571375738621744, 5707941763645196550, 13553995817865937844, 18312867062271325792, 11246612591729350508, 8806896510487478352, 16014621579841168337, 6332183310159529150, 2444726075814550534, 13415483499482541228, 16602291456530418215, 3069389264726801426, 4940323642218861897, 3979217445866956620, 6693606464693965975, 9525288177353527302, 11182969138190702361, 41, 410, 8488924048752676071, 5473488137200086909, 16124688533662466636, 4527044298581192722, 16887055178922689595, 5249711198271717177, 15470787238396171217, 5632634005697013617, 7337408598993184022, 11147561538212402733, 9710911023591971572, 8752830793140649116, 11546140485006286209, 10738951369466640003, 2139663271495255306, 6135983205453599776, 17538856881976830392, 2031516987289365197, 17199894398730562705, 4010699482290892787, 3922552954514582360, 7369439734883755459, 108303794773646012, 14521269346803535153, 14515762120928230173, 13893962684375637966, 13610167819530098127, 11215445033353754262, 8081237365032914784, 11006573531383828351, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1109628455053940361, 12119768350776285319, 8184561966951183876, 12431805880114311043, 2986356007899077631, 2836244341662188919, 146796491816379180, 8696360259937422388, 13878284404078727054, 7667548888861073206, 9741377056638459459, 11905155073870025459, 9736056580211703764, 17352787150580200349, 5883496260565631343, 9594088066979877926, 9297041447863221537, 6214639496702145664, 2461170076272033096, 17112913798212225634, 1035954869286151888, 2140568550425483844, 10584986198873793665, 12555736327846716176, 12072441430913369009, 13906015856663078107, 14389918991418187594, 2676571742010508284, 5150637797762075635, 11237118474907085960, 11752652705714102353, 997682303299740331, 42, 93752, 18084035356118526352, 8386870944408484201, 18056918720989013854, 11520229540186073721, 5668756658695595711, 14109792997657353922, 12303762929371991135, 14460911410586037148, 12418445481638740107, 16455507557982986163, 18172284878038222122, 6352198309363971688, 9198509167958908347, 1068046269761257463, 16102483860755268671, 1544674922431042375, 9868836391822552540, 7915117918356788325, 6533551228799195237, 3992189811639127908, 9511948951280762358, 13039263708530965818, 708611914251242147, 4206064101444952505, 17714998603219848343, 13074430791784659712, 14102459334756352921, 13661835471193379756, 3038016940647586670, 1109628455053940361, 0, 328, 7132218559010351790, 2687466917280430353, 14170238607512888511, 5453168895411602323, 8679138582261878552, 10871515559850126217, 7649138216344653830, 12086029516113687059, 14609582285822867389, 7271583017513514692, 3821121937809044409, 3833100151978191712, 5702916883024911354, 3579138882391492892, 14347405124134927123, 9277341930384005575, 2993137622300793545, 13370802209879109056, 13653108884642243926, 8702782587703766612, 12945832125614510830, 15167316901472929028, 4608694219239856197, 4443739924303229750, 8611475648437961511, 1575864515244779062, 10900065459953722709, 9162692523043045302, 17462008412377898139, 10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13928676565061410159, 5375705730949115787, 1314981229280595867, 1393532256400242982, 13433705342207763738, 12880831435259048250, 10699055768478348083, 2470044642731141974, 13732313223959877570, 2078090264025450769, 3845297826200108779, 15581584642080412492, 11359623335937034504, 14549946302435322871, 17424758021352066268, 15472130290487345321, 13048555428151627244, 13747770174448213841, 9164669383091055648, 3250455247796114093, 10799815877710934765, 9086202890994770785, 12116339825079888992, 1619117325320043308, 16898959203497269575, 15756045849228969140, 6190024525131486611, 6215657966742979785, 17671950935398765622, 15303512720733905693, 10727837149375754730, 12907160815575155319, 0, 23564, 4199576522683349447, 16513391592299529611, 11415640949254272304, 16138036929710694921, 9992494271122179933, 3020772293084222765, 15625472986208536177, 12149624601412828429, 10735117276139490774, 13332197512776217968, 13474689739491604605, 13815225937039366706, 706573335075180235, 4097091053989040149, 693823183101411164, 5341110475237803180, 4368449439175744649, 7740607367180462177, 13389502447794973829, 6721164191334334250, 6997451158266748059, 9767862146044075473, 4778055569341029558, 10088175016132507812, 3285997397792070136, 10914182999248450193, 14473951691792990803, 8827937223658185560, 9698676695870635420, 13928676565061410159, 0, 82, 18152833202936203138, 10305147718805144715, 13246631902503555591, 18142351346900318359, 11971140429919100117, 6903484634638418138, 3098698980745497723, 3068992673894668202, 9164459936648953977, 11194864417357882388, 12005359455571366116, 12356306486226268709, 10059737158050223658, 17119982236602677307, 4225663824996553892, 17852936504841763737, 5778553506856942969, 9045001363359345866, 18423338781077887809, 2711240319770097821, 8346149567490270428, 9594540064387516595, 1859863665658604717, 16919987197409252682, 7809934763889573038, 12492597695329698922, 18341122838405415754, 11967784234256998242, 10761804868734649587, 4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [297470094449022674, 13535968261560526699, 10051713503687926694, 5258910437097366761, 14031537229609682064, 18190284629542346231, 4346004165604875907, 15375947702712472554, 4019409425675168575, 2064296209102051574, 17718639079388526425, 16642022229570326204, 1618478323171655450, 5998884876319667302, 6872649224968331273, 13753905356607269997, 7559241041198219519, 8363779881416372286, 2105649450986611656, 11644599807961994770, 12949568200151355456, 4366812189797744262, 9669235379242805159, 18184433440084438609, 13914998044815764482, 11325806379320193213, 1586181560816232196, 5920020313630770955, 8020025137186066841, 13419225700498867773, 13671651770198504476, 18024383338294781694, 0, 23396, 7560057297276955988, 7451013195867945919, 7468487593070852196, 5578183109591783882, 15747662796636990589, 2066701485189878406, 17025371161980089605, 4391959764977446152, 4985867595251695917, 6710066216774366729, 6241000701339836952, 4718440141936325382, 4986060230214018536, 5748634601882563491, 10896228304766504283, 6457499153671182820, 12270042173384394159, 11711065129605555908, 15065279868519608165, 17856220227797901726, 8953039722587792244, 16994104539161729445, 14670768895096516686, 14803898243742553487, 2327203233976270205, 17449705512918939747, 8253253226048886083, 11671578295265948239, 14297456315487806992, 297470094449022674, 0, 82, 302695496926486902, 16415403596737407938, 12969246825596557956, 15965643470182086386, 14881573336337548597, 2868629484750761697, 7317402970608805914, 2570537868338555591, 6697005353407257884, 5717939852331496040, 9408357527608003903, 8011884131194179594, 15942512744234440774, 9052662470595673790, 11913271961595885333, 15508051727969296111, 6269710669185644103, 12322255659000247132, 810875278274469351, 3499523055983644139, 9453749819048496107, 598273005722510655, 12338854942180141395, 2829445891916136836, 12653867244112536729, 4648827005364006908, 3153753366153954420, 12197142511433562971, 13557680898519201450, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11006573531383828351, 92579048505362891, 10772660272533654046, 3331697170176629084, 602109730184155310, 16230148280330706633, 6302091831624975391, 14001078336639287767, 14888577262766439787, 12258632680483319887, 7641862043593808385, 4740702640077452126, 8494032654039797119, 8314420015254970480, 18294822284401514132, 15552480182219334239, 908821363395967579, 18258193129875665644, 4226365574585037317, 3638253471537757569, 17581484848263912285, 6286301305761091621, 4777175749672661669, 10658559677463134471, 1417442037893012894, 7857622794514614671, 1052908464763109826, 4925127753504389599, 4274762298296320367, 7383511416371792464, 17305170235876004791, 2200823396264285425, 0, 58574, 18280076181055982575, 3965010120048981150, 1623299660155787797, 11930292174601709627, 17275008438838615802, 5756406115988630048, 17841510847136093686, 6729021181420822547, 1709787776185889305, 2022739540363098314, 5157634830695555269, 17099057016182449505, 4092740078069974091, 9582547144648304801, 4715310719341519129, 1597700055042697404, 480964694484615271, 56280064407246395, 10536769335197150641, 16099710145374622840, 3473101726323291593, 3295906456874767760, 716460020344690975, 10580825486552151036, 4976836170739997781, 16652319776094256449, 12319687016213027555, 13490282225851742651, 3371801902832234206, 3795543859124105201, 0, 205, 13622702382434675698, 8941567408770445183, 2168342371250989865, 17553704974699598306, 12818882650622055705, 16478401302589696546, 10652219805906948351, 13167156861512034068, 260666911081589986, 1428764500637505382, 2190433219200603887, 11999917547751101526, 2751093334206085539, 9318931023569054874, 16297727142514657495, 11875658036026604145, 5829323963705819601, 407792022339954638, 5684565403642367050, 13995368600016681288, 2845800306757116207, 5216498913603536417, 2411940295743487842, 2014066638340124975, 5258230180909223265, 17089893338044941808, 1124366766375746940, 9116801986360376826, 6650575029061305823, 4025036448660092914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 11859595567907759997, 10088766553729725414, 12574093635772317570, 5470069473511751658, 9645793732101008923, 1476556243604239385, 17933040757673393353, 7118521641278947238, 7588084371428510216, 12191494749556797391, 8228232126921631746, 15226641263820888277, 4239012011479875368, 14018593041447406970, 3541695062587160892, 11116896887234129281, 3929539690735302143, 11203930352796078636, 8751959587369085991, 12655249523595546680, 16379258612200834026, 9984807922535170831, 9638171237357393134, 12191893464144837018, 4677785078090407332, 8064604530099592479, 10076433135196495423, 544627542347870852, 11879905738846635842, 5683487714952213815, 8088984326603898052, 0, 46876, 15125170292333450443, 7072657932567702059, 10475291980250876467, 14632109792663117375, 18379882203306053694, 10250239327737538260, 11537033439839832588, 15180883293806522386, 18285674122603938406, 16116176887352657770, 15068074760365493774, 10507624248254584461, 7669544778380245671, 16424767991328560142, 16771797144770177609, 4105927596877687309, 7519344916607985067, 16277772212475505196, 1322695487397776109, 8302446182097155523, 14744324883381489574, 16338446684875281086, 5703860549203085948, 14077533030564871132, 12287193162084105824, 2535384450001991464, 13089916287630526229, 1568845385281768860, 982340402770608276, 12910581729787565904, 0, 164, 6093021124582015914, 375332441348258328, 16597900739273350797, 16788616498952461620, 10323894478242846558, 3730474644926313294, 17377183878976452334, 12746711269593150718, 13699107349734059694, 421533440407219618, 15109303318896079214, 17746438429032263850, 13224617406323308041, 5646455969610140563, 12626985742338481481, 14497665384991648640, 13894375308737560134, 3268393834564630675, 13312171511942754529, 611321250913478210, 12048873764879264902, 5334026694118161468, 14360341460112568406, 17654490467796517057, 1299716947845207044, 7609683397541157642, 14709808073905360012, 11742139955633481423, 13522070698443062110, 12847434483856017691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 10293244464294212936, 8691876854061179148, 2952350747126730564, 7968203687716298290, 6747517476428823928, 16731591574836256879, 12286682322909052293, 5699380547329532508, 8774011841981167612, 10988677337017809219, 6257583805205658612, 8595550098696265772, 17321901905145630028, 3295089823193122164, 6581488060195755410, 6329516418872359771, 7640632346113799527, 10454000694343684461, 15867346750604392587, 5805413556949044653, 9247297947852762648, 13748015074908171216, 13312272456227001370, 5054807356361880835, 1012271632864570722, 11252467974344770686, 492886975717156403, 2629112354487966090, 10128035487146424848, 18233951381382816412, 1751709948898726303, 0, 11782, 6055246182589913733, 15015595405278911690, 2209046468675768902, 16429197663637467330, 15810134098389081544, 9588791733994120847, 18370261572729563296, 7006788971063612777, 7962515674056117045, 15223121510830934757, 15872454912771340895, 1486059252283823706, 3912605942422700262, 4173681472723400357, 2922691200579275072, 7112424425452913463, 17213377378328786151, 6274713241106982122, 15112974401160243995, 17175975930045398893, 5467280291812001242, 5238070817263862176, 17584445990298638069, 171514605620090783, 4267926381848052110, 9011064139813451706, 17044511642202081265, 17370313250110904770, 13397257034080852565, 17596568325206204932, 0, 41, 9617260353707541367, 9187825164453421957, 17649953659489375797, 6396310504287885774, 17019569090864760371, 870218876784769460, 17213560015461715510, 16812494438448165271, 15885717661613279263, 2958950328581697287, 14311601477626423214, 12599125587081655507, 12078599565132475515, 3332808335850364509, 374688056722968094, 5591521890390007231, 9584980789501913045, 4066644474875437132, 17728945623551220217, 1158050506628066296, 3730734784735709807, 10671987699715228843, 3173999018565335463, 14949604462817069254, 11653871972148380806, 312408327658285690, 8531928004921347162, 98858158429688394, 6167334615107562354, 1234843923022284190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 2163003956713638315, 5989289390391757114, 15670015339098587014, 12708827926449341197, 10159927950043513901, 15395056832871965886, 17405960500607097380, 9229756563573051371, 1186079292937331145, 13463816706671585562, 10107168241231917326, 8534001612601599401, 12790948878158723266, 12619661555644649350, 11614101867080583800, 11255619179741810030, 10501448523390229441, 16971746085380600175, 7173352752193758542, 9960833320626690499, 3507659370538431093, 6846598866105961944, 2557094292829749679, 11416743759689580593, 12182449258645699464, 11951277814213817673, 10567677969346318078, 13884819925875295975, 1926379571595510347, 5918588896905128530, 3405979658670756574, 0, 11698, 8146055133796963630, 4724864404296433607, 10453305271538430204, 17141108237620938331, 16113292978122689735, 14630852758047225712, 16936235645680974811, 640959767495035790, 11162248672474783185, 10618808740372936561, 12973220127719589473, 13223353016814262874, 17652411276563186968, 10141330567980253051, 1770876161367154023, 12442058685904907795, 12986633647641209886, 5384244903407669612, 14778499304685795812, 8054814913234770610, 8358166993767322841, 11933451322373121057, 17795028935448509068, 11142588879850986282, 873880226830208445, 11017896854604878841, 6896812394605202475, 2024842447089060639, 16625734836325714912, 12512094004962322130, 0, 41, 12529483521877137515, 4671467226762388980, 13873740979092621907, 12847173262736205772, 2640423636460273022, 8374058502362870155, 7630996533587302384, 3556075572123538464, 8078558398785937163, 5856098383496092000, 7999607615804135893, 15509992149354799776, 13785560116650003734, 8358196300413379173, 10412508239405514928, 7840142081125036731, 18075062342410207477, 18173191150607640442, 2133036585496843963, 8931901040624025193, 9454731621283026961, 5837806564591410604, 5850596656185029719, 296117354535505751, 8985195681813998404, 1975947551471322175, 12041110943945791333, 11648250496545232642, 7830634726555216225, 5266777994490151623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11627839282500592134, 3407397722647202213, 13644814392425193274, 9689174787852538317, 15759480978611340324, 10073546228149283602, 8090878949578096073, 1502926046713635634, 7624167193861818791, 10274257988202953339, 4186763142475177793, 6025425965090069083, 8194342163688078130, 13163397875087894329, 5161390927343581791, 10103251159424454395, 575959985319833606, 13175926157437524595, 8928028362497258488, 8665485641724560922, 15570929820685955587, 6150675652390666890, 6384512333148749163, 35921027791486524, 3229184449291625000, 7414754653220847914, 11347301099028602515, 8368586536930615942, 10138228048917253579, 344980745193352015, 5644431973654019812, 0, 58574, 12761879591277148733, 3794756304714494565, 10919382803049057886, 13927811434585922718, 8315847055470475708, 10095847089706649983, 41153506376499461, 5529807447506440005, 72892344713547594, 18362204307013225363, 527610602670466995, 14772158556567070690, 9538491437159792328, 1580498045195806896, 8297535568256810268, 13797917351588149895, 1651894826575892086, 13380716913143325871, 2655893075036451977, 3750342908258071259, 18231595474498119868, 18163310674975357977, 2371603174180061555, 6433509503768865899, 5002589281792664271, 10946433388588585987, 9256382872640968643, 6570002101874463971, 3849537215181896567, 5735281858523620986, 0, 205, 7876112718273244024, 1276143811675585923, 9993912342918529935, 16999254614849428545, 8194747920293058753, 11171758628037424552, 8208119826419095432, 5568149314099479773, 17551537772960996556, 12651683228606533001, 13584145944854843210, 12212300608708011466, 18102951610480561318, 14720258372954226591, 15448472262117068008, 10575290756167155008, 11997391634424499349, 9879556170680135793, 12373753045781314057, 9529470285212177396, 10620662102176580756, 10199402949196411787, 9825825353570660203, 18337390924518345383, 15945306792731206141, 10537181099344133724, 5505106000120813030, 14774803975376978777, 14575654492591748955, 8207377881872409730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 1844206616423154361, 7941852203687681180, 2987825311454433607, 185071303888742221, 16140725249773135932, 13486449309893009073, 13471170357015645210, 11073859438158044651, 16507211018434913458, 4066228076398875428, 16536071023746429034, 10818247459046542341, 4392853051950044706, 12116759677655250999, 17293580330275603290, 2376540144284705519, 8057038266027202789, 15097730100005395027, 3583575859544955648, 11146351406925299070, 13473187462927502829, 8056538798141691018, 13509558775822115028, 6797301950091310335, 8773981691004278165, 4751058192101309365, 10661116978196100999, 15345629614104209519, 1689963602473071179, 12869561156624962469, 12554030503530361323, 0, 46876, 4789346784708035796, 9438751512570250357, 447952077691938652, 6351356675900770483, 4868676530510485341, 3192437812250556397, 11511034416225137032, 15380266628173325649, 10700144984876703355, 12230522212327928379, 15526804358639727019, 6410705682507666807, 15728916292645010880, 13992590038292222154, 1916422775943772979, 8280685582260709248, 12515254706968408232, 4845996266408136556, 15172713941042952680, 2233761585242005099, 13227100893355110663, 3914062371738178895, 7843298541359739176, 8386193964610423744, 8614894336467293783, 8834991867772635266, 14221135810103683560, 11406071542091908609, 571586377235018247, 3013510715159483905, 0, 164, 14482187202392982684, 17682350329754313417, 66214439016909251, 7504629639084879386, 11708178258767948919, 188011405648496761, 10242982970375452289, 16510140404231294235, 13381084464566932690, 9239012175869487665, 9339694231140180875, 9917181315244873380, 17448534469581521177, 4965043893766771965, 13305445405772227224, 6963375374275021656, 4554518835153561582, 1694446457415578298, 4604616361036784646, 11439774970058559661, 10784225701912607868, 17782855612978839775, 13368223431578003475, 18100595786373494652, 12753204151452870283, 17504098334052422651, 12896535568794110034, 7402084190222773115, 598469278842686486, 5912604878679295331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11371898088219304696, 4199208231896291776, 6349271639347163621, 5568595648257864309, 10224931331962954075, 8046167029187450402, 6585148777263545478, 3706462809677116963, 12578093594063946501, 11334181120248394313, 4953509182438845792, 4130560513564095433, 6665409895959715593, 12872180446847298231, 11452171012153290342, 5729159829892489539, 5675564903335979949, 14158677720471443076, 12300968791182495713, 13879671978791253311, 14820104759072107152, 17585955671327967478, 6737505022417937354, 17454985371239394211, 15749874646256262769, 10017226585432634212, 8893160827421013787, 11893931769684808775, 16471875099240353401, 9975926385796085953, 11231727832144176264, 0, 11782, 6351111885067026894, 14086295994708840477, 3142920623105062021, 4317195510637014184, 16341148873550430347, 8014762585425506108, 12977978004680762325, 15318810920503136316, 9472517513827583818, 211962335804367550, 14931353145911604525, 9340212215573419915, 5244269534978718672, 1584128384101705476, 4460891295949496863, 14654598206063183317, 13555452196222133132, 17680908597379218579, 13178742765486355260, 3964993209073179108, 4213917162333386044, 2639949635019592417, 3300803743280888923, 12914222891103397086, 13436383826829479040, 7004576641630317963, 12080155723705641895, 6767987840126452263, 14392317091133450653, 7390177608867021213, 0, 41, 3800418813655617572, 14503408479575576010, 10553169970007645345, 4946745422622378051, 7127828976000219721, 2687285609278369395, 16630221959750548176, 1114885198959805561, 3895092647933222339, 9831397389014117600, 12816842684293233323, 1779119880742935864, 17663607747965229138, 5382558247959552902, 11972955750871888364, 16616426694032134438, 9711126273890628516, 376576173107709408, 12451218545182255865, 14301764572821220192, 13209253693600827240, 5745169166190656073, 12916752429524642864, 14463770325561420619, 7870235520772452232, 13278341252249613603, 5432056100901092307, 8994645443800925562, 5908996313982662075, 1494658977663487041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 17530820119034444668, 15233230393479930649, 15702789941308523576, 8819781861782654629, 7112644758334533508, 2549387492966523460, 15838339720324898846, 10242380937000070843, 1124701407395854549, 5706112669062280829, 17015988684670402201, 12671109438456697877, 15652595419009785355, 10753966634497852319, 3622124053041186910, 2063695485301676711, 17845322355197915738, 9894091605930112348, 10822348040176532279, 9689802115657313068, 6759722828145755337, 9479044480226984785, 7845909286502989649, 560081323074218824, 16017591174163981005, 1196237303718990885, 6783304352365897531, 5064625229425039166, 12661189034561966549, 11511655067934063768, 11479359825177848513, 0, 11698, 2084118884093035279, 16979859941949546961, 1454299506056429821, 9658643065222637557, 11605485146349749283, 13057696629474024230, 16650374201325163722, 7457309320444728046, 1243843599995756274, 17176177262691414244, 14152683925184093692, 198845790532099135, 442435874165139119, 1462611314767788334, 3462067515008653152, 4141759445261917472, 12323330957750482072, 14922731139272985797, 10387565380055278256, 9531386257124273696, 9539285450074189441, 3691450672437772660, 12463184698711878632, 4858502687517999226, 12256855995572753726, 9245347314341240247, 7569214225554358494, 1017686422583121037, 10327407591150878848, 15025446886891081073, 0, 41, 13092032916490151270, 2856458557507854671, 14059661153766146178, 1724041303048776424, 7119687853704366589, 3699246950542313036, 8338994289155538949, 7732171807197958061, 10653644351656999339, 15262849800927670044, 6132373490633371091, 16473831322001214578, 12928938600331453669, 6959935525856744214, 17173069020016176920, 6747622983845354522, 2484033613426731933, 9879916419081378373, 4275250202523893223, 5995505684018086986, 16115855409799741127, 2490003355474156145, 10034475279304353355, 7223217715426381376, 10334063888823214988, 2139000562522371457, 18314119367638727156, 15311716904301189063, 894706229073498557, 1570146104298050273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 96, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 5, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 6, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 7, 0, 0, 0, 0, 0, 5, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 8, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 2200823396264285425, 8088984326603898052, 1751709948898726303, 3405979658670756574, 5644431973654019812, 12554030503530361323, 11231727832144176264, 11479359825177848513, 0, 0, 1, 0, 0, 1, 1, 0, 0, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 3795543859124105201, 12910581729787565904, 17596568325206204932, 12512094004962322130, 5735281858523620986, 3013510715159483905, 7390177608867021213, 15025446886891081073, 0, 0, 1, 0, 0, 1, 1, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8488924048752676071, 7132218559010351790, 18152833202936203138, 302695496926486902, 13622702382434675698, 6093021124582015914, 9617260353707541367, 12529483521877137515, 7876112718273244024, 14482187202392982684, 3800418813655617572, 13092032916490151270, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5473488137200086909, 2687466917280430353, 10305147718805144715, 16415403596737407938, 8941567408770445183, 375332441348258328, 9187825164453421957, 4671467226762388980, 1276143811675585923, 17682350329754313417, 14503408479575576010, 2856458557507854671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16124688533662466636, 14170238607512888511, 13246631902503555591, 12969246825596557956, 2168342371250989865, 16597900739273350797, 17649953659489375797, 13873740979092621907, 9993912342918529935, 66214439016909251, 10553169970007645345, 14059661153766146178, 1, 0, 0, 0, 1, 0, 15754956633454945151, 6055713190940499638, 11077250730155763388, 4527044298581192722, 5453168895411602323, 18142351346900318359, 15965643470182086386, 17553704974699598306, 16788616498952461620, 6396310504287885774, 12847173262736205772, 16999254614849428545, 7504629639084879386, 4946745422622378051, 1724041303048776424, 1, 0, 0, 0, 1, 0, 5043375237696906583, 4379507338442738151, 10191347065326962634, 15470787238396171217, 7649138216344653830, 3098698980745497723, 7317402970608805914, 10652219805906948351, 17377183878976452334, 17213560015461715510, 7630996533587302384, 8208119826419095432, 10242982970375452289, 16630221959750548176, 8338994289155538949, 1, 0, 0, 0, 1, 0, 27564165777955823, 2554423200420703486, 17579160449292996896, 11147561538212402733, 7271583017513514692, 11194864417357882388, 5717939852331496040, 1428764500637505382, 421533440407219618, 2958950328581697287, 5856098383496092000, 12651683228606533001, 9239012175869487665, 9831397389014117600, 15262849800927670044, 1, 0, 0, 0, 1, 0, 12554774560852918121, 7558057668449617622, 8341229243444900158, 11546140485006286209, 5702916883024911354, 10059737158050223658, 15942512744234440774, 2751093334206085539, 13224617406323308041, 12078599565132475515, 13785560116650003734, 18102951610480561318, 17448534469581521177, 17663607747965229138, 12928938600331453669, 1, 0, 0, 0, 1, 0, 6754601476785640702, 7736060991620510625, 1449884785010881379, 6135983205453599776, 9277341930384005575, 17852936504841763737, 15508051727969296111, 11875658036026604145, 14497665384991648640, 5591521890390007231, 7840142081125036731, 10575290756167155008, 6963375374275021656, 16616426694032134438, 6747622983845354522, 1, 0, 0, 0, 1, 0, 7929723072429044254, 16334448815751507577, 4434638168235316685, 17199894398730562705, 13653108884642243926, 18423338781077887809, 810875278274469351, 5684565403642367050, 13312171511942754529, 17728945623551220217, 2133036585496843963, 12373753045781314057, 4604616361036784646, 12451218545182255865, 4275250202523893223, 1, 0, 0, 0, 1, 0, 8602814005182217200, 9971451726661298505, 15671763834046105438, 7369439734883755459, 15167316901472929028, 9594540064387516595, 598273005722510655, 5216498913603536417, 5334026694118161468, 10671987699715228843, 5837806564591410604, 10199402949196411787, 17782855612978839775, 5745169166190656073, 2490003355474156145, 1, 0, 0, 0, 1, 0, 1420030357616461150, 0, 0, 14515762120928230173, 8611475648437961511, 7809934763889573038, 12653867244112536729, 5258230180909223265, 1299716947845207044, 11653871972148380806, 8985195681813998404, 15945306792731206141, 12753204151452870283, 7870235520772452232, 10334063888823214988, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13610167819530098127, 10900065459953722709, 18341122838405415754, 3153753366153954420, 1124366766375746940, 14709808073905360012, 8531928004921347162, 12041110943945791333, 5505106000120813030, 12896535568794110034, 5432056100901092307, 18314119367638727156, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11215445033353754262, 9162692523043045302, 11967784234256998242, 12197142511433562971, 9116801986360376826, 11742139955633481423, 98858158429688394, 11648250496545232642, 14774803975376978777, 7402084190222773115, 8994645443800925562, 15311716904301189063, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8081237365032914784, 17462008412377898139, 10761804868734649587, 13557680898519201450, 6650575029061305823, 13522070698443062110, 6167334615107562354, 7830634726555216225, 14575654492591748955, 598469278842686486, 5908996313982662075, 894706229073498557, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6714198787893475936, 18084035356118526352, 4199576522683349447, 7560057297276955988, 18280076181055982575, 15125170292333450443, 6055246182589913733, 8146055133796963630, 12761879591277148733, 4789346784708035796, 6351111885067026894, 2084118884093035279, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5262284953624879131, 8386870944408484201, 16513391592299529611, 7451013195867945919, 3965010120048981150, 7072657932567702059, 15015595405278911690, 4724864404296433607, 3794756304714494565, 9438751512570250357, 14086295994708840477, 16979859941949546961, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6828048997998717653, 18056918720989013854, 11415640949254272304, 7468487593070852196, 1623299660155787797, 10475291980250876467, 2209046468675768902, 10453305271538430204, 10919382803049057886, 447952077691938652, 3142920623105062021, 1454299506056429821, 1, 0, 0, 0, 1, 0, 11959032640791191427, 13666984456735322931, 12430950944235583873, 14647846255598321281, 11520229540186073721, 16138036929710694921, 5578183109591783882, 11930292174601709627, 14632109792663117375, 16429197663637467330, 17141108237620938331, 13927811434585922718, 6351356675900770483, 4317195510637014184, 9658643065222637557, 1, 0, 0, 0, 1, 0, 3078434273127823899, 5753377056128261292, 7043657405344780329, 9916068016290756984, 12303762929371991135, 15625472986208536177, 17025371161980089605, 17841510847136093686, 11537033439839832588, 18370261572729563296, 16936235645680974811, 41153506376499461, 11511034416225137032, 12977978004680762325, 16650374201325163722, 1, 0, 0, 0, 1, 0, 16093488747192154823, 9136889811217566327, 15238340014812686010, 6061515485015027193, 16455507557982986163, 13332197512776217968, 6710066216774366729, 2022739540363098314, 16116176887352657770, 15223121510830934757, 10618808740372936561, 18362204307013225363, 12230522212327928379, 211962335804367550, 17176177262691414244, 1, 0, 0, 0, 1, 0, 17584045558346364245, 8021141784340784171, 17538920393594018726, 9245574117575493602, 9198509167958908347, 706573335075180235, 4986060230214018536, 4092740078069974091, 7669544778380245671, 3912605942422700262, 17652411276563186968, 9538491437159792328, 15728916292645010880, 5244269534978718672, 442435874165139119, 1, 0, 0, 0, 1, 0, 3172838986399921646, 14996615673828945713, 2968596499138535119, 13553995817865937844, 1544674922431042375, 5341110475237803180, 6457499153671182820, 1597700055042697404, 4105927596877687309, 7112424425452913463, 12442058685904907795, 13797917351588149895, 8280685582260709248, 14654598206063183317, 4141759445261917472, 1, 0, 0, 0, 1, 0, 18432037966602915394, 11157278412179636212, 3333037102311562019, 8806896510487478352, 6533551228799195237, 13389502447794973829, 15065279868519608165, 10536769335197150641, 1322695487397776109, 15112974401160243995, 14778499304685795812, 2655893075036451977, 15172713941042952680, 13178742765486355260, 10387565380055278256, 1, 0, 0, 0, 1, 0, 18181589522906879612, 16462817036687190629, 13897413906888730423, 2444726075814550534, 13039263708530965818, 9767862146044075473, 16994104539161729445, 3295906456874767760, 16338446684875281086, 5238070817263862176, 11933451322373121057, 18163310674975357977, 3914062371738178895, 2639949635019592417, 3691450672437772660, 1, 0, 0, 0, 1, 0, 9441086471966058156, 0, 0, 3069389264726801426, 17714998603219848343, 3285997397792070136, 2327203233976270205, 4976836170739997781, 12287193162084105824, 4267926381848052110, 873880226830208445, 5002589281792664271, 8614894336467293783, 13436383826829479040, 12256855995572753726, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3979217445866956620, 14102459334756352921, 14473951691792990803, 8253253226048886083, 12319687016213027555, 13089916287630526229, 17044511642202081265, 6896812394605202475, 9256382872640968643, 14221135810103683560, 12080155723705641895, 7569214225554358494, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6693606464693965975, 13661835471193379756, 8827937223658185560, 11671578295265948239, 13490282225851742651, 1568845385281768860, 17370313250110904770, 2024842447089060639, 6570002101874463971, 11406071542091908609, 6767987840126452263, 1017686422583121037, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9525288177353527302, 3038016940647586670, 9698676695870635420, 14297456315487806992, 3371801902832234206, 982340402770608276, 13397257034080852565, 16625734836325714912, 3849537215181896567, 571586377235018247, 14392317091133450653, 10327407591150878848, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 3795543859124105201, 12910581729787565904, 17596568325206204932, 12512094004962322130, 5735281858523620986, 3013510715159483905, 7390177608867021213, 15025446886891081073, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15045917672181612303, 8184561966951183876, 1314981229280595867, 10051713503687926694, 10772660272533654046, 10088766553729725414, 8691876854061179148, 5989289390391757114, 3407397722647202213, 7941852203687681180, 4199208231896291776, 15233230393479930649, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3672327111134984977, 12431805880114311043, 1393532256400242982, 5258910437097366761, 3331697170176629084, 12574093635772317570, 2952350747126730564, 15670015339098587014, 13644814392425193274, 2987825311454433607, 6349271639347163621, 15702789941308523576, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11902001817992340801, 2986356007899077631, 13433705342207763738, 14031537229609682064, 602109730184155310, 5470069473511751658, 7968203687716298290, 12708827926449341197, 9689174787852538317, 185071303888742221, 5568595648257864309, 8819781861782654629, 1, 0, 0, 0, 1, 0, 9433051896879704986, 3790096704121066977, 7848157813885660720, 97480563262877602, 2836244341662188919, 12880831435259048250, 18190284629542346231, 16230148280330706633, 9645793732101008923, 6747517476428823928, 10159927950043513901, 15759480978611340324, 16140725249773135932, 10224931331962954075, 7112644758334533508, 1, 0, 0, 0, 1, 0, 12268806337265941227, 8766527133291152460, 4573212491205067738, 1451330498122947575, 13878284404078727054, 13732313223959877570, 4019409425675168575, 14888577262766439787, 7118521641278947238, 5699380547329532508, 9229756563573051371, 1502926046713635634, 11073859438158044651, 3706462809677116963, 10242380937000070843, 1, 0, 0, 0, 1, 0, 12264599910826326487, 4401672593088936956, 3287770912268324671, 8550984974115591347, 11905155073870025459, 15581584642080412492, 16642022229570326204, 4740702640077452126, 8228232126921631746, 6257583805205658612, 10107168241231917326, 4186763142475177793, 16536071023746429034, 4953509182438845792, 17015988684670402201, 1, 0, 0, 0, 1, 0, 10482044717877897468, 11338035720719303533, 15111143544560920122, 5779906183691085674, 5883496260565631343, 17424758021352066268, 6872649224968331273, 18294822284401514132, 14018593041447406970, 3295089823193122164, 12619661555644649350, 13163397875087894329, 12116759677655250999, 12872180446847298231, 10753966634497852319, 1, 0, 0, 0, 1, 0, 2142659226510195682, 8250976014423777012, 11550997137187900197, 7239115491427587826, 6214639496702145664, 13747770174448213841, 8363779881416372286, 18258193129875665644, 3929539690735302143, 7640632346113799527, 10501448523390229441, 575959985319833606, 8057038266027202789, 5675564903335979949, 17845322355197915738, 1, 0, 0, 0, 1, 0, 1980663272019683980, 16254047807534945359, 12731791925462422257, 8817470180767843173, 1035954869286151888, 10799815877710934765, 12949568200151355456, 17581484848263912285, 12655249523595546680, 5805413556949044653, 9960833320626690499, 8665485641724560922, 11146351406925299070, 13879671978791253311, 9689802115657313068, 1, 0, 0, 0, 1, 0, 2823715339336108463, 15599274894951921542, 4792471773839294427, 1023167627240586914, 12555736327846716176, 1619117325320043308, 18184433440084438609, 10658559677463134471, 9638171237357393134, 13312272456227001370, 2557094292829749679, 6384512333148749163, 13509558775822115028, 6737505022417937354, 7845909286502989649, 1, 0, 0, 0, 1, 0, 15590779242968047633, 0, 0, 12615841091071546269, 14389918991418187594, 6190024525131486611, 1586181560816232196, 1052908464763109826, 8064604530099592479, 11252467974344770686, 11951277814213817673, 7414754653220847914, 4751058192101309365, 10017226585432634212, 1196237303718990885, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15373572920503822367, 5150637797762075635, 17671950935398765622, 8020025137186066841, 4274762298296320367, 544627542347870852, 2629112354487966090, 13884819925875295975, 8368586536930615942, 15345629614104209519, 11893931769684808775, 5064625229425039166, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11769995123877236600, 11237118474907085960, 15303512720733905693, 13419225700498867773, 7383511416371792464, 11879905738846635842, 10128035487146424848, 1926379571595510347, 10138228048917253579, 1689963602473071179, 16471875099240353401, 12661189034561966549, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3762647969008011219, 11752652705714102353, 10727837149375754730, 13671651770198504476, 17305170235876004791, 5683487714952213815, 18233951381382816412, 5918588896905128530, 344980745193352015, 12869561156624962469, 9975926385796085953, 11511655067934063768, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 2200823396264285425, 8088984326603898052, 1751709948898726303, 3405979658670756574, 5644431973654019812, 12554030503530361323, 11231727832144176264, 11479359825177848513, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_16.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_16.snap index a5f0d94b28..75867bc4db 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_16.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_16.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 1, 65, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11182969138190702361, 11656, 91, 0, 0, 11182969138190702361, 41, 0, 11006573531383828351, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010], [1109628455053940361, 42, 1, 1, 1, 1109628455053940361, 0, 1, 10983413158656624898, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331], [13928676565061410159, 0, 0, 0, 0, 13928676565061410159, 0, 0, 4869282124135316831, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319], [297470094449022674, 0, 0, 0, 0, 297470094449022674, 0, 0, 5899798166361732461, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694], [11006573531383828351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [2, 2, 2, 1, 2, 2, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 3, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11182969138190702361, 16344194729581826754, 15045917672181612303, 3672327111134984977, 11902001817992340801, 97480563262877602, 1831626543952762702, 12062163654685913941, 1451330498122947575, 1742063333427513989, 2331114102915733339, 8550984974115591347, 8960841496031156142, 13720918668577423004, 5779906183691085674, 3198599991840782485, 13728843979899181292, 7239115491427587826, 12128894594351473931, 15480692841914867508, 8817470180767843173, 10548371713427919789, 10315264763691724912, 1023167627240586914, 3818953450339058320, 14941570263133670432, 12615841091071546269, 15435370781163068976, 15373572920503822367, 11769995123877236600, 3762647969008011219, 8269653645296248010, 11656, 117148, 6714198787893475936, 5262284953624879131, 6828048997998717653, 14647846255598321281, 12213957512096072087, 15486993862206988880, 9916068016290756984, 12311676223031039230, 6798558233575208094, 6061515485015027193, 9178825932447902299, 16451694760407086053, 9245574117575493602, 6706571375738621744, 5707941763645196550, 13553995817865937844, 18312867062271325792, 11246612591729350508, 8806896510487478352, 16014621579841168337, 6332183310159529150, 2444726075814550534, 13415483499482541228, 16602291456530418215, 3069389264726801426, 4940323642218861897, 3979217445866956620, 6693606464693965975, 9525288177353527302, 11182969138190702361, 41, 410, 8488924048752676071, 5473488137200086909, 16124688533662466636, 4527044298581192722, 16887055178922689595, 5249711198271717177, 15470787238396171217, 5632634005697013617, 7337408598993184022, 11147561538212402733, 9710911023591971572, 8752830793140649116, 11546140485006286209, 10738951369466640003, 2139663271495255306, 6135983205453599776, 17538856881976830392, 2031516987289365197, 17199894398730562705, 4010699482290892787, 3922552954514582360, 7369439734883755459, 108303794773646012, 14521269346803535153, 14515762120928230173, 13893962684375637966, 13610167819530098127, 11215445033353754262, 8081237365032914784, 11006573531383828351, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1109628455053940361, 12119768350776285319, 8184561966951183876, 12431805880114311043, 2986356007899077631, 2836244341662188919, 146796491816379180, 8696360259937422388, 13878284404078727054, 7667548888861073206, 9741377056638459459, 11905155073870025459, 9736056580211703764, 17352787150580200349, 5883496260565631343, 9594088066979877926, 9297041447863221537, 6214639496702145664, 2461170076272033096, 17112913798212225634, 1035954869286151888, 2140568550425483844, 10584986198873793665, 12555736327846716176, 12072441430913369009, 13906015856663078107, 14389918991418187594, 2676571742010508284, 5150637797762075635, 11237118474907085960, 11752652705714102353, 997682303299740331, 42, 93752, 18084035356118526352, 8386870944408484201, 18056918720989013854, 11520229540186073721, 5668756658695595711, 14109792997657353922, 12303762929371991135, 14460911410586037148, 12418445481638740107, 16455507557982986163, 18172284878038222122, 6352198309363971688, 9198509167958908347, 1068046269761257463, 16102483860755268671, 1544674922431042375, 9868836391822552540, 7915117918356788325, 6533551228799195237, 3992189811639127908, 9511948951280762358, 13039263708530965818, 708611914251242147, 4206064101444952505, 17714998603219848343, 13074430791784659712, 14102459334756352921, 13661835471193379756, 3038016940647586670, 1109628455053940361, 0, 328, 7132218559010351790, 2687466917280430353, 14170238607512888511, 5453168895411602323, 8679138582261878552, 10871515559850126217, 7649138216344653830, 12086029516113687059, 14609582285822867389, 7271583017513514692, 3821121937809044409, 3833100151978191712, 5702916883024911354, 3579138882391492892, 14347405124134927123, 9277341930384005575, 2993137622300793545, 13370802209879109056, 13653108884642243926, 8702782587703766612, 12945832125614510830, 15167316901472929028, 4608694219239856197, 4443739924303229750, 8611475648437961511, 1575864515244779062, 10900065459953722709, 9162692523043045302, 17462008412377898139, 10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13928676565061410159, 5375705730949115787, 1314981229280595867, 1393532256400242982, 13433705342207763738, 12880831435259048250, 10699055768478348083, 2470044642731141974, 13732313223959877570, 2078090264025450769, 3845297826200108779, 15581584642080412492, 11359623335937034504, 14549946302435322871, 17424758021352066268, 15472130290487345321, 13048555428151627244, 13747770174448213841, 9164669383091055648, 3250455247796114093, 10799815877710934765, 9086202890994770785, 12116339825079888992, 1619117325320043308, 16898959203497269575, 15756045849228969140, 6190024525131486611, 6215657966742979785, 17671950935398765622, 15303512720733905693, 10727837149375754730, 12907160815575155319, 0, 23564, 4199576522683349447, 16513391592299529611, 11415640949254272304, 16138036929710694921, 9992494271122179933, 3020772293084222765, 15625472986208536177, 12149624601412828429, 10735117276139490774, 13332197512776217968, 13474689739491604605, 13815225937039366706, 706573335075180235, 4097091053989040149, 693823183101411164, 5341110475237803180, 4368449439175744649, 7740607367180462177, 13389502447794973829, 6721164191334334250, 6997451158266748059, 9767862146044075473, 4778055569341029558, 10088175016132507812, 3285997397792070136, 10914182999248450193, 14473951691792990803, 8827937223658185560, 9698676695870635420, 13928676565061410159, 0, 82, 18152833202936203138, 10305147718805144715, 13246631902503555591, 18142351346900318359, 11971140429919100117, 6903484634638418138, 3098698980745497723, 3068992673894668202, 9164459936648953977, 11194864417357882388, 12005359455571366116, 12356306486226268709, 10059737158050223658, 17119982236602677307, 4225663824996553892, 17852936504841763737, 5778553506856942969, 9045001363359345866, 18423338781077887809, 2711240319770097821, 8346149567490270428, 9594540064387516595, 1859863665658604717, 16919987197409252682, 7809934763889573038, 12492597695329698922, 18341122838405415754, 11967784234256998242, 10761804868734649587, 4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [297470094449022674, 13535968261560526699, 10051713503687926694, 5258910437097366761, 14031537229609682064, 18190284629542346231, 4346004165604875907, 15375947702712472554, 4019409425675168575, 2064296209102051574, 17718639079388526425, 16642022229570326204, 1618478323171655450, 5998884876319667302, 6872649224968331273, 13753905356607269997, 7559241041198219519, 8363779881416372286, 2105649450986611656, 11644599807961994770, 12949568200151355456, 4366812189797744262, 9669235379242805159, 18184433440084438609, 13914998044815764482, 11325806379320193213, 1586181560816232196, 5920020313630770955, 8020025137186066841, 13419225700498867773, 13671651770198504476, 18024383338294781694, 0, 23396, 7560057297276955988, 7451013195867945919, 7468487593070852196, 5578183109591783882, 15747662796636990589, 2066701485189878406, 17025371161980089605, 4391959764977446152, 4985867595251695917, 6710066216774366729, 6241000701339836952, 4718440141936325382, 4986060230214018536, 5748634601882563491, 10896228304766504283, 6457499153671182820, 12270042173384394159, 11711065129605555908, 15065279868519608165, 17856220227797901726, 8953039722587792244, 16994104539161729445, 14670768895096516686, 14803898243742553487, 2327203233976270205, 17449705512918939747, 8253253226048886083, 11671578295265948239, 14297456315487806992, 297470094449022674, 0, 82, 302695496926486902, 16415403596737407938, 12969246825596557956, 15965643470182086386, 14881573336337548597, 2868629484750761697, 7317402970608805914, 2570537868338555591, 6697005353407257884, 5717939852331496040, 9408357527608003903, 8011884131194179594, 15942512744234440774, 9052662470595673790, 11913271961595885333, 15508051727969296111, 6269710669185644103, 12322255659000247132, 810875278274469351, 3499523055983644139, 9453749819048496107, 598273005722510655, 12338854942180141395, 2829445891916136836, 12653867244112536729, 4648827005364006908, 3153753366153954420, 12197142511433562971, 13557680898519201450, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11006573531383828351, 92579048505362891, 10772660272533654046, 3331697170176629084, 602109730184155310, 16230148280330706633, 6302091831624975391, 14001078336639287767, 14888577262766439787, 12258632680483319887, 7641862043593808385, 4740702640077452126, 8494032654039797119, 8314420015254970480, 18294822284401514132, 15552480182219334239, 908821363395967579, 18258193129875665644, 4226365574585037317, 3638253471537757569, 17581484848263912285, 6286301305761091621, 4777175749672661669, 10658559677463134471, 1417442037893012894, 7857622794514614671, 1052908464763109826, 4925127753504389599, 4274762298296320367, 7383511416371792464, 17305170235876004791, 2200823396264285425, 0, 58574, 18280076181055982575, 3965010120048981150, 1623299660155787797, 11930292174601709627, 17275008438838615802, 5756406115988630048, 17841510847136093686, 6729021181420822547, 1709787776185889305, 2022739540363098314, 5157634830695555269, 17099057016182449505, 4092740078069974091, 9582547144648304801, 4715310719341519129, 1597700055042697404, 480964694484615271, 56280064407246395, 10536769335197150641, 16099710145374622840, 3473101726323291593, 3295906456874767760, 716460020344690975, 10580825486552151036, 4976836170739997781, 16652319776094256449, 12319687016213027555, 13490282225851742651, 3371801902832234206, 3795543859124105201, 0, 205, 13622702382434675698, 8941567408770445183, 2168342371250989865, 17553704974699598306, 12818882650622055705, 16478401302589696546, 10652219805906948351, 13167156861512034068, 260666911081589986, 1428764500637505382, 2190433219200603887, 11999917547751101526, 2751093334206085539, 9318931023569054874, 16297727142514657495, 11875658036026604145, 5829323963705819601, 407792022339954638, 5684565403642367050, 13995368600016681288, 2845800306757116207, 5216498913603536417, 2411940295743487842, 2014066638340124975, 5258230180909223265, 17089893338044941808, 1124366766375746940, 9116801986360376826, 6650575029061305823, 4025036448660092914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 11859595567907759997, 10088766553729725414, 12574093635772317570, 5470069473511751658, 9645793732101008923, 1476556243604239385, 17933040757673393353, 7118521641278947238, 7588084371428510216, 12191494749556797391, 8228232126921631746, 15226641263820888277, 4239012011479875368, 14018593041447406970, 3541695062587160892, 11116896887234129281, 3929539690735302143, 11203930352796078636, 8751959587369085991, 12655249523595546680, 16379258612200834026, 9984807922535170831, 9638171237357393134, 12191893464144837018, 4677785078090407332, 8064604530099592479, 10076433135196495423, 544627542347870852, 11879905738846635842, 5683487714952213815, 8088984326603898052, 0, 46876, 15125170292333450443, 7072657932567702059, 10475291980250876467, 14632109792663117375, 18379882203306053694, 10250239327737538260, 11537033439839832588, 15180883293806522386, 18285674122603938406, 16116176887352657770, 15068074760365493774, 10507624248254584461, 7669544778380245671, 16424767991328560142, 16771797144770177609, 4105927596877687309, 7519344916607985067, 16277772212475505196, 1322695487397776109, 8302446182097155523, 14744324883381489574, 16338446684875281086, 5703860549203085948, 14077533030564871132, 12287193162084105824, 2535384450001991464, 13089916287630526229, 1568845385281768860, 982340402770608276, 12910581729787565904, 0, 164, 6093021124582015914, 375332441348258328, 16597900739273350797, 16788616498952461620, 10323894478242846558, 3730474644926313294, 17377183878976452334, 12746711269593150718, 13699107349734059694, 421533440407219618, 15109303318896079214, 17746438429032263850, 13224617406323308041, 5646455969610140563, 12626985742338481481, 14497665384991648640, 13894375308737560134, 3268393834564630675, 13312171511942754529, 611321250913478210, 12048873764879264902, 5334026694118161468, 14360341460112568406, 17654490467796517057, 1299716947845207044, 7609683397541157642, 14709808073905360012, 11742139955633481423, 13522070698443062110, 12847434483856017691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 10293244464294212936, 8691876854061179148, 2952350747126730564, 7968203687716298290, 6747517476428823928, 16731591574836256879, 12286682322909052293, 5699380547329532508, 8774011841981167612, 10988677337017809219, 6257583805205658612, 8595550098696265772, 17321901905145630028, 3295089823193122164, 6581488060195755410, 6329516418872359771, 7640632346113799527, 10454000694343684461, 15867346750604392587, 5805413556949044653, 9247297947852762648, 13748015074908171216, 13312272456227001370, 5054807356361880835, 1012271632864570722, 11252467974344770686, 492886975717156403, 2629112354487966090, 10128035487146424848, 18233951381382816412, 1751709948898726303, 0, 11782, 6055246182589913733, 15015595405278911690, 2209046468675768902, 16429197663637467330, 15810134098389081544, 9588791733994120847, 18370261572729563296, 7006788971063612777, 7962515674056117045, 15223121510830934757, 15872454912771340895, 1486059252283823706, 3912605942422700262, 4173681472723400357, 2922691200579275072, 7112424425452913463, 17213377378328786151, 6274713241106982122, 15112974401160243995, 17175975930045398893, 5467280291812001242, 5238070817263862176, 17584445990298638069, 171514605620090783, 4267926381848052110, 9011064139813451706, 17044511642202081265, 17370313250110904770, 13397257034080852565, 17596568325206204932, 0, 41, 9617260353707541367, 9187825164453421957, 17649953659489375797, 6396310504287885774, 17019569090864760371, 870218876784769460, 17213560015461715510, 16812494438448165271, 15885717661613279263, 2958950328581697287, 14311601477626423214, 12599125587081655507, 12078599565132475515, 3332808335850364509, 374688056722968094, 5591521890390007231, 9584980789501913045, 4066644474875437132, 17728945623551220217, 1158050506628066296, 3730734784735709807, 10671987699715228843, 3173999018565335463, 14949604462817069254, 11653871972148380806, 312408327658285690, 8531928004921347162, 98858158429688394, 6167334615107562354, 1234843923022284190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 2163003956713638315, 5989289390391757114, 15670015339098587014, 12708827926449341197, 10159927950043513901, 15395056832871965886, 17405960500607097380, 9229756563573051371, 1186079292937331145, 13463816706671585562, 10107168241231917326, 8534001612601599401, 12790948878158723266, 12619661555644649350, 11614101867080583800, 11255619179741810030, 10501448523390229441, 16971746085380600175, 7173352752193758542, 9960833320626690499, 3507659370538431093, 6846598866105961944, 2557094292829749679, 11416743759689580593, 12182449258645699464, 11951277814213817673, 10567677969346318078, 13884819925875295975, 1926379571595510347, 5918588896905128530, 3405979658670756574, 0, 11698, 8146055133796963630, 4724864404296433607, 10453305271538430204, 17141108237620938331, 16113292978122689735, 14630852758047225712, 16936235645680974811, 640959767495035790, 11162248672474783185, 10618808740372936561, 12973220127719589473, 13223353016814262874, 17652411276563186968, 10141330567980253051, 1770876161367154023, 12442058685904907795, 12986633647641209886, 5384244903407669612, 14778499304685795812, 8054814913234770610, 8358166993767322841, 11933451322373121057, 17795028935448509068, 11142588879850986282, 873880226830208445, 11017896854604878841, 6896812394605202475, 2024842447089060639, 16625734836325714912, 12512094004962322130, 0, 41, 12529483521877137515, 4671467226762388980, 13873740979092621907, 12847173262736205772, 2640423636460273022, 8374058502362870155, 7630996533587302384, 3556075572123538464, 8078558398785937163, 5856098383496092000, 7999607615804135893, 15509992149354799776, 13785560116650003734, 8358196300413379173, 10412508239405514928, 7840142081125036731, 18075062342410207477, 18173191150607640442, 2133036585496843963, 8931901040624025193, 9454731621283026961, 5837806564591410604, 5850596656185029719, 296117354535505751, 8985195681813998404, 1975947551471322175, 12041110943945791333, 11648250496545232642, 7830634726555216225, 5266777994490151623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11627839282500592134, 3407397722647202213, 13644814392425193274, 9689174787852538317, 15759480978611340324, 10073546228149283602, 8090878949578096073, 1502926046713635634, 7624167193861818791, 10274257988202953339, 4186763142475177793, 6025425965090069083, 8194342163688078130, 13163397875087894329, 5161390927343581791, 10103251159424454395, 575959985319833606, 13175926157437524595, 8928028362497258488, 8665485641724560922, 15570929820685955587, 6150675652390666890, 6384512333148749163, 35921027791486524, 3229184449291625000, 7414754653220847914, 11347301099028602515, 8368586536930615942, 10138228048917253579, 344980745193352015, 5644431973654019812, 0, 58574, 12761879591277148733, 3794756304714494565, 10919382803049057886, 13927811434585922718, 8315847055470475708, 10095847089706649983, 41153506376499461, 5529807447506440005, 72892344713547594, 18362204307013225363, 527610602670466995, 14772158556567070690, 9538491437159792328, 1580498045195806896, 8297535568256810268, 13797917351588149895, 1651894826575892086, 13380716913143325871, 2655893075036451977, 3750342908258071259, 18231595474498119868, 18163310674975357977, 2371603174180061555, 6433509503768865899, 5002589281792664271, 10946433388588585987, 9256382872640968643, 6570002101874463971, 3849537215181896567, 5735281858523620986, 0, 205, 7876112718273244024, 1276143811675585923, 9993912342918529935, 16999254614849428545, 8194747920293058753, 11171758628037424552, 8208119826419095432, 5568149314099479773, 17551537772960996556, 12651683228606533001, 13584145944854843210, 12212300608708011466, 18102951610480561318, 14720258372954226591, 15448472262117068008, 10575290756167155008, 11997391634424499349, 9879556170680135793, 12373753045781314057, 9529470285212177396, 10620662102176580756, 10199402949196411787, 9825825353570660203, 18337390924518345383, 15945306792731206141, 10537181099344133724, 5505106000120813030, 14774803975376978777, 14575654492591748955, 8207377881872409730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 1844206616423154361, 7941852203687681180, 2987825311454433607, 185071303888742221, 16140725249773135932, 13486449309893009073, 13471170357015645210, 11073859438158044651, 16507211018434913458, 4066228076398875428, 16536071023746429034, 10818247459046542341, 4392853051950044706, 12116759677655250999, 17293580330275603290, 2376540144284705519, 8057038266027202789, 15097730100005395027, 3583575859544955648, 11146351406925299070, 13473187462927502829, 8056538798141691018, 13509558775822115028, 6797301950091310335, 8773981691004278165, 4751058192101309365, 10661116978196100999, 15345629614104209519, 1689963602473071179, 12869561156624962469, 12554030503530361323, 0, 46876, 4789346784708035796, 9438751512570250357, 447952077691938652, 6351356675900770483, 4868676530510485341, 3192437812250556397, 11511034416225137032, 15380266628173325649, 10700144984876703355, 12230522212327928379, 15526804358639727019, 6410705682507666807, 15728916292645010880, 13992590038292222154, 1916422775943772979, 8280685582260709248, 12515254706968408232, 4845996266408136556, 15172713941042952680, 2233761585242005099, 13227100893355110663, 3914062371738178895, 7843298541359739176, 8386193964610423744, 8614894336467293783, 8834991867772635266, 14221135810103683560, 11406071542091908609, 571586377235018247, 3013510715159483905, 0, 164, 14482187202392982684, 17682350329754313417, 66214439016909251, 7504629639084879386, 11708178258767948919, 188011405648496761, 10242982970375452289, 16510140404231294235, 13381084464566932690, 9239012175869487665, 9339694231140180875, 9917181315244873380, 17448534469581521177, 4965043893766771965, 13305445405772227224, 6963375374275021656, 4554518835153561582, 1694446457415578298, 4604616361036784646, 11439774970058559661, 10784225701912607868, 17782855612978839775, 13368223431578003475, 18100595786373494652, 12753204151452870283, 17504098334052422651, 12896535568794110034, 7402084190222773115, 598469278842686486, 5912604878679295331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11371898088219304696, 4199208231896291776, 6349271639347163621, 5568595648257864309, 10224931331962954075, 8046167029187450402, 6585148777263545478, 3706462809677116963, 12578093594063946501, 11334181120248394313, 4953509182438845792, 4130560513564095433, 6665409895959715593, 12872180446847298231, 11452171012153290342, 5729159829892489539, 5675564903335979949, 14158677720471443076, 12300968791182495713, 13879671978791253311, 14820104759072107152, 17585955671327967478, 6737505022417937354, 17454985371239394211, 15749874646256262769, 10017226585432634212, 8893160827421013787, 11893931769684808775, 16471875099240353401, 9975926385796085953, 11231727832144176264, 0, 11782, 6351111885067026894, 14086295994708840477, 3142920623105062021, 4317195510637014184, 16341148873550430347, 8014762585425506108, 12977978004680762325, 15318810920503136316, 9472517513827583818, 211962335804367550, 14931353145911604525, 9340212215573419915, 5244269534978718672, 1584128384101705476, 4460891295949496863, 14654598206063183317, 13555452196222133132, 17680908597379218579, 13178742765486355260, 3964993209073179108, 4213917162333386044, 2639949635019592417, 3300803743280888923, 12914222891103397086, 13436383826829479040, 7004576641630317963, 12080155723705641895, 6767987840126452263, 14392317091133450653, 7390177608867021213, 0, 41, 3800418813655617572, 14503408479575576010, 10553169970007645345, 4946745422622378051, 7127828976000219721, 2687285609278369395, 16630221959750548176, 1114885198959805561, 3895092647933222339, 9831397389014117600, 12816842684293233323, 1779119880742935864, 17663607747965229138, 5382558247959552902, 11972955750871888364, 16616426694032134438, 9711126273890628516, 376576173107709408, 12451218545182255865, 14301764572821220192, 13209253693600827240, 5745169166190656073, 12916752429524642864, 14463770325561420619, 7870235520772452232, 13278341252249613603, 5432056100901092307, 8994645443800925562, 5908996313982662075, 1494658977663487041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 17530820119034444668, 15233230393479930649, 15702789941308523576, 8819781861782654629, 7112644758334533508, 2549387492966523460, 15838339720324898846, 10242380937000070843, 1124701407395854549, 5706112669062280829, 17015988684670402201, 12671109438456697877, 15652595419009785355, 10753966634497852319, 3622124053041186910, 2063695485301676711, 17845322355197915738, 9894091605930112348, 10822348040176532279, 9689802115657313068, 6759722828145755337, 9479044480226984785, 7845909286502989649, 560081323074218824, 16017591174163981005, 1196237303718990885, 6783304352365897531, 5064625229425039166, 12661189034561966549, 11511655067934063768, 11479359825177848513, 0, 11698, 2084118884093035279, 16979859941949546961, 1454299506056429821, 9658643065222637557, 11605485146349749283, 13057696629474024230, 16650374201325163722, 7457309320444728046, 1243843599995756274, 17176177262691414244, 14152683925184093692, 198845790532099135, 442435874165139119, 1462611314767788334, 3462067515008653152, 4141759445261917472, 12323330957750482072, 14922731139272985797, 10387565380055278256, 9531386257124273696, 9539285450074189441, 3691450672437772660, 12463184698711878632, 4858502687517999226, 12256855995572753726, 9245347314341240247, 7569214225554358494, 1017686422583121037, 10327407591150878848, 15025446886891081073, 0, 41, 13092032916490151270, 2856458557507854671, 14059661153766146178, 1724041303048776424, 7119687853704366589, 3699246950542313036, 8338994289155538949, 7732171807197958061, 10653644351656999339, 15262849800927670044, 6132373490633371091, 16473831322001214578, 12928938600331453669, 6959935525856744214, 17173069020016176920, 6747622983845354522, 2484033613426731933, 9879916419081378373, 4275250202523893223, 5995505684018086986, 16115855409799741127, 2490003355474156145, 10034475279304353355, 7223217715426381376, 10334063888823214988, 2139000562522371457, 18314119367638727156, 15311716904301189063, 894706229073498557, 1570146104298050273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 96, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 5, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 6, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 7, 0, 0, 0, 0, 0, 5, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 8, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 2200823396264285425, 8088984326603898052, 1751709948898726303, 3405979658670756574, 5644431973654019812, 12554030503530361323, 11231727832144176264, 11479359825177848513, 0, 0, 1, 0, 0, 1, 1, 0, 0, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 3795543859124105201, 12910581729787565904, 17596568325206204932, 12512094004962322130, 5735281858523620986, 3013510715159483905, 7390177608867021213, 15025446886891081073, 0, 0, 1, 0, 0, 1, 1, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8488924048752676071, 7132218559010351790, 18152833202936203138, 302695496926486902, 13622702382434675698, 6093021124582015914, 9617260353707541367, 12529483521877137515, 7876112718273244024, 14482187202392982684, 3800418813655617572, 13092032916490151270, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5473488137200086909, 2687466917280430353, 10305147718805144715, 16415403596737407938, 8941567408770445183, 375332441348258328, 9187825164453421957, 4671467226762388980, 1276143811675585923, 17682350329754313417, 14503408479575576010, 2856458557507854671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16124688533662466636, 14170238607512888511, 13246631902503555591, 12969246825596557956, 2168342371250989865, 16597900739273350797, 17649953659489375797, 13873740979092621907, 9993912342918529935, 66214439016909251, 10553169970007645345, 14059661153766146178, 1, 0, 0, 0, 1, 0, 15754956633454945151, 6055713190940499638, 11077250730155763388, 4527044298581192722, 5453168895411602323, 18142351346900318359, 15965643470182086386, 17553704974699598306, 16788616498952461620, 6396310504287885774, 12847173262736205772, 16999254614849428545, 7504629639084879386, 4946745422622378051, 1724041303048776424, 1, 0, 0, 0, 1, 0, 5043375237696906583, 4379507338442738151, 10191347065326962634, 15470787238396171217, 7649138216344653830, 3098698980745497723, 7317402970608805914, 10652219805906948351, 17377183878976452334, 17213560015461715510, 7630996533587302384, 8208119826419095432, 10242982970375452289, 16630221959750548176, 8338994289155538949, 1, 0, 0, 0, 1, 0, 27564165777955823, 2554423200420703486, 17579160449292996896, 11147561538212402733, 7271583017513514692, 11194864417357882388, 5717939852331496040, 1428764500637505382, 421533440407219618, 2958950328581697287, 5856098383496092000, 12651683228606533001, 9239012175869487665, 9831397389014117600, 15262849800927670044, 1, 0, 0, 0, 1, 0, 12554774560852918121, 7558057668449617622, 8341229243444900158, 11546140485006286209, 5702916883024911354, 10059737158050223658, 15942512744234440774, 2751093334206085539, 13224617406323308041, 12078599565132475515, 13785560116650003734, 18102951610480561318, 17448534469581521177, 17663607747965229138, 12928938600331453669, 1, 0, 0, 0, 1, 0, 6754601476785640702, 7736060991620510625, 1449884785010881379, 6135983205453599776, 9277341930384005575, 17852936504841763737, 15508051727969296111, 11875658036026604145, 14497665384991648640, 5591521890390007231, 7840142081125036731, 10575290756167155008, 6963375374275021656, 16616426694032134438, 6747622983845354522, 1, 0, 0, 0, 1, 0, 7929723072429044254, 16334448815751507577, 4434638168235316685, 17199894398730562705, 13653108884642243926, 18423338781077887809, 810875278274469351, 5684565403642367050, 13312171511942754529, 17728945623551220217, 2133036585496843963, 12373753045781314057, 4604616361036784646, 12451218545182255865, 4275250202523893223, 1, 0, 0, 0, 1, 0, 8602814005182217200, 9971451726661298505, 15671763834046105438, 7369439734883755459, 15167316901472929028, 9594540064387516595, 598273005722510655, 5216498913603536417, 5334026694118161468, 10671987699715228843, 5837806564591410604, 10199402949196411787, 17782855612978839775, 5745169166190656073, 2490003355474156145, 1, 0, 0, 0, 1, 0, 1420030357616461150, 0, 0, 14515762120928230173, 8611475648437961511, 7809934763889573038, 12653867244112536729, 5258230180909223265, 1299716947845207044, 11653871972148380806, 8985195681813998404, 15945306792731206141, 12753204151452870283, 7870235520772452232, 10334063888823214988, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13610167819530098127, 10900065459953722709, 18341122838405415754, 3153753366153954420, 1124366766375746940, 14709808073905360012, 8531928004921347162, 12041110943945791333, 5505106000120813030, 12896535568794110034, 5432056100901092307, 18314119367638727156, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11215445033353754262, 9162692523043045302, 11967784234256998242, 12197142511433562971, 9116801986360376826, 11742139955633481423, 98858158429688394, 11648250496545232642, 14774803975376978777, 7402084190222773115, 8994645443800925562, 15311716904301189063, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8081237365032914784, 17462008412377898139, 10761804868734649587, 13557680898519201450, 6650575029061305823, 13522070698443062110, 6167334615107562354, 7830634726555216225, 14575654492591748955, 598469278842686486, 5908996313982662075, 894706229073498557, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6714198787893475936, 18084035356118526352, 4199576522683349447, 7560057297276955988, 18280076181055982575, 15125170292333450443, 6055246182589913733, 8146055133796963630, 12761879591277148733, 4789346784708035796, 6351111885067026894, 2084118884093035279, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5262284953624879131, 8386870944408484201, 16513391592299529611, 7451013195867945919, 3965010120048981150, 7072657932567702059, 15015595405278911690, 4724864404296433607, 3794756304714494565, 9438751512570250357, 14086295994708840477, 16979859941949546961, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6828048997998717653, 18056918720989013854, 11415640949254272304, 7468487593070852196, 1623299660155787797, 10475291980250876467, 2209046468675768902, 10453305271538430204, 10919382803049057886, 447952077691938652, 3142920623105062021, 1454299506056429821, 1, 0, 0, 0, 1, 0, 11959032640791191427, 13666984456735322931, 12430950944235583873, 14647846255598321281, 11520229540186073721, 16138036929710694921, 5578183109591783882, 11930292174601709627, 14632109792663117375, 16429197663637467330, 17141108237620938331, 13927811434585922718, 6351356675900770483, 4317195510637014184, 9658643065222637557, 1, 0, 0, 0, 1, 0, 3078434273127823899, 5753377056128261292, 7043657405344780329, 9916068016290756984, 12303762929371991135, 15625472986208536177, 17025371161980089605, 17841510847136093686, 11537033439839832588, 18370261572729563296, 16936235645680974811, 41153506376499461, 11511034416225137032, 12977978004680762325, 16650374201325163722, 1, 0, 0, 0, 1, 0, 16093488747192154823, 9136889811217566327, 15238340014812686010, 6061515485015027193, 16455507557982986163, 13332197512776217968, 6710066216774366729, 2022739540363098314, 16116176887352657770, 15223121510830934757, 10618808740372936561, 18362204307013225363, 12230522212327928379, 211962335804367550, 17176177262691414244, 1, 0, 0, 0, 1, 0, 17584045558346364245, 8021141784340784171, 17538920393594018726, 9245574117575493602, 9198509167958908347, 706573335075180235, 4986060230214018536, 4092740078069974091, 7669544778380245671, 3912605942422700262, 17652411276563186968, 9538491437159792328, 15728916292645010880, 5244269534978718672, 442435874165139119, 1, 0, 0, 0, 1, 0, 3172838986399921646, 14996615673828945713, 2968596499138535119, 13553995817865937844, 1544674922431042375, 5341110475237803180, 6457499153671182820, 1597700055042697404, 4105927596877687309, 7112424425452913463, 12442058685904907795, 13797917351588149895, 8280685582260709248, 14654598206063183317, 4141759445261917472, 1, 0, 0, 0, 1, 0, 18432037966602915394, 11157278412179636212, 3333037102311562019, 8806896510487478352, 6533551228799195237, 13389502447794973829, 15065279868519608165, 10536769335197150641, 1322695487397776109, 15112974401160243995, 14778499304685795812, 2655893075036451977, 15172713941042952680, 13178742765486355260, 10387565380055278256, 1, 0, 0, 0, 1, 0, 18181589522906879612, 16462817036687190629, 13897413906888730423, 2444726075814550534, 13039263708530965818, 9767862146044075473, 16994104539161729445, 3295906456874767760, 16338446684875281086, 5238070817263862176, 11933451322373121057, 18163310674975357977, 3914062371738178895, 2639949635019592417, 3691450672437772660, 1, 0, 0, 0, 1, 0, 9441086471966058156, 0, 0, 3069389264726801426, 17714998603219848343, 3285997397792070136, 2327203233976270205, 4976836170739997781, 12287193162084105824, 4267926381848052110, 873880226830208445, 5002589281792664271, 8614894336467293783, 13436383826829479040, 12256855995572753726, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3979217445866956620, 14102459334756352921, 14473951691792990803, 8253253226048886083, 12319687016213027555, 13089916287630526229, 17044511642202081265, 6896812394605202475, 9256382872640968643, 14221135810103683560, 12080155723705641895, 7569214225554358494, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6693606464693965975, 13661835471193379756, 8827937223658185560, 11671578295265948239, 13490282225851742651, 1568845385281768860, 17370313250110904770, 2024842447089060639, 6570002101874463971, 11406071542091908609, 6767987840126452263, 1017686422583121037, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9525288177353527302, 3038016940647586670, 9698676695870635420, 14297456315487806992, 3371801902832234206, 982340402770608276, 13397257034080852565, 16625734836325714912, 3849537215181896567, 571586377235018247, 14392317091133450653, 10327407591150878848, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 3795543859124105201, 12910581729787565904, 17596568325206204932, 12512094004962322130, 5735281858523620986, 3013510715159483905, 7390177608867021213, 15025446886891081073, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15045917672181612303, 8184561966951183876, 1314981229280595867, 10051713503687926694, 10772660272533654046, 10088766553729725414, 8691876854061179148, 5989289390391757114, 3407397722647202213, 7941852203687681180, 4199208231896291776, 15233230393479930649, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3672327111134984977, 12431805880114311043, 1393532256400242982, 5258910437097366761, 3331697170176629084, 12574093635772317570, 2952350747126730564, 15670015339098587014, 13644814392425193274, 2987825311454433607, 6349271639347163621, 15702789941308523576, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11902001817992340801, 2986356007899077631, 13433705342207763738, 14031537229609682064, 602109730184155310, 5470069473511751658, 7968203687716298290, 12708827926449341197, 9689174787852538317, 185071303888742221, 5568595648257864309, 8819781861782654629, 1, 0, 0, 0, 1, 0, 9433051896879704986, 3790096704121066977, 7848157813885660720, 97480563262877602, 2836244341662188919, 12880831435259048250, 18190284629542346231, 16230148280330706633, 9645793732101008923, 6747517476428823928, 10159927950043513901, 15759480978611340324, 16140725249773135932, 10224931331962954075, 7112644758334533508, 1, 0, 0, 0, 1, 0, 12268806337265941227, 8766527133291152460, 4573212491205067738, 1451330498122947575, 13878284404078727054, 13732313223959877570, 4019409425675168575, 14888577262766439787, 7118521641278947238, 5699380547329532508, 9229756563573051371, 1502926046713635634, 11073859438158044651, 3706462809677116963, 10242380937000070843, 1, 0, 0, 0, 1, 0, 12264599910826326487, 4401672593088936956, 3287770912268324671, 8550984974115591347, 11905155073870025459, 15581584642080412492, 16642022229570326204, 4740702640077452126, 8228232126921631746, 6257583805205658612, 10107168241231917326, 4186763142475177793, 16536071023746429034, 4953509182438845792, 17015988684670402201, 1, 0, 0, 0, 1, 0, 10482044717877897468, 11338035720719303533, 15111143544560920122, 5779906183691085674, 5883496260565631343, 17424758021352066268, 6872649224968331273, 18294822284401514132, 14018593041447406970, 3295089823193122164, 12619661555644649350, 13163397875087894329, 12116759677655250999, 12872180446847298231, 10753966634497852319, 1, 0, 0, 0, 1, 0, 2142659226510195682, 8250976014423777012, 11550997137187900197, 7239115491427587826, 6214639496702145664, 13747770174448213841, 8363779881416372286, 18258193129875665644, 3929539690735302143, 7640632346113799527, 10501448523390229441, 575959985319833606, 8057038266027202789, 5675564903335979949, 17845322355197915738, 1, 0, 0, 0, 1, 0, 1980663272019683980, 16254047807534945359, 12731791925462422257, 8817470180767843173, 1035954869286151888, 10799815877710934765, 12949568200151355456, 17581484848263912285, 12655249523595546680, 5805413556949044653, 9960833320626690499, 8665485641724560922, 11146351406925299070, 13879671978791253311, 9689802115657313068, 1, 0, 0, 0, 1, 0, 2823715339336108463, 15599274894951921542, 4792471773839294427, 1023167627240586914, 12555736327846716176, 1619117325320043308, 18184433440084438609, 10658559677463134471, 9638171237357393134, 13312272456227001370, 2557094292829749679, 6384512333148749163, 13509558775822115028, 6737505022417937354, 7845909286502989649, 1, 0, 0, 0, 1, 0, 15590779242968047633, 0, 0, 12615841091071546269, 14389918991418187594, 6190024525131486611, 1586181560816232196, 1052908464763109826, 8064604530099592479, 11252467974344770686, 11951277814213817673, 7414754653220847914, 4751058192101309365, 10017226585432634212, 1196237303718990885, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15373572920503822367, 5150637797762075635, 17671950935398765622, 8020025137186066841, 4274762298296320367, 544627542347870852, 2629112354487966090, 13884819925875295975, 8368586536930615942, 15345629614104209519, 11893931769684808775, 5064625229425039166, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11769995123877236600, 11237118474907085960, 15303512720733905693, 13419225700498867773, 7383511416371792464, 11879905738846635842, 10128035487146424848, 1926379571595510347, 10138228048917253579, 1689963602473071179, 16471875099240353401, 12661189034561966549, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3762647969008011219, 11752652705714102353, 10727837149375754730, 13671651770198504476, 17305170235876004791, 5683487714952213815, 18233951381382816412, 5918588896905128530, 344980745193352015, 12869561156624962469, 9975926385796085953, 11511655067934063768, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 2200823396264285425, 8088984326603898052, 1751709948898726303, 3405979658670756574, 5644431973654019812, 12554030503530361323, 11231727832144176264, 11479359825177848513, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_17.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_17.snap index a5f0d94b28..75867bc4db 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_17.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_17.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 1, 65, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11182969138190702361, 11656, 91, 0, 0, 11182969138190702361, 41, 0, 11006573531383828351, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010], [1109628455053940361, 42, 1, 1, 1, 1109628455053940361, 0, 1, 10983413158656624898, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331], [13928676565061410159, 0, 0, 0, 0, 13928676565061410159, 0, 0, 4869282124135316831, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319], [297470094449022674, 0, 0, 0, 0, 297470094449022674, 0, 0, 5899798166361732461, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694], [11006573531383828351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [2, 2, 2, 1, 2, 2, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 3, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11182969138190702361, 16344194729581826754, 15045917672181612303, 3672327111134984977, 11902001817992340801, 97480563262877602, 1831626543952762702, 12062163654685913941, 1451330498122947575, 1742063333427513989, 2331114102915733339, 8550984974115591347, 8960841496031156142, 13720918668577423004, 5779906183691085674, 3198599991840782485, 13728843979899181292, 7239115491427587826, 12128894594351473931, 15480692841914867508, 8817470180767843173, 10548371713427919789, 10315264763691724912, 1023167627240586914, 3818953450339058320, 14941570263133670432, 12615841091071546269, 15435370781163068976, 15373572920503822367, 11769995123877236600, 3762647969008011219, 8269653645296248010, 11656, 117148, 6714198787893475936, 5262284953624879131, 6828048997998717653, 14647846255598321281, 12213957512096072087, 15486993862206988880, 9916068016290756984, 12311676223031039230, 6798558233575208094, 6061515485015027193, 9178825932447902299, 16451694760407086053, 9245574117575493602, 6706571375738621744, 5707941763645196550, 13553995817865937844, 18312867062271325792, 11246612591729350508, 8806896510487478352, 16014621579841168337, 6332183310159529150, 2444726075814550534, 13415483499482541228, 16602291456530418215, 3069389264726801426, 4940323642218861897, 3979217445866956620, 6693606464693965975, 9525288177353527302, 11182969138190702361, 41, 410, 8488924048752676071, 5473488137200086909, 16124688533662466636, 4527044298581192722, 16887055178922689595, 5249711198271717177, 15470787238396171217, 5632634005697013617, 7337408598993184022, 11147561538212402733, 9710911023591971572, 8752830793140649116, 11546140485006286209, 10738951369466640003, 2139663271495255306, 6135983205453599776, 17538856881976830392, 2031516987289365197, 17199894398730562705, 4010699482290892787, 3922552954514582360, 7369439734883755459, 108303794773646012, 14521269346803535153, 14515762120928230173, 13893962684375637966, 13610167819530098127, 11215445033353754262, 8081237365032914784, 11006573531383828351, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1109628455053940361, 12119768350776285319, 8184561966951183876, 12431805880114311043, 2986356007899077631, 2836244341662188919, 146796491816379180, 8696360259937422388, 13878284404078727054, 7667548888861073206, 9741377056638459459, 11905155073870025459, 9736056580211703764, 17352787150580200349, 5883496260565631343, 9594088066979877926, 9297041447863221537, 6214639496702145664, 2461170076272033096, 17112913798212225634, 1035954869286151888, 2140568550425483844, 10584986198873793665, 12555736327846716176, 12072441430913369009, 13906015856663078107, 14389918991418187594, 2676571742010508284, 5150637797762075635, 11237118474907085960, 11752652705714102353, 997682303299740331, 42, 93752, 18084035356118526352, 8386870944408484201, 18056918720989013854, 11520229540186073721, 5668756658695595711, 14109792997657353922, 12303762929371991135, 14460911410586037148, 12418445481638740107, 16455507557982986163, 18172284878038222122, 6352198309363971688, 9198509167958908347, 1068046269761257463, 16102483860755268671, 1544674922431042375, 9868836391822552540, 7915117918356788325, 6533551228799195237, 3992189811639127908, 9511948951280762358, 13039263708530965818, 708611914251242147, 4206064101444952505, 17714998603219848343, 13074430791784659712, 14102459334756352921, 13661835471193379756, 3038016940647586670, 1109628455053940361, 0, 328, 7132218559010351790, 2687466917280430353, 14170238607512888511, 5453168895411602323, 8679138582261878552, 10871515559850126217, 7649138216344653830, 12086029516113687059, 14609582285822867389, 7271583017513514692, 3821121937809044409, 3833100151978191712, 5702916883024911354, 3579138882391492892, 14347405124134927123, 9277341930384005575, 2993137622300793545, 13370802209879109056, 13653108884642243926, 8702782587703766612, 12945832125614510830, 15167316901472929028, 4608694219239856197, 4443739924303229750, 8611475648437961511, 1575864515244779062, 10900065459953722709, 9162692523043045302, 17462008412377898139, 10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13928676565061410159, 5375705730949115787, 1314981229280595867, 1393532256400242982, 13433705342207763738, 12880831435259048250, 10699055768478348083, 2470044642731141974, 13732313223959877570, 2078090264025450769, 3845297826200108779, 15581584642080412492, 11359623335937034504, 14549946302435322871, 17424758021352066268, 15472130290487345321, 13048555428151627244, 13747770174448213841, 9164669383091055648, 3250455247796114093, 10799815877710934765, 9086202890994770785, 12116339825079888992, 1619117325320043308, 16898959203497269575, 15756045849228969140, 6190024525131486611, 6215657966742979785, 17671950935398765622, 15303512720733905693, 10727837149375754730, 12907160815575155319, 0, 23564, 4199576522683349447, 16513391592299529611, 11415640949254272304, 16138036929710694921, 9992494271122179933, 3020772293084222765, 15625472986208536177, 12149624601412828429, 10735117276139490774, 13332197512776217968, 13474689739491604605, 13815225937039366706, 706573335075180235, 4097091053989040149, 693823183101411164, 5341110475237803180, 4368449439175744649, 7740607367180462177, 13389502447794973829, 6721164191334334250, 6997451158266748059, 9767862146044075473, 4778055569341029558, 10088175016132507812, 3285997397792070136, 10914182999248450193, 14473951691792990803, 8827937223658185560, 9698676695870635420, 13928676565061410159, 0, 82, 18152833202936203138, 10305147718805144715, 13246631902503555591, 18142351346900318359, 11971140429919100117, 6903484634638418138, 3098698980745497723, 3068992673894668202, 9164459936648953977, 11194864417357882388, 12005359455571366116, 12356306486226268709, 10059737158050223658, 17119982236602677307, 4225663824996553892, 17852936504841763737, 5778553506856942969, 9045001363359345866, 18423338781077887809, 2711240319770097821, 8346149567490270428, 9594540064387516595, 1859863665658604717, 16919987197409252682, 7809934763889573038, 12492597695329698922, 18341122838405415754, 11967784234256998242, 10761804868734649587, 4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [297470094449022674, 13535968261560526699, 10051713503687926694, 5258910437097366761, 14031537229609682064, 18190284629542346231, 4346004165604875907, 15375947702712472554, 4019409425675168575, 2064296209102051574, 17718639079388526425, 16642022229570326204, 1618478323171655450, 5998884876319667302, 6872649224968331273, 13753905356607269997, 7559241041198219519, 8363779881416372286, 2105649450986611656, 11644599807961994770, 12949568200151355456, 4366812189797744262, 9669235379242805159, 18184433440084438609, 13914998044815764482, 11325806379320193213, 1586181560816232196, 5920020313630770955, 8020025137186066841, 13419225700498867773, 13671651770198504476, 18024383338294781694, 0, 23396, 7560057297276955988, 7451013195867945919, 7468487593070852196, 5578183109591783882, 15747662796636990589, 2066701485189878406, 17025371161980089605, 4391959764977446152, 4985867595251695917, 6710066216774366729, 6241000701339836952, 4718440141936325382, 4986060230214018536, 5748634601882563491, 10896228304766504283, 6457499153671182820, 12270042173384394159, 11711065129605555908, 15065279868519608165, 17856220227797901726, 8953039722587792244, 16994104539161729445, 14670768895096516686, 14803898243742553487, 2327203233976270205, 17449705512918939747, 8253253226048886083, 11671578295265948239, 14297456315487806992, 297470094449022674, 0, 82, 302695496926486902, 16415403596737407938, 12969246825596557956, 15965643470182086386, 14881573336337548597, 2868629484750761697, 7317402970608805914, 2570537868338555591, 6697005353407257884, 5717939852331496040, 9408357527608003903, 8011884131194179594, 15942512744234440774, 9052662470595673790, 11913271961595885333, 15508051727969296111, 6269710669185644103, 12322255659000247132, 810875278274469351, 3499523055983644139, 9453749819048496107, 598273005722510655, 12338854942180141395, 2829445891916136836, 12653867244112536729, 4648827005364006908, 3153753366153954420, 12197142511433562971, 13557680898519201450, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11006573531383828351, 92579048505362891, 10772660272533654046, 3331697170176629084, 602109730184155310, 16230148280330706633, 6302091831624975391, 14001078336639287767, 14888577262766439787, 12258632680483319887, 7641862043593808385, 4740702640077452126, 8494032654039797119, 8314420015254970480, 18294822284401514132, 15552480182219334239, 908821363395967579, 18258193129875665644, 4226365574585037317, 3638253471537757569, 17581484848263912285, 6286301305761091621, 4777175749672661669, 10658559677463134471, 1417442037893012894, 7857622794514614671, 1052908464763109826, 4925127753504389599, 4274762298296320367, 7383511416371792464, 17305170235876004791, 2200823396264285425, 0, 58574, 18280076181055982575, 3965010120048981150, 1623299660155787797, 11930292174601709627, 17275008438838615802, 5756406115988630048, 17841510847136093686, 6729021181420822547, 1709787776185889305, 2022739540363098314, 5157634830695555269, 17099057016182449505, 4092740078069974091, 9582547144648304801, 4715310719341519129, 1597700055042697404, 480964694484615271, 56280064407246395, 10536769335197150641, 16099710145374622840, 3473101726323291593, 3295906456874767760, 716460020344690975, 10580825486552151036, 4976836170739997781, 16652319776094256449, 12319687016213027555, 13490282225851742651, 3371801902832234206, 3795543859124105201, 0, 205, 13622702382434675698, 8941567408770445183, 2168342371250989865, 17553704974699598306, 12818882650622055705, 16478401302589696546, 10652219805906948351, 13167156861512034068, 260666911081589986, 1428764500637505382, 2190433219200603887, 11999917547751101526, 2751093334206085539, 9318931023569054874, 16297727142514657495, 11875658036026604145, 5829323963705819601, 407792022339954638, 5684565403642367050, 13995368600016681288, 2845800306757116207, 5216498913603536417, 2411940295743487842, 2014066638340124975, 5258230180909223265, 17089893338044941808, 1124366766375746940, 9116801986360376826, 6650575029061305823, 4025036448660092914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 11859595567907759997, 10088766553729725414, 12574093635772317570, 5470069473511751658, 9645793732101008923, 1476556243604239385, 17933040757673393353, 7118521641278947238, 7588084371428510216, 12191494749556797391, 8228232126921631746, 15226641263820888277, 4239012011479875368, 14018593041447406970, 3541695062587160892, 11116896887234129281, 3929539690735302143, 11203930352796078636, 8751959587369085991, 12655249523595546680, 16379258612200834026, 9984807922535170831, 9638171237357393134, 12191893464144837018, 4677785078090407332, 8064604530099592479, 10076433135196495423, 544627542347870852, 11879905738846635842, 5683487714952213815, 8088984326603898052, 0, 46876, 15125170292333450443, 7072657932567702059, 10475291980250876467, 14632109792663117375, 18379882203306053694, 10250239327737538260, 11537033439839832588, 15180883293806522386, 18285674122603938406, 16116176887352657770, 15068074760365493774, 10507624248254584461, 7669544778380245671, 16424767991328560142, 16771797144770177609, 4105927596877687309, 7519344916607985067, 16277772212475505196, 1322695487397776109, 8302446182097155523, 14744324883381489574, 16338446684875281086, 5703860549203085948, 14077533030564871132, 12287193162084105824, 2535384450001991464, 13089916287630526229, 1568845385281768860, 982340402770608276, 12910581729787565904, 0, 164, 6093021124582015914, 375332441348258328, 16597900739273350797, 16788616498952461620, 10323894478242846558, 3730474644926313294, 17377183878976452334, 12746711269593150718, 13699107349734059694, 421533440407219618, 15109303318896079214, 17746438429032263850, 13224617406323308041, 5646455969610140563, 12626985742338481481, 14497665384991648640, 13894375308737560134, 3268393834564630675, 13312171511942754529, 611321250913478210, 12048873764879264902, 5334026694118161468, 14360341460112568406, 17654490467796517057, 1299716947845207044, 7609683397541157642, 14709808073905360012, 11742139955633481423, 13522070698443062110, 12847434483856017691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 10293244464294212936, 8691876854061179148, 2952350747126730564, 7968203687716298290, 6747517476428823928, 16731591574836256879, 12286682322909052293, 5699380547329532508, 8774011841981167612, 10988677337017809219, 6257583805205658612, 8595550098696265772, 17321901905145630028, 3295089823193122164, 6581488060195755410, 6329516418872359771, 7640632346113799527, 10454000694343684461, 15867346750604392587, 5805413556949044653, 9247297947852762648, 13748015074908171216, 13312272456227001370, 5054807356361880835, 1012271632864570722, 11252467974344770686, 492886975717156403, 2629112354487966090, 10128035487146424848, 18233951381382816412, 1751709948898726303, 0, 11782, 6055246182589913733, 15015595405278911690, 2209046468675768902, 16429197663637467330, 15810134098389081544, 9588791733994120847, 18370261572729563296, 7006788971063612777, 7962515674056117045, 15223121510830934757, 15872454912771340895, 1486059252283823706, 3912605942422700262, 4173681472723400357, 2922691200579275072, 7112424425452913463, 17213377378328786151, 6274713241106982122, 15112974401160243995, 17175975930045398893, 5467280291812001242, 5238070817263862176, 17584445990298638069, 171514605620090783, 4267926381848052110, 9011064139813451706, 17044511642202081265, 17370313250110904770, 13397257034080852565, 17596568325206204932, 0, 41, 9617260353707541367, 9187825164453421957, 17649953659489375797, 6396310504287885774, 17019569090864760371, 870218876784769460, 17213560015461715510, 16812494438448165271, 15885717661613279263, 2958950328581697287, 14311601477626423214, 12599125587081655507, 12078599565132475515, 3332808335850364509, 374688056722968094, 5591521890390007231, 9584980789501913045, 4066644474875437132, 17728945623551220217, 1158050506628066296, 3730734784735709807, 10671987699715228843, 3173999018565335463, 14949604462817069254, 11653871972148380806, 312408327658285690, 8531928004921347162, 98858158429688394, 6167334615107562354, 1234843923022284190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 2163003956713638315, 5989289390391757114, 15670015339098587014, 12708827926449341197, 10159927950043513901, 15395056832871965886, 17405960500607097380, 9229756563573051371, 1186079292937331145, 13463816706671585562, 10107168241231917326, 8534001612601599401, 12790948878158723266, 12619661555644649350, 11614101867080583800, 11255619179741810030, 10501448523390229441, 16971746085380600175, 7173352752193758542, 9960833320626690499, 3507659370538431093, 6846598866105961944, 2557094292829749679, 11416743759689580593, 12182449258645699464, 11951277814213817673, 10567677969346318078, 13884819925875295975, 1926379571595510347, 5918588896905128530, 3405979658670756574, 0, 11698, 8146055133796963630, 4724864404296433607, 10453305271538430204, 17141108237620938331, 16113292978122689735, 14630852758047225712, 16936235645680974811, 640959767495035790, 11162248672474783185, 10618808740372936561, 12973220127719589473, 13223353016814262874, 17652411276563186968, 10141330567980253051, 1770876161367154023, 12442058685904907795, 12986633647641209886, 5384244903407669612, 14778499304685795812, 8054814913234770610, 8358166993767322841, 11933451322373121057, 17795028935448509068, 11142588879850986282, 873880226830208445, 11017896854604878841, 6896812394605202475, 2024842447089060639, 16625734836325714912, 12512094004962322130, 0, 41, 12529483521877137515, 4671467226762388980, 13873740979092621907, 12847173262736205772, 2640423636460273022, 8374058502362870155, 7630996533587302384, 3556075572123538464, 8078558398785937163, 5856098383496092000, 7999607615804135893, 15509992149354799776, 13785560116650003734, 8358196300413379173, 10412508239405514928, 7840142081125036731, 18075062342410207477, 18173191150607640442, 2133036585496843963, 8931901040624025193, 9454731621283026961, 5837806564591410604, 5850596656185029719, 296117354535505751, 8985195681813998404, 1975947551471322175, 12041110943945791333, 11648250496545232642, 7830634726555216225, 5266777994490151623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11627839282500592134, 3407397722647202213, 13644814392425193274, 9689174787852538317, 15759480978611340324, 10073546228149283602, 8090878949578096073, 1502926046713635634, 7624167193861818791, 10274257988202953339, 4186763142475177793, 6025425965090069083, 8194342163688078130, 13163397875087894329, 5161390927343581791, 10103251159424454395, 575959985319833606, 13175926157437524595, 8928028362497258488, 8665485641724560922, 15570929820685955587, 6150675652390666890, 6384512333148749163, 35921027791486524, 3229184449291625000, 7414754653220847914, 11347301099028602515, 8368586536930615942, 10138228048917253579, 344980745193352015, 5644431973654019812, 0, 58574, 12761879591277148733, 3794756304714494565, 10919382803049057886, 13927811434585922718, 8315847055470475708, 10095847089706649983, 41153506376499461, 5529807447506440005, 72892344713547594, 18362204307013225363, 527610602670466995, 14772158556567070690, 9538491437159792328, 1580498045195806896, 8297535568256810268, 13797917351588149895, 1651894826575892086, 13380716913143325871, 2655893075036451977, 3750342908258071259, 18231595474498119868, 18163310674975357977, 2371603174180061555, 6433509503768865899, 5002589281792664271, 10946433388588585987, 9256382872640968643, 6570002101874463971, 3849537215181896567, 5735281858523620986, 0, 205, 7876112718273244024, 1276143811675585923, 9993912342918529935, 16999254614849428545, 8194747920293058753, 11171758628037424552, 8208119826419095432, 5568149314099479773, 17551537772960996556, 12651683228606533001, 13584145944854843210, 12212300608708011466, 18102951610480561318, 14720258372954226591, 15448472262117068008, 10575290756167155008, 11997391634424499349, 9879556170680135793, 12373753045781314057, 9529470285212177396, 10620662102176580756, 10199402949196411787, 9825825353570660203, 18337390924518345383, 15945306792731206141, 10537181099344133724, 5505106000120813030, 14774803975376978777, 14575654492591748955, 8207377881872409730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 1844206616423154361, 7941852203687681180, 2987825311454433607, 185071303888742221, 16140725249773135932, 13486449309893009073, 13471170357015645210, 11073859438158044651, 16507211018434913458, 4066228076398875428, 16536071023746429034, 10818247459046542341, 4392853051950044706, 12116759677655250999, 17293580330275603290, 2376540144284705519, 8057038266027202789, 15097730100005395027, 3583575859544955648, 11146351406925299070, 13473187462927502829, 8056538798141691018, 13509558775822115028, 6797301950091310335, 8773981691004278165, 4751058192101309365, 10661116978196100999, 15345629614104209519, 1689963602473071179, 12869561156624962469, 12554030503530361323, 0, 46876, 4789346784708035796, 9438751512570250357, 447952077691938652, 6351356675900770483, 4868676530510485341, 3192437812250556397, 11511034416225137032, 15380266628173325649, 10700144984876703355, 12230522212327928379, 15526804358639727019, 6410705682507666807, 15728916292645010880, 13992590038292222154, 1916422775943772979, 8280685582260709248, 12515254706968408232, 4845996266408136556, 15172713941042952680, 2233761585242005099, 13227100893355110663, 3914062371738178895, 7843298541359739176, 8386193964610423744, 8614894336467293783, 8834991867772635266, 14221135810103683560, 11406071542091908609, 571586377235018247, 3013510715159483905, 0, 164, 14482187202392982684, 17682350329754313417, 66214439016909251, 7504629639084879386, 11708178258767948919, 188011405648496761, 10242982970375452289, 16510140404231294235, 13381084464566932690, 9239012175869487665, 9339694231140180875, 9917181315244873380, 17448534469581521177, 4965043893766771965, 13305445405772227224, 6963375374275021656, 4554518835153561582, 1694446457415578298, 4604616361036784646, 11439774970058559661, 10784225701912607868, 17782855612978839775, 13368223431578003475, 18100595786373494652, 12753204151452870283, 17504098334052422651, 12896535568794110034, 7402084190222773115, 598469278842686486, 5912604878679295331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11371898088219304696, 4199208231896291776, 6349271639347163621, 5568595648257864309, 10224931331962954075, 8046167029187450402, 6585148777263545478, 3706462809677116963, 12578093594063946501, 11334181120248394313, 4953509182438845792, 4130560513564095433, 6665409895959715593, 12872180446847298231, 11452171012153290342, 5729159829892489539, 5675564903335979949, 14158677720471443076, 12300968791182495713, 13879671978791253311, 14820104759072107152, 17585955671327967478, 6737505022417937354, 17454985371239394211, 15749874646256262769, 10017226585432634212, 8893160827421013787, 11893931769684808775, 16471875099240353401, 9975926385796085953, 11231727832144176264, 0, 11782, 6351111885067026894, 14086295994708840477, 3142920623105062021, 4317195510637014184, 16341148873550430347, 8014762585425506108, 12977978004680762325, 15318810920503136316, 9472517513827583818, 211962335804367550, 14931353145911604525, 9340212215573419915, 5244269534978718672, 1584128384101705476, 4460891295949496863, 14654598206063183317, 13555452196222133132, 17680908597379218579, 13178742765486355260, 3964993209073179108, 4213917162333386044, 2639949635019592417, 3300803743280888923, 12914222891103397086, 13436383826829479040, 7004576641630317963, 12080155723705641895, 6767987840126452263, 14392317091133450653, 7390177608867021213, 0, 41, 3800418813655617572, 14503408479575576010, 10553169970007645345, 4946745422622378051, 7127828976000219721, 2687285609278369395, 16630221959750548176, 1114885198959805561, 3895092647933222339, 9831397389014117600, 12816842684293233323, 1779119880742935864, 17663607747965229138, 5382558247959552902, 11972955750871888364, 16616426694032134438, 9711126273890628516, 376576173107709408, 12451218545182255865, 14301764572821220192, 13209253693600827240, 5745169166190656073, 12916752429524642864, 14463770325561420619, 7870235520772452232, 13278341252249613603, 5432056100901092307, 8994645443800925562, 5908996313982662075, 1494658977663487041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 17530820119034444668, 15233230393479930649, 15702789941308523576, 8819781861782654629, 7112644758334533508, 2549387492966523460, 15838339720324898846, 10242380937000070843, 1124701407395854549, 5706112669062280829, 17015988684670402201, 12671109438456697877, 15652595419009785355, 10753966634497852319, 3622124053041186910, 2063695485301676711, 17845322355197915738, 9894091605930112348, 10822348040176532279, 9689802115657313068, 6759722828145755337, 9479044480226984785, 7845909286502989649, 560081323074218824, 16017591174163981005, 1196237303718990885, 6783304352365897531, 5064625229425039166, 12661189034561966549, 11511655067934063768, 11479359825177848513, 0, 11698, 2084118884093035279, 16979859941949546961, 1454299506056429821, 9658643065222637557, 11605485146349749283, 13057696629474024230, 16650374201325163722, 7457309320444728046, 1243843599995756274, 17176177262691414244, 14152683925184093692, 198845790532099135, 442435874165139119, 1462611314767788334, 3462067515008653152, 4141759445261917472, 12323330957750482072, 14922731139272985797, 10387565380055278256, 9531386257124273696, 9539285450074189441, 3691450672437772660, 12463184698711878632, 4858502687517999226, 12256855995572753726, 9245347314341240247, 7569214225554358494, 1017686422583121037, 10327407591150878848, 15025446886891081073, 0, 41, 13092032916490151270, 2856458557507854671, 14059661153766146178, 1724041303048776424, 7119687853704366589, 3699246950542313036, 8338994289155538949, 7732171807197958061, 10653644351656999339, 15262849800927670044, 6132373490633371091, 16473831322001214578, 12928938600331453669, 6959935525856744214, 17173069020016176920, 6747622983845354522, 2484033613426731933, 9879916419081378373, 4275250202523893223, 5995505684018086986, 16115855409799741127, 2490003355474156145, 10034475279304353355, 7223217715426381376, 10334063888823214988, 2139000562522371457, 18314119367638727156, 15311716904301189063, 894706229073498557, 1570146104298050273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 96, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 5, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 6, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 7, 0, 0, 0, 0, 0, 5, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 8, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 2200823396264285425, 8088984326603898052, 1751709948898726303, 3405979658670756574, 5644431973654019812, 12554030503530361323, 11231727832144176264, 11479359825177848513, 0, 0, 1, 0, 0, 1, 1, 0, 0, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 3795543859124105201, 12910581729787565904, 17596568325206204932, 12512094004962322130, 5735281858523620986, 3013510715159483905, 7390177608867021213, 15025446886891081073, 0, 0, 1, 0, 0, 1, 1, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8488924048752676071, 7132218559010351790, 18152833202936203138, 302695496926486902, 13622702382434675698, 6093021124582015914, 9617260353707541367, 12529483521877137515, 7876112718273244024, 14482187202392982684, 3800418813655617572, 13092032916490151270, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5473488137200086909, 2687466917280430353, 10305147718805144715, 16415403596737407938, 8941567408770445183, 375332441348258328, 9187825164453421957, 4671467226762388980, 1276143811675585923, 17682350329754313417, 14503408479575576010, 2856458557507854671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16124688533662466636, 14170238607512888511, 13246631902503555591, 12969246825596557956, 2168342371250989865, 16597900739273350797, 17649953659489375797, 13873740979092621907, 9993912342918529935, 66214439016909251, 10553169970007645345, 14059661153766146178, 1, 0, 0, 0, 1, 0, 15754956633454945151, 6055713190940499638, 11077250730155763388, 4527044298581192722, 5453168895411602323, 18142351346900318359, 15965643470182086386, 17553704974699598306, 16788616498952461620, 6396310504287885774, 12847173262736205772, 16999254614849428545, 7504629639084879386, 4946745422622378051, 1724041303048776424, 1, 0, 0, 0, 1, 0, 5043375237696906583, 4379507338442738151, 10191347065326962634, 15470787238396171217, 7649138216344653830, 3098698980745497723, 7317402970608805914, 10652219805906948351, 17377183878976452334, 17213560015461715510, 7630996533587302384, 8208119826419095432, 10242982970375452289, 16630221959750548176, 8338994289155538949, 1, 0, 0, 0, 1, 0, 27564165777955823, 2554423200420703486, 17579160449292996896, 11147561538212402733, 7271583017513514692, 11194864417357882388, 5717939852331496040, 1428764500637505382, 421533440407219618, 2958950328581697287, 5856098383496092000, 12651683228606533001, 9239012175869487665, 9831397389014117600, 15262849800927670044, 1, 0, 0, 0, 1, 0, 12554774560852918121, 7558057668449617622, 8341229243444900158, 11546140485006286209, 5702916883024911354, 10059737158050223658, 15942512744234440774, 2751093334206085539, 13224617406323308041, 12078599565132475515, 13785560116650003734, 18102951610480561318, 17448534469581521177, 17663607747965229138, 12928938600331453669, 1, 0, 0, 0, 1, 0, 6754601476785640702, 7736060991620510625, 1449884785010881379, 6135983205453599776, 9277341930384005575, 17852936504841763737, 15508051727969296111, 11875658036026604145, 14497665384991648640, 5591521890390007231, 7840142081125036731, 10575290756167155008, 6963375374275021656, 16616426694032134438, 6747622983845354522, 1, 0, 0, 0, 1, 0, 7929723072429044254, 16334448815751507577, 4434638168235316685, 17199894398730562705, 13653108884642243926, 18423338781077887809, 810875278274469351, 5684565403642367050, 13312171511942754529, 17728945623551220217, 2133036585496843963, 12373753045781314057, 4604616361036784646, 12451218545182255865, 4275250202523893223, 1, 0, 0, 0, 1, 0, 8602814005182217200, 9971451726661298505, 15671763834046105438, 7369439734883755459, 15167316901472929028, 9594540064387516595, 598273005722510655, 5216498913603536417, 5334026694118161468, 10671987699715228843, 5837806564591410604, 10199402949196411787, 17782855612978839775, 5745169166190656073, 2490003355474156145, 1, 0, 0, 0, 1, 0, 1420030357616461150, 0, 0, 14515762120928230173, 8611475648437961511, 7809934763889573038, 12653867244112536729, 5258230180909223265, 1299716947845207044, 11653871972148380806, 8985195681813998404, 15945306792731206141, 12753204151452870283, 7870235520772452232, 10334063888823214988, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13610167819530098127, 10900065459953722709, 18341122838405415754, 3153753366153954420, 1124366766375746940, 14709808073905360012, 8531928004921347162, 12041110943945791333, 5505106000120813030, 12896535568794110034, 5432056100901092307, 18314119367638727156, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11215445033353754262, 9162692523043045302, 11967784234256998242, 12197142511433562971, 9116801986360376826, 11742139955633481423, 98858158429688394, 11648250496545232642, 14774803975376978777, 7402084190222773115, 8994645443800925562, 15311716904301189063, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8081237365032914784, 17462008412377898139, 10761804868734649587, 13557680898519201450, 6650575029061305823, 13522070698443062110, 6167334615107562354, 7830634726555216225, 14575654492591748955, 598469278842686486, 5908996313982662075, 894706229073498557, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6714198787893475936, 18084035356118526352, 4199576522683349447, 7560057297276955988, 18280076181055982575, 15125170292333450443, 6055246182589913733, 8146055133796963630, 12761879591277148733, 4789346784708035796, 6351111885067026894, 2084118884093035279, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5262284953624879131, 8386870944408484201, 16513391592299529611, 7451013195867945919, 3965010120048981150, 7072657932567702059, 15015595405278911690, 4724864404296433607, 3794756304714494565, 9438751512570250357, 14086295994708840477, 16979859941949546961, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6828048997998717653, 18056918720989013854, 11415640949254272304, 7468487593070852196, 1623299660155787797, 10475291980250876467, 2209046468675768902, 10453305271538430204, 10919382803049057886, 447952077691938652, 3142920623105062021, 1454299506056429821, 1, 0, 0, 0, 1, 0, 11959032640791191427, 13666984456735322931, 12430950944235583873, 14647846255598321281, 11520229540186073721, 16138036929710694921, 5578183109591783882, 11930292174601709627, 14632109792663117375, 16429197663637467330, 17141108237620938331, 13927811434585922718, 6351356675900770483, 4317195510637014184, 9658643065222637557, 1, 0, 0, 0, 1, 0, 3078434273127823899, 5753377056128261292, 7043657405344780329, 9916068016290756984, 12303762929371991135, 15625472986208536177, 17025371161980089605, 17841510847136093686, 11537033439839832588, 18370261572729563296, 16936235645680974811, 41153506376499461, 11511034416225137032, 12977978004680762325, 16650374201325163722, 1, 0, 0, 0, 1, 0, 16093488747192154823, 9136889811217566327, 15238340014812686010, 6061515485015027193, 16455507557982986163, 13332197512776217968, 6710066216774366729, 2022739540363098314, 16116176887352657770, 15223121510830934757, 10618808740372936561, 18362204307013225363, 12230522212327928379, 211962335804367550, 17176177262691414244, 1, 0, 0, 0, 1, 0, 17584045558346364245, 8021141784340784171, 17538920393594018726, 9245574117575493602, 9198509167958908347, 706573335075180235, 4986060230214018536, 4092740078069974091, 7669544778380245671, 3912605942422700262, 17652411276563186968, 9538491437159792328, 15728916292645010880, 5244269534978718672, 442435874165139119, 1, 0, 0, 0, 1, 0, 3172838986399921646, 14996615673828945713, 2968596499138535119, 13553995817865937844, 1544674922431042375, 5341110475237803180, 6457499153671182820, 1597700055042697404, 4105927596877687309, 7112424425452913463, 12442058685904907795, 13797917351588149895, 8280685582260709248, 14654598206063183317, 4141759445261917472, 1, 0, 0, 0, 1, 0, 18432037966602915394, 11157278412179636212, 3333037102311562019, 8806896510487478352, 6533551228799195237, 13389502447794973829, 15065279868519608165, 10536769335197150641, 1322695487397776109, 15112974401160243995, 14778499304685795812, 2655893075036451977, 15172713941042952680, 13178742765486355260, 10387565380055278256, 1, 0, 0, 0, 1, 0, 18181589522906879612, 16462817036687190629, 13897413906888730423, 2444726075814550534, 13039263708530965818, 9767862146044075473, 16994104539161729445, 3295906456874767760, 16338446684875281086, 5238070817263862176, 11933451322373121057, 18163310674975357977, 3914062371738178895, 2639949635019592417, 3691450672437772660, 1, 0, 0, 0, 1, 0, 9441086471966058156, 0, 0, 3069389264726801426, 17714998603219848343, 3285997397792070136, 2327203233976270205, 4976836170739997781, 12287193162084105824, 4267926381848052110, 873880226830208445, 5002589281792664271, 8614894336467293783, 13436383826829479040, 12256855995572753726, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3979217445866956620, 14102459334756352921, 14473951691792990803, 8253253226048886083, 12319687016213027555, 13089916287630526229, 17044511642202081265, 6896812394605202475, 9256382872640968643, 14221135810103683560, 12080155723705641895, 7569214225554358494, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6693606464693965975, 13661835471193379756, 8827937223658185560, 11671578295265948239, 13490282225851742651, 1568845385281768860, 17370313250110904770, 2024842447089060639, 6570002101874463971, 11406071542091908609, 6767987840126452263, 1017686422583121037, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9525288177353527302, 3038016940647586670, 9698676695870635420, 14297456315487806992, 3371801902832234206, 982340402770608276, 13397257034080852565, 16625734836325714912, 3849537215181896567, 571586377235018247, 14392317091133450653, 10327407591150878848, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 3795543859124105201, 12910581729787565904, 17596568325206204932, 12512094004962322130, 5735281858523620986, 3013510715159483905, 7390177608867021213, 15025446886891081073, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15045917672181612303, 8184561966951183876, 1314981229280595867, 10051713503687926694, 10772660272533654046, 10088766553729725414, 8691876854061179148, 5989289390391757114, 3407397722647202213, 7941852203687681180, 4199208231896291776, 15233230393479930649, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3672327111134984977, 12431805880114311043, 1393532256400242982, 5258910437097366761, 3331697170176629084, 12574093635772317570, 2952350747126730564, 15670015339098587014, 13644814392425193274, 2987825311454433607, 6349271639347163621, 15702789941308523576, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11902001817992340801, 2986356007899077631, 13433705342207763738, 14031537229609682064, 602109730184155310, 5470069473511751658, 7968203687716298290, 12708827926449341197, 9689174787852538317, 185071303888742221, 5568595648257864309, 8819781861782654629, 1, 0, 0, 0, 1, 0, 9433051896879704986, 3790096704121066977, 7848157813885660720, 97480563262877602, 2836244341662188919, 12880831435259048250, 18190284629542346231, 16230148280330706633, 9645793732101008923, 6747517476428823928, 10159927950043513901, 15759480978611340324, 16140725249773135932, 10224931331962954075, 7112644758334533508, 1, 0, 0, 0, 1, 0, 12268806337265941227, 8766527133291152460, 4573212491205067738, 1451330498122947575, 13878284404078727054, 13732313223959877570, 4019409425675168575, 14888577262766439787, 7118521641278947238, 5699380547329532508, 9229756563573051371, 1502926046713635634, 11073859438158044651, 3706462809677116963, 10242380937000070843, 1, 0, 0, 0, 1, 0, 12264599910826326487, 4401672593088936956, 3287770912268324671, 8550984974115591347, 11905155073870025459, 15581584642080412492, 16642022229570326204, 4740702640077452126, 8228232126921631746, 6257583805205658612, 10107168241231917326, 4186763142475177793, 16536071023746429034, 4953509182438845792, 17015988684670402201, 1, 0, 0, 0, 1, 0, 10482044717877897468, 11338035720719303533, 15111143544560920122, 5779906183691085674, 5883496260565631343, 17424758021352066268, 6872649224968331273, 18294822284401514132, 14018593041447406970, 3295089823193122164, 12619661555644649350, 13163397875087894329, 12116759677655250999, 12872180446847298231, 10753966634497852319, 1, 0, 0, 0, 1, 0, 2142659226510195682, 8250976014423777012, 11550997137187900197, 7239115491427587826, 6214639496702145664, 13747770174448213841, 8363779881416372286, 18258193129875665644, 3929539690735302143, 7640632346113799527, 10501448523390229441, 575959985319833606, 8057038266027202789, 5675564903335979949, 17845322355197915738, 1, 0, 0, 0, 1, 0, 1980663272019683980, 16254047807534945359, 12731791925462422257, 8817470180767843173, 1035954869286151888, 10799815877710934765, 12949568200151355456, 17581484848263912285, 12655249523595546680, 5805413556949044653, 9960833320626690499, 8665485641724560922, 11146351406925299070, 13879671978791253311, 9689802115657313068, 1, 0, 0, 0, 1, 0, 2823715339336108463, 15599274894951921542, 4792471773839294427, 1023167627240586914, 12555736327846716176, 1619117325320043308, 18184433440084438609, 10658559677463134471, 9638171237357393134, 13312272456227001370, 2557094292829749679, 6384512333148749163, 13509558775822115028, 6737505022417937354, 7845909286502989649, 1, 0, 0, 0, 1, 0, 15590779242968047633, 0, 0, 12615841091071546269, 14389918991418187594, 6190024525131486611, 1586181560816232196, 1052908464763109826, 8064604530099592479, 11252467974344770686, 11951277814213817673, 7414754653220847914, 4751058192101309365, 10017226585432634212, 1196237303718990885, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15373572920503822367, 5150637797762075635, 17671950935398765622, 8020025137186066841, 4274762298296320367, 544627542347870852, 2629112354487966090, 13884819925875295975, 8368586536930615942, 15345629614104209519, 11893931769684808775, 5064625229425039166, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11769995123877236600, 11237118474907085960, 15303512720733905693, 13419225700498867773, 7383511416371792464, 11879905738846635842, 10128035487146424848, 1926379571595510347, 10138228048917253579, 1689963602473071179, 16471875099240353401, 12661189034561966549, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3762647969008011219, 11752652705714102353, 10727837149375754730, 13671651770198504476, 17305170235876004791, 5683487714952213815, 18233951381382816412, 5918588896905128530, 344980745193352015, 12869561156624962469, 9975926385796085953, 11511655067934063768, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 2200823396264285425, 8088984326603898052, 1751709948898726303, 3405979658670756574, 5644431973654019812, 12554030503530361323, 11231727832144176264, 11479359825177848513, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_18.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_18.snap index a5f0d94b28..75867bc4db 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_18.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_18.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 1, 65, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11182969138190702361, 11656, 91, 0, 0, 11182969138190702361, 41, 0, 11006573531383828351, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010], [1109628455053940361, 42, 1, 1, 1, 1109628455053940361, 0, 1, 10983413158656624898, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331], [13928676565061410159, 0, 0, 0, 0, 13928676565061410159, 0, 0, 4869282124135316831, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319], [297470094449022674, 0, 0, 0, 0, 297470094449022674, 0, 0, 5899798166361732461, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694], [11006573531383828351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [2, 2, 2, 1, 2, 2, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 3, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11182969138190702361, 16344194729581826754, 15045917672181612303, 3672327111134984977, 11902001817992340801, 97480563262877602, 1831626543952762702, 12062163654685913941, 1451330498122947575, 1742063333427513989, 2331114102915733339, 8550984974115591347, 8960841496031156142, 13720918668577423004, 5779906183691085674, 3198599991840782485, 13728843979899181292, 7239115491427587826, 12128894594351473931, 15480692841914867508, 8817470180767843173, 10548371713427919789, 10315264763691724912, 1023167627240586914, 3818953450339058320, 14941570263133670432, 12615841091071546269, 15435370781163068976, 15373572920503822367, 11769995123877236600, 3762647969008011219, 8269653645296248010, 11656, 117148, 6714198787893475936, 5262284953624879131, 6828048997998717653, 14647846255598321281, 12213957512096072087, 15486993862206988880, 9916068016290756984, 12311676223031039230, 6798558233575208094, 6061515485015027193, 9178825932447902299, 16451694760407086053, 9245574117575493602, 6706571375738621744, 5707941763645196550, 13553995817865937844, 18312867062271325792, 11246612591729350508, 8806896510487478352, 16014621579841168337, 6332183310159529150, 2444726075814550534, 13415483499482541228, 16602291456530418215, 3069389264726801426, 4940323642218861897, 3979217445866956620, 6693606464693965975, 9525288177353527302, 11182969138190702361, 41, 410, 8488924048752676071, 5473488137200086909, 16124688533662466636, 4527044298581192722, 16887055178922689595, 5249711198271717177, 15470787238396171217, 5632634005697013617, 7337408598993184022, 11147561538212402733, 9710911023591971572, 8752830793140649116, 11546140485006286209, 10738951369466640003, 2139663271495255306, 6135983205453599776, 17538856881976830392, 2031516987289365197, 17199894398730562705, 4010699482290892787, 3922552954514582360, 7369439734883755459, 108303794773646012, 14521269346803535153, 14515762120928230173, 13893962684375637966, 13610167819530098127, 11215445033353754262, 8081237365032914784, 11006573531383828351, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1109628455053940361, 12119768350776285319, 8184561966951183876, 12431805880114311043, 2986356007899077631, 2836244341662188919, 146796491816379180, 8696360259937422388, 13878284404078727054, 7667548888861073206, 9741377056638459459, 11905155073870025459, 9736056580211703764, 17352787150580200349, 5883496260565631343, 9594088066979877926, 9297041447863221537, 6214639496702145664, 2461170076272033096, 17112913798212225634, 1035954869286151888, 2140568550425483844, 10584986198873793665, 12555736327846716176, 12072441430913369009, 13906015856663078107, 14389918991418187594, 2676571742010508284, 5150637797762075635, 11237118474907085960, 11752652705714102353, 997682303299740331, 42, 93752, 18084035356118526352, 8386870944408484201, 18056918720989013854, 11520229540186073721, 5668756658695595711, 14109792997657353922, 12303762929371991135, 14460911410586037148, 12418445481638740107, 16455507557982986163, 18172284878038222122, 6352198309363971688, 9198509167958908347, 1068046269761257463, 16102483860755268671, 1544674922431042375, 9868836391822552540, 7915117918356788325, 6533551228799195237, 3992189811639127908, 9511948951280762358, 13039263708530965818, 708611914251242147, 4206064101444952505, 17714998603219848343, 13074430791784659712, 14102459334756352921, 13661835471193379756, 3038016940647586670, 1109628455053940361, 0, 328, 7132218559010351790, 2687466917280430353, 14170238607512888511, 5453168895411602323, 8679138582261878552, 10871515559850126217, 7649138216344653830, 12086029516113687059, 14609582285822867389, 7271583017513514692, 3821121937809044409, 3833100151978191712, 5702916883024911354, 3579138882391492892, 14347405124134927123, 9277341930384005575, 2993137622300793545, 13370802209879109056, 13653108884642243926, 8702782587703766612, 12945832125614510830, 15167316901472929028, 4608694219239856197, 4443739924303229750, 8611475648437961511, 1575864515244779062, 10900065459953722709, 9162692523043045302, 17462008412377898139, 10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13928676565061410159, 5375705730949115787, 1314981229280595867, 1393532256400242982, 13433705342207763738, 12880831435259048250, 10699055768478348083, 2470044642731141974, 13732313223959877570, 2078090264025450769, 3845297826200108779, 15581584642080412492, 11359623335937034504, 14549946302435322871, 17424758021352066268, 15472130290487345321, 13048555428151627244, 13747770174448213841, 9164669383091055648, 3250455247796114093, 10799815877710934765, 9086202890994770785, 12116339825079888992, 1619117325320043308, 16898959203497269575, 15756045849228969140, 6190024525131486611, 6215657966742979785, 17671950935398765622, 15303512720733905693, 10727837149375754730, 12907160815575155319, 0, 23564, 4199576522683349447, 16513391592299529611, 11415640949254272304, 16138036929710694921, 9992494271122179933, 3020772293084222765, 15625472986208536177, 12149624601412828429, 10735117276139490774, 13332197512776217968, 13474689739491604605, 13815225937039366706, 706573335075180235, 4097091053989040149, 693823183101411164, 5341110475237803180, 4368449439175744649, 7740607367180462177, 13389502447794973829, 6721164191334334250, 6997451158266748059, 9767862146044075473, 4778055569341029558, 10088175016132507812, 3285997397792070136, 10914182999248450193, 14473951691792990803, 8827937223658185560, 9698676695870635420, 13928676565061410159, 0, 82, 18152833202936203138, 10305147718805144715, 13246631902503555591, 18142351346900318359, 11971140429919100117, 6903484634638418138, 3098698980745497723, 3068992673894668202, 9164459936648953977, 11194864417357882388, 12005359455571366116, 12356306486226268709, 10059737158050223658, 17119982236602677307, 4225663824996553892, 17852936504841763737, 5778553506856942969, 9045001363359345866, 18423338781077887809, 2711240319770097821, 8346149567490270428, 9594540064387516595, 1859863665658604717, 16919987197409252682, 7809934763889573038, 12492597695329698922, 18341122838405415754, 11967784234256998242, 10761804868734649587, 4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [297470094449022674, 13535968261560526699, 10051713503687926694, 5258910437097366761, 14031537229609682064, 18190284629542346231, 4346004165604875907, 15375947702712472554, 4019409425675168575, 2064296209102051574, 17718639079388526425, 16642022229570326204, 1618478323171655450, 5998884876319667302, 6872649224968331273, 13753905356607269997, 7559241041198219519, 8363779881416372286, 2105649450986611656, 11644599807961994770, 12949568200151355456, 4366812189797744262, 9669235379242805159, 18184433440084438609, 13914998044815764482, 11325806379320193213, 1586181560816232196, 5920020313630770955, 8020025137186066841, 13419225700498867773, 13671651770198504476, 18024383338294781694, 0, 23396, 7560057297276955988, 7451013195867945919, 7468487593070852196, 5578183109591783882, 15747662796636990589, 2066701485189878406, 17025371161980089605, 4391959764977446152, 4985867595251695917, 6710066216774366729, 6241000701339836952, 4718440141936325382, 4986060230214018536, 5748634601882563491, 10896228304766504283, 6457499153671182820, 12270042173384394159, 11711065129605555908, 15065279868519608165, 17856220227797901726, 8953039722587792244, 16994104539161729445, 14670768895096516686, 14803898243742553487, 2327203233976270205, 17449705512918939747, 8253253226048886083, 11671578295265948239, 14297456315487806992, 297470094449022674, 0, 82, 302695496926486902, 16415403596737407938, 12969246825596557956, 15965643470182086386, 14881573336337548597, 2868629484750761697, 7317402970608805914, 2570537868338555591, 6697005353407257884, 5717939852331496040, 9408357527608003903, 8011884131194179594, 15942512744234440774, 9052662470595673790, 11913271961595885333, 15508051727969296111, 6269710669185644103, 12322255659000247132, 810875278274469351, 3499523055983644139, 9453749819048496107, 598273005722510655, 12338854942180141395, 2829445891916136836, 12653867244112536729, 4648827005364006908, 3153753366153954420, 12197142511433562971, 13557680898519201450, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11006573531383828351, 92579048505362891, 10772660272533654046, 3331697170176629084, 602109730184155310, 16230148280330706633, 6302091831624975391, 14001078336639287767, 14888577262766439787, 12258632680483319887, 7641862043593808385, 4740702640077452126, 8494032654039797119, 8314420015254970480, 18294822284401514132, 15552480182219334239, 908821363395967579, 18258193129875665644, 4226365574585037317, 3638253471537757569, 17581484848263912285, 6286301305761091621, 4777175749672661669, 10658559677463134471, 1417442037893012894, 7857622794514614671, 1052908464763109826, 4925127753504389599, 4274762298296320367, 7383511416371792464, 17305170235876004791, 2200823396264285425, 0, 58574, 18280076181055982575, 3965010120048981150, 1623299660155787797, 11930292174601709627, 17275008438838615802, 5756406115988630048, 17841510847136093686, 6729021181420822547, 1709787776185889305, 2022739540363098314, 5157634830695555269, 17099057016182449505, 4092740078069974091, 9582547144648304801, 4715310719341519129, 1597700055042697404, 480964694484615271, 56280064407246395, 10536769335197150641, 16099710145374622840, 3473101726323291593, 3295906456874767760, 716460020344690975, 10580825486552151036, 4976836170739997781, 16652319776094256449, 12319687016213027555, 13490282225851742651, 3371801902832234206, 3795543859124105201, 0, 205, 13622702382434675698, 8941567408770445183, 2168342371250989865, 17553704974699598306, 12818882650622055705, 16478401302589696546, 10652219805906948351, 13167156861512034068, 260666911081589986, 1428764500637505382, 2190433219200603887, 11999917547751101526, 2751093334206085539, 9318931023569054874, 16297727142514657495, 11875658036026604145, 5829323963705819601, 407792022339954638, 5684565403642367050, 13995368600016681288, 2845800306757116207, 5216498913603536417, 2411940295743487842, 2014066638340124975, 5258230180909223265, 17089893338044941808, 1124366766375746940, 9116801986360376826, 6650575029061305823, 4025036448660092914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 11859595567907759997, 10088766553729725414, 12574093635772317570, 5470069473511751658, 9645793732101008923, 1476556243604239385, 17933040757673393353, 7118521641278947238, 7588084371428510216, 12191494749556797391, 8228232126921631746, 15226641263820888277, 4239012011479875368, 14018593041447406970, 3541695062587160892, 11116896887234129281, 3929539690735302143, 11203930352796078636, 8751959587369085991, 12655249523595546680, 16379258612200834026, 9984807922535170831, 9638171237357393134, 12191893464144837018, 4677785078090407332, 8064604530099592479, 10076433135196495423, 544627542347870852, 11879905738846635842, 5683487714952213815, 8088984326603898052, 0, 46876, 15125170292333450443, 7072657932567702059, 10475291980250876467, 14632109792663117375, 18379882203306053694, 10250239327737538260, 11537033439839832588, 15180883293806522386, 18285674122603938406, 16116176887352657770, 15068074760365493774, 10507624248254584461, 7669544778380245671, 16424767991328560142, 16771797144770177609, 4105927596877687309, 7519344916607985067, 16277772212475505196, 1322695487397776109, 8302446182097155523, 14744324883381489574, 16338446684875281086, 5703860549203085948, 14077533030564871132, 12287193162084105824, 2535384450001991464, 13089916287630526229, 1568845385281768860, 982340402770608276, 12910581729787565904, 0, 164, 6093021124582015914, 375332441348258328, 16597900739273350797, 16788616498952461620, 10323894478242846558, 3730474644926313294, 17377183878976452334, 12746711269593150718, 13699107349734059694, 421533440407219618, 15109303318896079214, 17746438429032263850, 13224617406323308041, 5646455969610140563, 12626985742338481481, 14497665384991648640, 13894375308737560134, 3268393834564630675, 13312171511942754529, 611321250913478210, 12048873764879264902, 5334026694118161468, 14360341460112568406, 17654490467796517057, 1299716947845207044, 7609683397541157642, 14709808073905360012, 11742139955633481423, 13522070698443062110, 12847434483856017691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 10293244464294212936, 8691876854061179148, 2952350747126730564, 7968203687716298290, 6747517476428823928, 16731591574836256879, 12286682322909052293, 5699380547329532508, 8774011841981167612, 10988677337017809219, 6257583805205658612, 8595550098696265772, 17321901905145630028, 3295089823193122164, 6581488060195755410, 6329516418872359771, 7640632346113799527, 10454000694343684461, 15867346750604392587, 5805413556949044653, 9247297947852762648, 13748015074908171216, 13312272456227001370, 5054807356361880835, 1012271632864570722, 11252467974344770686, 492886975717156403, 2629112354487966090, 10128035487146424848, 18233951381382816412, 1751709948898726303, 0, 11782, 6055246182589913733, 15015595405278911690, 2209046468675768902, 16429197663637467330, 15810134098389081544, 9588791733994120847, 18370261572729563296, 7006788971063612777, 7962515674056117045, 15223121510830934757, 15872454912771340895, 1486059252283823706, 3912605942422700262, 4173681472723400357, 2922691200579275072, 7112424425452913463, 17213377378328786151, 6274713241106982122, 15112974401160243995, 17175975930045398893, 5467280291812001242, 5238070817263862176, 17584445990298638069, 171514605620090783, 4267926381848052110, 9011064139813451706, 17044511642202081265, 17370313250110904770, 13397257034080852565, 17596568325206204932, 0, 41, 9617260353707541367, 9187825164453421957, 17649953659489375797, 6396310504287885774, 17019569090864760371, 870218876784769460, 17213560015461715510, 16812494438448165271, 15885717661613279263, 2958950328581697287, 14311601477626423214, 12599125587081655507, 12078599565132475515, 3332808335850364509, 374688056722968094, 5591521890390007231, 9584980789501913045, 4066644474875437132, 17728945623551220217, 1158050506628066296, 3730734784735709807, 10671987699715228843, 3173999018565335463, 14949604462817069254, 11653871972148380806, 312408327658285690, 8531928004921347162, 98858158429688394, 6167334615107562354, 1234843923022284190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 2163003956713638315, 5989289390391757114, 15670015339098587014, 12708827926449341197, 10159927950043513901, 15395056832871965886, 17405960500607097380, 9229756563573051371, 1186079292937331145, 13463816706671585562, 10107168241231917326, 8534001612601599401, 12790948878158723266, 12619661555644649350, 11614101867080583800, 11255619179741810030, 10501448523390229441, 16971746085380600175, 7173352752193758542, 9960833320626690499, 3507659370538431093, 6846598866105961944, 2557094292829749679, 11416743759689580593, 12182449258645699464, 11951277814213817673, 10567677969346318078, 13884819925875295975, 1926379571595510347, 5918588896905128530, 3405979658670756574, 0, 11698, 8146055133796963630, 4724864404296433607, 10453305271538430204, 17141108237620938331, 16113292978122689735, 14630852758047225712, 16936235645680974811, 640959767495035790, 11162248672474783185, 10618808740372936561, 12973220127719589473, 13223353016814262874, 17652411276563186968, 10141330567980253051, 1770876161367154023, 12442058685904907795, 12986633647641209886, 5384244903407669612, 14778499304685795812, 8054814913234770610, 8358166993767322841, 11933451322373121057, 17795028935448509068, 11142588879850986282, 873880226830208445, 11017896854604878841, 6896812394605202475, 2024842447089060639, 16625734836325714912, 12512094004962322130, 0, 41, 12529483521877137515, 4671467226762388980, 13873740979092621907, 12847173262736205772, 2640423636460273022, 8374058502362870155, 7630996533587302384, 3556075572123538464, 8078558398785937163, 5856098383496092000, 7999607615804135893, 15509992149354799776, 13785560116650003734, 8358196300413379173, 10412508239405514928, 7840142081125036731, 18075062342410207477, 18173191150607640442, 2133036585496843963, 8931901040624025193, 9454731621283026961, 5837806564591410604, 5850596656185029719, 296117354535505751, 8985195681813998404, 1975947551471322175, 12041110943945791333, 11648250496545232642, 7830634726555216225, 5266777994490151623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11627839282500592134, 3407397722647202213, 13644814392425193274, 9689174787852538317, 15759480978611340324, 10073546228149283602, 8090878949578096073, 1502926046713635634, 7624167193861818791, 10274257988202953339, 4186763142475177793, 6025425965090069083, 8194342163688078130, 13163397875087894329, 5161390927343581791, 10103251159424454395, 575959985319833606, 13175926157437524595, 8928028362497258488, 8665485641724560922, 15570929820685955587, 6150675652390666890, 6384512333148749163, 35921027791486524, 3229184449291625000, 7414754653220847914, 11347301099028602515, 8368586536930615942, 10138228048917253579, 344980745193352015, 5644431973654019812, 0, 58574, 12761879591277148733, 3794756304714494565, 10919382803049057886, 13927811434585922718, 8315847055470475708, 10095847089706649983, 41153506376499461, 5529807447506440005, 72892344713547594, 18362204307013225363, 527610602670466995, 14772158556567070690, 9538491437159792328, 1580498045195806896, 8297535568256810268, 13797917351588149895, 1651894826575892086, 13380716913143325871, 2655893075036451977, 3750342908258071259, 18231595474498119868, 18163310674975357977, 2371603174180061555, 6433509503768865899, 5002589281792664271, 10946433388588585987, 9256382872640968643, 6570002101874463971, 3849537215181896567, 5735281858523620986, 0, 205, 7876112718273244024, 1276143811675585923, 9993912342918529935, 16999254614849428545, 8194747920293058753, 11171758628037424552, 8208119826419095432, 5568149314099479773, 17551537772960996556, 12651683228606533001, 13584145944854843210, 12212300608708011466, 18102951610480561318, 14720258372954226591, 15448472262117068008, 10575290756167155008, 11997391634424499349, 9879556170680135793, 12373753045781314057, 9529470285212177396, 10620662102176580756, 10199402949196411787, 9825825353570660203, 18337390924518345383, 15945306792731206141, 10537181099344133724, 5505106000120813030, 14774803975376978777, 14575654492591748955, 8207377881872409730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 1844206616423154361, 7941852203687681180, 2987825311454433607, 185071303888742221, 16140725249773135932, 13486449309893009073, 13471170357015645210, 11073859438158044651, 16507211018434913458, 4066228076398875428, 16536071023746429034, 10818247459046542341, 4392853051950044706, 12116759677655250999, 17293580330275603290, 2376540144284705519, 8057038266027202789, 15097730100005395027, 3583575859544955648, 11146351406925299070, 13473187462927502829, 8056538798141691018, 13509558775822115028, 6797301950091310335, 8773981691004278165, 4751058192101309365, 10661116978196100999, 15345629614104209519, 1689963602473071179, 12869561156624962469, 12554030503530361323, 0, 46876, 4789346784708035796, 9438751512570250357, 447952077691938652, 6351356675900770483, 4868676530510485341, 3192437812250556397, 11511034416225137032, 15380266628173325649, 10700144984876703355, 12230522212327928379, 15526804358639727019, 6410705682507666807, 15728916292645010880, 13992590038292222154, 1916422775943772979, 8280685582260709248, 12515254706968408232, 4845996266408136556, 15172713941042952680, 2233761585242005099, 13227100893355110663, 3914062371738178895, 7843298541359739176, 8386193964610423744, 8614894336467293783, 8834991867772635266, 14221135810103683560, 11406071542091908609, 571586377235018247, 3013510715159483905, 0, 164, 14482187202392982684, 17682350329754313417, 66214439016909251, 7504629639084879386, 11708178258767948919, 188011405648496761, 10242982970375452289, 16510140404231294235, 13381084464566932690, 9239012175869487665, 9339694231140180875, 9917181315244873380, 17448534469581521177, 4965043893766771965, 13305445405772227224, 6963375374275021656, 4554518835153561582, 1694446457415578298, 4604616361036784646, 11439774970058559661, 10784225701912607868, 17782855612978839775, 13368223431578003475, 18100595786373494652, 12753204151452870283, 17504098334052422651, 12896535568794110034, 7402084190222773115, 598469278842686486, 5912604878679295331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11371898088219304696, 4199208231896291776, 6349271639347163621, 5568595648257864309, 10224931331962954075, 8046167029187450402, 6585148777263545478, 3706462809677116963, 12578093594063946501, 11334181120248394313, 4953509182438845792, 4130560513564095433, 6665409895959715593, 12872180446847298231, 11452171012153290342, 5729159829892489539, 5675564903335979949, 14158677720471443076, 12300968791182495713, 13879671978791253311, 14820104759072107152, 17585955671327967478, 6737505022417937354, 17454985371239394211, 15749874646256262769, 10017226585432634212, 8893160827421013787, 11893931769684808775, 16471875099240353401, 9975926385796085953, 11231727832144176264, 0, 11782, 6351111885067026894, 14086295994708840477, 3142920623105062021, 4317195510637014184, 16341148873550430347, 8014762585425506108, 12977978004680762325, 15318810920503136316, 9472517513827583818, 211962335804367550, 14931353145911604525, 9340212215573419915, 5244269534978718672, 1584128384101705476, 4460891295949496863, 14654598206063183317, 13555452196222133132, 17680908597379218579, 13178742765486355260, 3964993209073179108, 4213917162333386044, 2639949635019592417, 3300803743280888923, 12914222891103397086, 13436383826829479040, 7004576641630317963, 12080155723705641895, 6767987840126452263, 14392317091133450653, 7390177608867021213, 0, 41, 3800418813655617572, 14503408479575576010, 10553169970007645345, 4946745422622378051, 7127828976000219721, 2687285609278369395, 16630221959750548176, 1114885198959805561, 3895092647933222339, 9831397389014117600, 12816842684293233323, 1779119880742935864, 17663607747965229138, 5382558247959552902, 11972955750871888364, 16616426694032134438, 9711126273890628516, 376576173107709408, 12451218545182255865, 14301764572821220192, 13209253693600827240, 5745169166190656073, 12916752429524642864, 14463770325561420619, 7870235520772452232, 13278341252249613603, 5432056100901092307, 8994645443800925562, 5908996313982662075, 1494658977663487041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 17530820119034444668, 15233230393479930649, 15702789941308523576, 8819781861782654629, 7112644758334533508, 2549387492966523460, 15838339720324898846, 10242380937000070843, 1124701407395854549, 5706112669062280829, 17015988684670402201, 12671109438456697877, 15652595419009785355, 10753966634497852319, 3622124053041186910, 2063695485301676711, 17845322355197915738, 9894091605930112348, 10822348040176532279, 9689802115657313068, 6759722828145755337, 9479044480226984785, 7845909286502989649, 560081323074218824, 16017591174163981005, 1196237303718990885, 6783304352365897531, 5064625229425039166, 12661189034561966549, 11511655067934063768, 11479359825177848513, 0, 11698, 2084118884093035279, 16979859941949546961, 1454299506056429821, 9658643065222637557, 11605485146349749283, 13057696629474024230, 16650374201325163722, 7457309320444728046, 1243843599995756274, 17176177262691414244, 14152683925184093692, 198845790532099135, 442435874165139119, 1462611314767788334, 3462067515008653152, 4141759445261917472, 12323330957750482072, 14922731139272985797, 10387565380055278256, 9531386257124273696, 9539285450074189441, 3691450672437772660, 12463184698711878632, 4858502687517999226, 12256855995572753726, 9245347314341240247, 7569214225554358494, 1017686422583121037, 10327407591150878848, 15025446886891081073, 0, 41, 13092032916490151270, 2856458557507854671, 14059661153766146178, 1724041303048776424, 7119687853704366589, 3699246950542313036, 8338994289155538949, 7732171807197958061, 10653644351656999339, 15262849800927670044, 6132373490633371091, 16473831322001214578, 12928938600331453669, 6959935525856744214, 17173069020016176920, 6747622983845354522, 2484033613426731933, 9879916419081378373, 4275250202523893223, 5995505684018086986, 16115855409799741127, 2490003355474156145, 10034475279304353355, 7223217715426381376, 10334063888823214988, 2139000562522371457, 18314119367638727156, 15311716904301189063, 894706229073498557, 1570146104298050273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 96, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 5, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 6, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 7, 0, 0, 0, 0, 0, 5, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 8, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 2200823396264285425, 8088984326603898052, 1751709948898726303, 3405979658670756574, 5644431973654019812, 12554030503530361323, 11231727832144176264, 11479359825177848513, 0, 0, 1, 0, 0, 1, 1, 0, 0, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 3795543859124105201, 12910581729787565904, 17596568325206204932, 12512094004962322130, 5735281858523620986, 3013510715159483905, 7390177608867021213, 15025446886891081073, 0, 0, 1, 0, 0, 1, 1, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8488924048752676071, 7132218559010351790, 18152833202936203138, 302695496926486902, 13622702382434675698, 6093021124582015914, 9617260353707541367, 12529483521877137515, 7876112718273244024, 14482187202392982684, 3800418813655617572, 13092032916490151270, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5473488137200086909, 2687466917280430353, 10305147718805144715, 16415403596737407938, 8941567408770445183, 375332441348258328, 9187825164453421957, 4671467226762388980, 1276143811675585923, 17682350329754313417, 14503408479575576010, 2856458557507854671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16124688533662466636, 14170238607512888511, 13246631902503555591, 12969246825596557956, 2168342371250989865, 16597900739273350797, 17649953659489375797, 13873740979092621907, 9993912342918529935, 66214439016909251, 10553169970007645345, 14059661153766146178, 1, 0, 0, 0, 1, 0, 15754956633454945151, 6055713190940499638, 11077250730155763388, 4527044298581192722, 5453168895411602323, 18142351346900318359, 15965643470182086386, 17553704974699598306, 16788616498952461620, 6396310504287885774, 12847173262736205772, 16999254614849428545, 7504629639084879386, 4946745422622378051, 1724041303048776424, 1, 0, 0, 0, 1, 0, 5043375237696906583, 4379507338442738151, 10191347065326962634, 15470787238396171217, 7649138216344653830, 3098698980745497723, 7317402970608805914, 10652219805906948351, 17377183878976452334, 17213560015461715510, 7630996533587302384, 8208119826419095432, 10242982970375452289, 16630221959750548176, 8338994289155538949, 1, 0, 0, 0, 1, 0, 27564165777955823, 2554423200420703486, 17579160449292996896, 11147561538212402733, 7271583017513514692, 11194864417357882388, 5717939852331496040, 1428764500637505382, 421533440407219618, 2958950328581697287, 5856098383496092000, 12651683228606533001, 9239012175869487665, 9831397389014117600, 15262849800927670044, 1, 0, 0, 0, 1, 0, 12554774560852918121, 7558057668449617622, 8341229243444900158, 11546140485006286209, 5702916883024911354, 10059737158050223658, 15942512744234440774, 2751093334206085539, 13224617406323308041, 12078599565132475515, 13785560116650003734, 18102951610480561318, 17448534469581521177, 17663607747965229138, 12928938600331453669, 1, 0, 0, 0, 1, 0, 6754601476785640702, 7736060991620510625, 1449884785010881379, 6135983205453599776, 9277341930384005575, 17852936504841763737, 15508051727969296111, 11875658036026604145, 14497665384991648640, 5591521890390007231, 7840142081125036731, 10575290756167155008, 6963375374275021656, 16616426694032134438, 6747622983845354522, 1, 0, 0, 0, 1, 0, 7929723072429044254, 16334448815751507577, 4434638168235316685, 17199894398730562705, 13653108884642243926, 18423338781077887809, 810875278274469351, 5684565403642367050, 13312171511942754529, 17728945623551220217, 2133036585496843963, 12373753045781314057, 4604616361036784646, 12451218545182255865, 4275250202523893223, 1, 0, 0, 0, 1, 0, 8602814005182217200, 9971451726661298505, 15671763834046105438, 7369439734883755459, 15167316901472929028, 9594540064387516595, 598273005722510655, 5216498913603536417, 5334026694118161468, 10671987699715228843, 5837806564591410604, 10199402949196411787, 17782855612978839775, 5745169166190656073, 2490003355474156145, 1, 0, 0, 0, 1, 0, 1420030357616461150, 0, 0, 14515762120928230173, 8611475648437961511, 7809934763889573038, 12653867244112536729, 5258230180909223265, 1299716947845207044, 11653871972148380806, 8985195681813998404, 15945306792731206141, 12753204151452870283, 7870235520772452232, 10334063888823214988, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13610167819530098127, 10900065459953722709, 18341122838405415754, 3153753366153954420, 1124366766375746940, 14709808073905360012, 8531928004921347162, 12041110943945791333, 5505106000120813030, 12896535568794110034, 5432056100901092307, 18314119367638727156, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11215445033353754262, 9162692523043045302, 11967784234256998242, 12197142511433562971, 9116801986360376826, 11742139955633481423, 98858158429688394, 11648250496545232642, 14774803975376978777, 7402084190222773115, 8994645443800925562, 15311716904301189063, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8081237365032914784, 17462008412377898139, 10761804868734649587, 13557680898519201450, 6650575029061305823, 13522070698443062110, 6167334615107562354, 7830634726555216225, 14575654492591748955, 598469278842686486, 5908996313982662075, 894706229073498557, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6714198787893475936, 18084035356118526352, 4199576522683349447, 7560057297276955988, 18280076181055982575, 15125170292333450443, 6055246182589913733, 8146055133796963630, 12761879591277148733, 4789346784708035796, 6351111885067026894, 2084118884093035279, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5262284953624879131, 8386870944408484201, 16513391592299529611, 7451013195867945919, 3965010120048981150, 7072657932567702059, 15015595405278911690, 4724864404296433607, 3794756304714494565, 9438751512570250357, 14086295994708840477, 16979859941949546961, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6828048997998717653, 18056918720989013854, 11415640949254272304, 7468487593070852196, 1623299660155787797, 10475291980250876467, 2209046468675768902, 10453305271538430204, 10919382803049057886, 447952077691938652, 3142920623105062021, 1454299506056429821, 1, 0, 0, 0, 1, 0, 11959032640791191427, 13666984456735322931, 12430950944235583873, 14647846255598321281, 11520229540186073721, 16138036929710694921, 5578183109591783882, 11930292174601709627, 14632109792663117375, 16429197663637467330, 17141108237620938331, 13927811434585922718, 6351356675900770483, 4317195510637014184, 9658643065222637557, 1, 0, 0, 0, 1, 0, 3078434273127823899, 5753377056128261292, 7043657405344780329, 9916068016290756984, 12303762929371991135, 15625472986208536177, 17025371161980089605, 17841510847136093686, 11537033439839832588, 18370261572729563296, 16936235645680974811, 41153506376499461, 11511034416225137032, 12977978004680762325, 16650374201325163722, 1, 0, 0, 0, 1, 0, 16093488747192154823, 9136889811217566327, 15238340014812686010, 6061515485015027193, 16455507557982986163, 13332197512776217968, 6710066216774366729, 2022739540363098314, 16116176887352657770, 15223121510830934757, 10618808740372936561, 18362204307013225363, 12230522212327928379, 211962335804367550, 17176177262691414244, 1, 0, 0, 0, 1, 0, 17584045558346364245, 8021141784340784171, 17538920393594018726, 9245574117575493602, 9198509167958908347, 706573335075180235, 4986060230214018536, 4092740078069974091, 7669544778380245671, 3912605942422700262, 17652411276563186968, 9538491437159792328, 15728916292645010880, 5244269534978718672, 442435874165139119, 1, 0, 0, 0, 1, 0, 3172838986399921646, 14996615673828945713, 2968596499138535119, 13553995817865937844, 1544674922431042375, 5341110475237803180, 6457499153671182820, 1597700055042697404, 4105927596877687309, 7112424425452913463, 12442058685904907795, 13797917351588149895, 8280685582260709248, 14654598206063183317, 4141759445261917472, 1, 0, 0, 0, 1, 0, 18432037966602915394, 11157278412179636212, 3333037102311562019, 8806896510487478352, 6533551228799195237, 13389502447794973829, 15065279868519608165, 10536769335197150641, 1322695487397776109, 15112974401160243995, 14778499304685795812, 2655893075036451977, 15172713941042952680, 13178742765486355260, 10387565380055278256, 1, 0, 0, 0, 1, 0, 18181589522906879612, 16462817036687190629, 13897413906888730423, 2444726075814550534, 13039263708530965818, 9767862146044075473, 16994104539161729445, 3295906456874767760, 16338446684875281086, 5238070817263862176, 11933451322373121057, 18163310674975357977, 3914062371738178895, 2639949635019592417, 3691450672437772660, 1, 0, 0, 0, 1, 0, 9441086471966058156, 0, 0, 3069389264726801426, 17714998603219848343, 3285997397792070136, 2327203233976270205, 4976836170739997781, 12287193162084105824, 4267926381848052110, 873880226830208445, 5002589281792664271, 8614894336467293783, 13436383826829479040, 12256855995572753726, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3979217445866956620, 14102459334756352921, 14473951691792990803, 8253253226048886083, 12319687016213027555, 13089916287630526229, 17044511642202081265, 6896812394605202475, 9256382872640968643, 14221135810103683560, 12080155723705641895, 7569214225554358494, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6693606464693965975, 13661835471193379756, 8827937223658185560, 11671578295265948239, 13490282225851742651, 1568845385281768860, 17370313250110904770, 2024842447089060639, 6570002101874463971, 11406071542091908609, 6767987840126452263, 1017686422583121037, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9525288177353527302, 3038016940647586670, 9698676695870635420, 14297456315487806992, 3371801902832234206, 982340402770608276, 13397257034080852565, 16625734836325714912, 3849537215181896567, 571586377235018247, 14392317091133450653, 10327407591150878848, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 3795543859124105201, 12910581729787565904, 17596568325206204932, 12512094004962322130, 5735281858523620986, 3013510715159483905, 7390177608867021213, 15025446886891081073, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15045917672181612303, 8184561966951183876, 1314981229280595867, 10051713503687926694, 10772660272533654046, 10088766553729725414, 8691876854061179148, 5989289390391757114, 3407397722647202213, 7941852203687681180, 4199208231896291776, 15233230393479930649, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3672327111134984977, 12431805880114311043, 1393532256400242982, 5258910437097366761, 3331697170176629084, 12574093635772317570, 2952350747126730564, 15670015339098587014, 13644814392425193274, 2987825311454433607, 6349271639347163621, 15702789941308523576, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11902001817992340801, 2986356007899077631, 13433705342207763738, 14031537229609682064, 602109730184155310, 5470069473511751658, 7968203687716298290, 12708827926449341197, 9689174787852538317, 185071303888742221, 5568595648257864309, 8819781861782654629, 1, 0, 0, 0, 1, 0, 9433051896879704986, 3790096704121066977, 7848157813885660720, 97480563262877602, 2836244341662188919, 12880831435259048250, 18190284629542346231, 16230148280330706633, 9645793732101008923, 6747517476428823928, 10159927950043513901, 15759480978611340324, 16140725249773135932, 10224931331962954075, 7112644758334533508, 1, 0, 0, 0, 1, 0, 12268806337265941227, 8766527133291152460, 4573212491205067738, 1451330498122947575, 13878284404078727054, 13732313223959877570, 4019409425675168575, 14888577262766439787, 7118521641278947238, 5699380547329532508, 9229756563573051371, 1502926046713635634, 11073859438158044651, 3706462809677116963, 10242380937000070843, 1, 0, 0, 0, 1, 0, 12264599910826326487, 4401672593088936956, 3287770912268324671, 8550984974115591347, 11905155073870025459, 15581584642080412492, 16642022229570326204, 4740702640077452126, 8228232126921631746, 6257583805205658612, 10107168241231917326, 4186763142475177793, 16536071023746429034, 4953509182438845792, 17015988684670402201, 1, 0, 0, 0, 1, 0, 10482044717877897468, 11338035720719303533, 15111143544560920122, 5779906183691085674, 5883496260565631343, 17424758021352066268, 6872649224968331273, 18294822284401514132, 14018593041447406970, 3295089823193122164, 12619661555644649350, 13163397875087894329, 12116759677655250999, 12872180446847298231, 10753966634497852319, 1, 0, 0, 0, 1, 0, 2142659226510195682, 8250976014423777012, 11550997137187900197, 7239115491427587826, 6214639496702145664, 13747770174448213841, 8363779881416372286, 18258193129875665644, 3929539690735302143, 7640632346113799527, 10501448523390229441, 575959985319833606, 8057038266027202789, 5675564903335979949, 17845322355197915738, 1, 0, 0, 0, 1, 0, 1980663272019683980, 16254047807534945359, 12731791925462422257, 8817470180767843173, 1035954869286151888, 10799815877710934765, 12949568200151355456, 17581484848263912285, 12655249523595546680, 5805413556949044653, 9960833320626690499, 8665485641724560922, 11146351406925299070, 13879671978791253311, 9689802115657313068, 1, 0, 0, 0, 1, 0, 2823715339336108463, 15599274894951921542, 4792471773839294427, 1023167627240586914, 12555736327846716176, 1619117325320043308, 18184433440084438609, 10658559677463134471, 9638171237357393134, 13312272456227001370, 2557094292829749679, 6384512333148749163, 13509558775822115028, 6737505022417937354, 7845909286502989649, 1, 0, 0, 0, 1, 0, 15590779242968047633, 0, 0, 12615841091071546269, 14389918991418187594, 6190024525131486611, 1586181560816232196, 1052908464763109826, 8064604530099592479, 11252467974344770686, 11951277814213817673, 7414754653220847914, 4751058192101309365, 10017226585432634212, 1196237303718990885, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15373572920503822367, 5150637797762075635, 17671950935398765622, 8020025137186066841, 4274762298296320367, 544627542347870852, 2629112354487966090, 13884819925875295975, 8368586536930615942, 15345629614104209519, 11893931769684808775, 5064625229425039166, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11769995123877236600, 11237118474907085960, 15303512720733905693, 13419225700498867773, 7383511416371792464, 11879905738846635842, 10128035487146424848, 1926379571595510347, 10138228048917253579, 1689963602473071179, 16471875099240353401, 12661189034561966549, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3762647969008011219, 11752652705714102353, 10727837149375754730, 13671651770198504476, 17305170235876004791, 5683487714952213815, 18233951381382816412, 5918588896905128530, 344980745193352015, 12869561156624962469, 9975926385796085953, 11511655067934063768, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 2200823396264285425, 8088984326603898052, 1751709948898726303, 3405979658670756574, 5644431973654019812, 12554030503530361323, 11231727832144176264, 11479359825177848513, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_19.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_19.snap index a5f0d94b28..75867bc4db 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_19.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_19.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 1, 65, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11182969138190702361, 11656, 91, 0, 0, 11182969138190702361, 41, 0, 11006573531383828351, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010, 8269653645296248010], [1109628455053940361, 42, 1, 1, 1, 1109628455053940361, 0, 1, 10983413158656624898, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331, 997682303299740331], [13928676565061410159, 0, 0, 0, 0, 13928676565061410159, 0, 0, 4869282124135316831, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319, 12907160815575155319], [297470094449022674, 0, 0, 0, 0, 297470094449022674, 0, 0, 5899798166361732461, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694, 18024383338294781694], [11006573531383828351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [2, 2, 2, 1, 2, 2, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 3, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [11182969138190702361, 16344194729581826754, 15045917672181612303, 3672327111134984977, 11902001817992340801, 97480563262877602, 1831626543952762702, 12062163654685913941, 1451330498122947575, 1742063333427513989, 2331114102915733339, 8550984974115591347, 8960841496031156142, 13720918668577423004, 5779906183691085674, 3198599991840782485, 13728843979899181292, 7239115491427587826, 12128894594351473931, 15480692841914867508, 8817470180767843173, 10548371713427919789, 10315264763691724912, 1023167627240586914, 3818953450339058320, 14941570263133670432, 12615841091071546269, 15435370781163068976, 15373572920503822367, 11769995123877236600, 3762647969008011219, 8269653645296248010, 11656, 117148, 6714198787893475936, 5262284953624879131, 6828048997998717653, 14647846255598321281, 12213957512096072087, 15486993862206988880, 9916068016290756984, 12311676223031039230, 6798558233575208094, 6061515485015027193, 9178825932447902299, 16451694760407086053, 9245574117575493602, 6706571375738621744, 5707941763645196550, 13553995817865937844, 18312867062271325792, 11246612591729350508, 8806896510487478352, 16014621579841168337, 6332183310159529150, 2444726075814550534, 13415483499482541228, 16602291456530418215, 3069389264726801426, 4940323642218861897, 3979217445866956620, 6693606464693965975, 9525288177353527302, 11182969138190702361, 41, 410, 8488924048752676071, 5473488137200086909, 16124688533662466636, 4527044298581192722, 16887055178922689595, 5249711198271717177, 15470787238396171217, 5632634005697013617, 7337408598993184022, 11147561538212402733, 9710911023591971572, 8752830793140649116, 11546140485006286209, 10738951369466640003, 2139663271495255306, 6135983205453599776, 17538856881976830392, 2031516987289365197, 17199894398730562705, 4010699482290892787, 3922552954514582360, 7369439734883755459, 108303794773646012, 14521269346803535153, 14515762120928230173, 13893962684375637966, 13610167819530098127, 11215445033353754262, 8081237365032914784, 11006573531383828351, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1109628455053940361, 12119768350776285319, 8184561966951183876, 12431805880114311043, 2986356007899077631, 2836244341662188919, 146796491816379180, 8696360259937422388, 13878284404078727054, 7667548888861073206, 9741377056638459459, 11905155073870025459, 9736056580211703764, 17352787150580200349, 5883496260565631343, 9594088066979877926, 9297041447863221537, 6214639496702145664, 2461170076272033096, 17112913798212225634, 1035954869286151888, 2140568550425483844, 10584986198873793665, 12555736327846716176, 12072441430913369009, 13906015856663078107, 14389918991418187594, 2676571742010508284, 5150637797762075635, 11237118474907085960, 11752652705714102353, 997682303299740331, 42, 93752, 18084035356118526352, 8386870944408484201, 18056918720989013854, 11520229540186073721, 5668756658695595711, 14109792997657353922, 12303762929371991135, 14460911410586037148, 12418445481638740107, 16455507557982986163, 18172284878038222122, 6352198309363971688, 9198509167958908347, 1068046269761257463, 16102483860755268671, 1544674922431042375, 9868836391822552540, 7915117918356788325, 6533551228799195237, 3992189811639127908, 9511948951280762358, 13039263708530965818, 708611914251242147, 4206064101444952505, 17714998603219848343, 13074430791784659712, 14102459334756352921, 13661835471193379756, 3038016940647586670, 1109628455053940361, 0, 328, 7132218559010351790, 2687466917280430353, 14170238607512888511, 5453168895411602323, 8679138582261878552, 10871515559850126217, 7649138216344653830, 12086029516113687059, 14609582285822867389, 7271583017513514692, 3821121937809044409, 3833100151978191712, 5702916883024911354, 3579138882391492892, 14347405124134927123, 9277341930384005575, 2993137622300793545, 13370802209879109056, 13653108884642243926, 8702782587703766612, 12945832125614510830, 15167316901472929028, 4608694219239856197, 4443739924303229750, 8611475648437961511, 1575864515244779062, 10900065459953722709, 9162692523043045302, 17462008412377898139, 10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13928676565061410159, 5375705730949115787, 1314981229280595867, 1393532256400242982, 13433705342207763738, 12880831435259048250, 10699055768478348083, 2470044642731141974, 13732313223959877570, 2078090264025450769, 3845297826200108779, 15581584642080412492, 11359623335937034504, 14549946302435322871, 17424758021352066268, 15472130290487345321, 13048555428151627244, 13747770174448213841, 9164669383091055648, 3250455247796114093, 10799815877710934765, 9086202890994770785, 12116339825079888992, 1619117325320043308, 16898959203497269575, 15756045849228969140, 6190024525131486611, 6215657966742979785, 17671950935398765622, 15303512720733905693, 10727837149375754730, 12907160815575155319, 0, 23564, 4199576522683349447, 16513391592299529611, 11415640949254272304, 16138036929710694921, 9992494271122179933, 3020772293084222765, 15625472986208536177, 12149624601412828429, 10735117276139490774, 13332197512776217968, 13474689739491604605, 13815225937039366706, 706573335075180235, 4097091053989040149, 693823183101411164, 5341110475237803180, 4368449439175744649, 7740607367180462177, 13389502447794973829, 6721164191334334250, 6997451158266748059, 9767862146044075473, 4778055569341029558, 10088175016132507812, 3285997397792070136, 10914182999248450193, 14473951691792990803, 8827937223658185560, 9698676695870635420, 13928676565061410159, 0, 82, 18152833202936203138, 10305147718805144715, 13246631902503555591, 18142351346900318359, 11971140429919100117, 6903484634638418138, 3098698980745497723, 3068992673894668202, 9164459936648953977, 11194864417357882388, 12005359455571366116, 12356306486226268709, 10059737158050223658, 17119982236602677307, 4225663824996553892, 17852936504841763737, 5778553506856942969, 9045001363359345866, 18423338781077887809, 2711240319770097821, 8346149567490270428, 9594540064387516595, 1859863665658604717, 16919987197409252682, 7809934763889573038, 12492597695329698922, 18341122838405415754, 11967784234256998242, 10761804868734649587, 4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [297470094449022674, 13535968261560526699, 10051713503687926694, 5258910437097366761, 14031537229609682064, 18190284629542346231, 4346004165604875907, 15375947702712472554, 4019409425675168575, 2064296209102051574, 17718639079388526425, 16642022229570326204, 1618478323171655450, 5998884876319667302, 6872649224968331273, 13753905356607269997, 7559241041198219519, 8363779881416372286, 2105649450986611656, 11644599807961994770, 12949568200151355456, 4366812189797744262, 9669235379242805159, 18184433440084438609, 13914998044815764482, 11325806379320193213, 1586181560816232196, 5920020313630770955, 8020025137186066841, 13419225700498867773, 13671651770198504476, 18024383338294781694, 0, 23396, 7560057297276955988, 7451013195867945919, 7468487593070852196, 5578183109591783882, 15747662796636990589, 2066701485189878406, 17025371161980089605, 4391959764977446152, 4985867595251695917, 6710066216774366729, 6241000701339836952, 4718440141936325382, 4986060230214018536, 5748634601882563491, 10896228304766504283, 6457499153671182820, 12270042173384394159, 11711065129605555908, 15065279868519608165, 17856220227797901726, 8953039722587792244, 16994104539161729445, 14670768895096516686, 14803898243742553487, 2327203233976270205, 17449705512918939747, 8253253226048886083, 11671578295265948239, 14297456315487806992, 297470094449022674, 0, 82, 302695496926486902, 16415403596737407938, 12969246825596557956, 15965643470182086386, 14881573336337548597, 2868629484750761697, 7317402970608805914, 2570537868338555591, 6697005353407257884, 5717939852331496040, 9408357527608003903, 8011884131194179594, 15942512744234440774, 9052662470595673790, 11913271961595885333, 15508051727969296111, 6269710669185644103, 12322255659000247132, 810875278274469351, 3499523055983644139, 9453749819048496107, 598273005722510655, 12338854942180141395, 2829445891916136836, 12653867244112536729, 4648827005364006908, 3153753366153954420, 12197142511433562971, 13557680898519201450, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11006573531383828351, 92579048505362891, 10772660272533654046, 3331697170176629084, 602109730184155310, 16230148280330706633, 6302091831624975391, 14001078336639287767, 14888577262766439787, 12258632680483319887, 7641862043593808385, 4740702640077452126, 8494032654039797119, 8314420015254970480, 18294822284401514132, 15552480182219334239, 908821363395967579, 18258193129875665644, 4226365574585037317, 3638253471537757569, 17581484848263912285, 6286301305761091621, 4777175749672661669, 10658559677463134471, 1417442037893012894, 7857622794514614671, 1052908464763109826, 4925127753504389599, 4274762298296320367, 7383511416371792464, 17305170235876004791, 2200823396264285425, 0, 58574, 18280076181055982575, 3965010120048981150, 1623299660155787797, 11930292174601709627, 17275008438838615802, 5756406115988630048, 17841510847136093686, 6729021181420822547, 1709787776185889305, 2022739540363098314, 5157634830695555269, 17099057016182449505, 4092740078069974091, 9582547144648304801, 4715310719341519129, 1597700055042697404, 480964694484615271, 56280064407246395, 10536769335197150641, 16099710145374622840, 3473101726323291593, 3295906456874767760, 716460020344690975, 10580825486552151036, 4976836170739997781, 16652319776094256449, 12319687016213027555, 13490282225851742651, 3371801902832234206, 3795543859124105201, 0, 205, 13622702382434675698, 8941567408770445183, 2168342371250989865, 17553704974699598306, 12818882650622055705, 16478401302589696546, 10652219805906948351, 13167156861512034068, 260666911081589986, 1428764500637505382, 2190433219200603887, 11999917547751101526, 2751093334206085539, 9318931023569054874, 16297727142514657495, 11875658036026604145, 5829323963705819601, 407792022339954638, 5684565403642367050, 13995368600016681288, 2845800306757116207, 5216498913603536417, 2411940295743487842, 2014066638340124975, 5258230180909223265, 17089893338044941808, 1124366766375746940, 9116801986360376826, 6650575029061305823, 4025036448660092914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 11859595567907759997, 10088766553729725414, 12574093635772317570, 5470069473511751658, 9645793732101008923, 1476556243604239385, 17933040757673393353, 7118521641278947238, 7588084371428510216, 12191494749556797391, 8228232126921631746, 15226641263820888277, 4239012011479875368, 14018593041447406970, 3541695062587160892, 11116896887234129281, 3929539690735302143, 11203930352796078636, 8751959587369085991, 12655249523595546680, 16379258612200834026, 9984807922535170831, 9638171237357393134, 12191893464144837018, 4677785078090407332, 8064604530099592479, 10076433135196495423, 544627542347870852, 11879905738846635842, 5683487714952213815, 8088984326603898052, 0, 46876, 15125170292333450443, 7072657932567702059, 10475291980250876467, 14632109792663117375, 18379882203306053694, 10250239327737538260, 11537033439839832588, 15180883293806522386, 18285674122603938406, 16116176887352657770, 15068074760365493774, 10507624248254584461, 7669544778380245671, 16424767991328560142, 16771797144770177609, 4105927596877687309, 7519344916607985067, 16277772212475505196, 1322695487397776109, 8302446182097155523, 14744324883381489574, 16338446684875281086, 5703860549203085948, 14077533030564871132, 12287193162084105824, 2535384450001991464, 13089916287630526229, 1568845385281768860, 982340402770608276, 12910581729787565904, 0, 164, 6093021124582015914, 375332441348258328, 16597900739273350797, 16788616498952461620, 10323894478242846558, 3730474644926313294, 17377183878976452334, 12746711269593150718, 13699107349734059694, 421533440407219618, 15109303318896079214, 17746438429032263850, 13224617406323308041, 5646455969610140563, 12626985742338481481, 14497665384991648640, 13894375308737560134, 3268393834564630675, 13312171511942754529, 611321250913478210, 12048873764879264902, 5334026694118161468, 14360341460112568406, 17654490467796517057, 1299716947845207044, 7609683397541157642, 14709808073905360012, 11742139955633481423, 13522070698443062110, 12847434483856017691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 10293244464294212936, 8691876854061179148, 2952350747126730564, 7968203687716298290, 6747517476428823928, 16731591574836256879, 12286682322909052293, 5699380547329532508, 8774011841981167612, 10988677337017809219, 6257583805205658612, 8595550098696265772, 17321901905145630028, 3295089823193122164, 6581488060195755410, 6329516418872359771, 7640632346113799527, 10454000694343684461, 15867346750604392587, 5805413556949044653, 9247297947852762648, 13748015074908171216, 13312272456227001370, 5054807356361880835, 1012271632864570722, 11252467974344770686, 492886975717156403, 2629112354487966090, 10128035487146424848, 18233951381382816412, 1751709948898726303, 0, 11782, 6055246182589913733, 15015595405278911690, 2209046468675768902, 16429197663637467330, 15810134098389081544, 9588791733994120847, 18370261572729563296, 7006788971063612777, 7962515674056117045, 15223121510830934757, 15872454912771340895, 1486059252283823706, 3912605942422700262, 4173681472723400357, 2922691200579275072, 7112424425452913463, 17213377378328786151, 6274713241106982122, 15112974401160243995, 17175975930045398893, 5467280291812001242, 5238070817263862176, 17584445990298638069, 171514605620090783, 4267926381848052110, 9011064139813451706, 17044511642202081265, 17370313250110904770, 13397257034080852565, 17596568325206204932, 0, 41, 9617260353707541367, 9187825164453421957, 17649953659489375797, 6396310504287885774, 17019569090864760371, 870218876784769460, 17213560015461715510, 16812494438448165271, 15885717661613279263, 2958950328581697287, 14311601477626423214, 12599125587081655507, 12078599565132475515, 3332808335850364509, 374688056722968094, 5591521890390007231, 9584980789501913045, 4066644474875437132, 17728945623551220217, 1158050506628066296, 3730734784735709807, 10671987699715228843, 3173999018565335463, 14949604462817069254, 11653871972148380806, 312408327658285690, 8531928004921347162, 98858158429688394, 6167334615107562354, 1234843923022284190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 2163003956713638315, 5989289390391757114, 15670015339098587014, 12708827926449341197, 10159927950043513901, 15395056832871965886, 17405960500607097380, 9229756563573051371, 1186079292937331145, 13463816706671585562, 10107168241231917326, 8534001612601599401, 12790948878158723266, 12619661555644649350, 11614101867080583800, 11255619179741810030, 10501448523390229441, 16971746085380600175, 7173352752193758542, 9960833320626690499, 3507659370538431093, 6846598866105961944, 2557094292829749679, 11416743759689580593, 12182449258645699464, 11951277814213817673, 10567677969346318078, 13884819925875295975, 1926379571595510347, 5918588896905128530, 3405979658670756574, 0, 11698, 8146055133796963630, 4724864404296433607, 10453305271538430204, 17141108237620938331, 16113292978122689735, 14630852758047225712, 16936235645680974811, 640959767495035790, 11162248672474783185, 10618808740372936561, 12973220127719589473, 13223353016814262874, 17652411276563186968, 10141330567980253051, 1770876161367154023, 12442058685904907795, 12986633647641209886, 5384244903407669612, 14778499304685795812, 8054814913234770610, 8358166993767322841, 11933451322373121057, 17795028935448509068, 11142588879850986282, 873880226830208445, 11017896854604878841, 6896812394605202475, 2024842447089060639, 16625734836325714912, 12512094004962322130, 0, 41, 12529483521877137515, 4671467226762388980, 13873740979092621907, 12847173262736205772, 2640423636460273022, 8374058502362870155, 7630996533587302384, 3556075572123538464, 8078558398785937163, 5856098383496092000, 7999607615804135893, 15509992149354799776, 13785560116650003734, 8358196300413379173, 10412508239405514928, 7840142081125036731, 18075062342410207477, 18173191150607640442, 2133036585496843963, 8931901040624025193, 9454731621283026961, 5837806564591410604, 5850596656185029719, 296117354535505751, 8985195681813998404, 1975947551471322175, 12041110943945791333, 11648250496545232642, 7830634726555216225, 5266777994490151623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11627839282500592134, 3407397722647202213, 13644814392425193274, 9689174787852538317, 15759480978611340324, 10073546228149283602, 8090878949578096073, 1502926046713635634, 7624167193861818791, 10274257988202953339, 4186763142475177793, 6025425965090069083, 8194342163688078130, 13163397875087894329, 5161390927343581791, 10103251159424454395, 575959985319833606, 13175926157437524595, 8928028362497258488, 8665485641724560922, 15570929820685955587, 6150675652390666890, 6384512333148749163, 35921027791486524, 3229184449291625000, 7414754653220847914, 11347301099028602515, 8368586536930615942, 10138228048917253579, 344980745193352015, 5644431973654019812, 0, 58574, 12761879591277148733, 3794756304714494565, 10919382803049057886, 13927811434585922718, 8315847055470475708, 10095847089706649983, 41153506376499461, 5529807447506440005, 72892344713547594, 18362204307013225363, 527610602670466995, 14772158556567070690, 9538491437159792328, 1580498045195806896, 8297535568256810268, 13797917351588149895, 1651894826575892086, 13380716913143325871, 2655893075036451977, 3750342908258071259, 18231595474498119868, 18163310674975357977, 2371603174180061555, 6433509503768865899, 5002589281792664271, 10946433388588585987, 9256382872640968643, 6570002101874463971, 3849537215181896567, 5735281858523620986, 0, 205, 7876112718273244024, 1276143811675585923, 9993912342918529935, 16999254614849428545, 8194747920293058753, 11171758628037424552, 8208119826419095432, 5568149314099479773, 17551537772960996556, 12651683228606533001, 13584145944854843210, 12212300608708011466, 18102951610480561318, 14720258372954226591, 15448472262117068008, 10575290756167155008, 11997391634424499349, 9879556170680135793, 12373753045781314057, 9529470285212177396, 10620662102176580756, 10199402949196411787, 9825825353570660203, 18337390924518345383, 15945306792731206141, 10537181099344133724, 5505106000120813030, 14774803975376978777, 14575654492591748955, 8207377881872409730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 1844206616423154361, 7941852203687681180, 2987825311454433607, 185071303888742221, 16140725249773135932, 13486449309893009073, 13471170357015645210, 11073859438158044651, 16507211018434913458, 4066228076398875428, 16536071023746429034, 10818247459046542341, 4392853051950044706, 12116759677655250999, 17293580330275603290, 2376540144284705519, 8057038266027202789, 15097730100005395027, 3583575859544955648, 11146351406925299070, 13473187462927502829, 8056538798141691018, 13509558775822115028, 6797301950091310335, 8773981691004278165, 4751058192101309365, 10661116978196100999, 15345629614104209519, 1689963602473071179, 12869561156624962469, 12554030503530361323, 0, 46876, 4789346784708035796, 9438751512570250357, 447952077691938652, 6351356675900770483, 4868676530510485341, 3192437812250556397, 11511034416225137032, 15380266628173325649, 10700144984876703355, 12230522212327928379, 15526804358639727019, 6410705682507666807, 15728916292645010880, 13992590038292222154, 1916422775943772979, 8280685582260709248, 12515254706968408232, 4845996266408136556, 15172713941042952680, 2233761585242005099, 13227100893355110663, 3914062371738178895, 7843298541359739176, 8386193964610423744, 8614894336467293783, 8834991867772635266, 14221135810103683560, 11406071542091908609, 571586377235018247, 3013510715159483905, 0, 164, 14482187202392982684, 17682350329754313417, 66214439016909251, 7504629639084879386, 11708178258767948919, 188011405648496761, 10242982970375452289, 16510140404231294235, 13381084464566932690, 9239012175869487665, 9339694231140180875, 9917181315244873380, 17448534469581521177, 4965043893766771965, 13305445405772227224, 6963375374275021656, 4554518835153561582, 1694446457415578298, 4604616361036784646, 11439774970058559661, 10784225701912607868, 17782855612978839775, 13368223431578003475, 18100595786373494652, 12753204151452870283, 17504098334052422651, 12896535568794110034, 7402084190222773115, 598469278842686486, 5912604878679295331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11371898088219304696, 4199208231896291776, 6349271639347163621, 5568595648257864309, 10224931331962954075, 8046167029187450402, 6585148777263545478, 3706462809677116963, 12578093594063946501, 11334181120248394313, 4953509182438845792, 4130560513564095433, 6665409895959715593, 12872180446847298231, 11452171012153290342, 5729159829892489539, 5675564903335979949, 14158677720471443076, 12300968791182495713, 13879671978791253311, 14820104759072107152, 17585955671327967478, 6737505022417937354, 17454985371239394211, 15749874646256262769, 10017226585432634212, 8893160827421013787, 11893931769684808775, 16471875099240353401, 9975926385796085953, 11231727832144176264, 0, 11782, 6351111885067026894, 14086295994708840477, 3142920623105062021, 4317195510637014184, 16341148873550430347, 8014762585425506108, 12977978004680762325, 15318810920503136316, 9472517513827583818, 211962335804367550, 14931353145911604525, 9340212215573419915, 5244269534978718672, 1584128384101705476, 4460891295949496863, 14654598206063183317, 13555452196222133132, 17680908597379218579, 13178742765486355260, 3964993209073179108, 4213917162333386044, 2639949635019592417, 3300803743280888923, 12914222891103397086, 13436383826829479040, 7004576641630317963, 12080155723705641895, 6767987840126452263, 14392317091133450653, 7390177608867021213, 0, 41, 3800418813655617572, 14503408479575576010, 10553169970007645345, 4946745422622378051, 7127828976000219721, 2687285609278369395, 16630221959750548176, 1114885198959805561, 3895092647933222339, 9831397389014117600, 12816842684293233323, 1779119880742935864, 17663607747965229138, 5382558247959552902, 11972955750871888364, 16616426694032134438, 9711126273890628516, 376576173107709408, 12451218545182255865, 14301764572821220192, 13209253693600827240, 5745169166190656073, 12916752429524642864, 14463770325561420619, 7870235520772452232, 13278341252249613603, 5432056100901092307, 8994645443800925562, 5908996313982662075, 1494658977663487041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 17530820119034444668, 15233230393479930649, 15702789941308523576, 8819781861782654629, 7112644758334533508, 2549387492966523460, 15838339720324898846, 10242380937000070843, 1124701407395854549, 5706112669062280829, 17015988684670402201, 12671109438456697877, 15652595419009785355, 10753966634497852319, 3622124053041186910, 2063695485301676711, 17845322355197915738, 9894091605930112348, 10822348040176532279, 9689802115657313068, 6759722828145755337, 9479044480226984785, 7845909286502989649, 560081323074218824, 16017591174163981005, 1196237303718990885, 6783304352365897531, 5064625229425039166, 12661189034561966549, 11511655067934063768, 11479359825177848513, 0, 11698, 2084118884093035279, 16979859941949546961, 1454299506056429821, 9658643065222637557, 11605485146349749283, 13057696629474024230, 16650374201325163722, 7457309320444728046, 1243843599995756274, 17176177262691414244, 14152683925184093692, 198845790532099135, 442435874165139119, 1462611314767788334, 3462067515008653152, 4141759445261917472, 12323330957750482072, 14922731139272985797, 10387565380055278256, 9531386257124273696, 9539285450074189441, 3691450672437772660, 12463184698711878632, 4858502687517999226, 12256855995572753726, 9245347314341240247, 7569214225554358494, 1017686422583121037, 10327407591150878848, 15025446886891081073, 0, 41, 13092032916490151270, 2856458557507854671, 14059661153766146178, 1724041303048776424, 7119687853704366589, 3699246950542313036, 8338994289155538949, 7732171807197958061, 10653644351656999339, 15262849800927670044, 6132373490633371091, 16473831322001214578, 12928938600331453669, 6959935525856744214, 17173069020016176920, 6747622983845354522, 2484033613426731933, 9879916419081378373, 4275250202523893223, 5995505684018086986, 16115855409799741127, 2490003355474156145, 10034475279304353355, 7223217715426381376, 10334063888823214988, 2139000562522371457, 18314119367638727156, 15311716904301189063, 894706229073498557, 1570146104298050273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 96, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 5, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 6, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 7, 0, 0, 0, 0, 0, 5, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 42, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 3, 1, 8, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 2200823396264285425, 8088984326603898052, 1751709948898726303, 3405979658670756574, 5644431973654019812, 12554030503530361323, 11231727832144176264, 11479359825177848513, 0, 0, 1, 0, 0, 1, 1, 0, 0, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 3795543859124105201, 12910581729787565904, 17596568325206204932, 12512094004962322130, 5735281858523620986, 3013510715159483905, 7390177608867021213, 15025446886891081073, 0, 0, 1, 0, 0, 1, 1, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8488924048752676071, 7132218559010351790, 18152833202936203138, 302695496926486902, 13622702382434675698, 6093021124582015914, 9617260353707541367, 12529483521877137515, 7876112718273244024, 14482187202392982684, 3800418813655617572, 13092032916490151270, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5473488137200086909, 2687466917280430353, 10305147718805144715, 16415403596737407938, 8941567408770445183, 375332441348258328, 9187825164453421957, 4671467226762388980, 1276143811675585923, 17682350329754313417, 14503408479575576010, 2856458557507854671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16124688533662466636, 14170238607512888511, 13246631902503555591, 12969246825596557956, 2168342371250989865, 16597900739273350797, 17649953659489375797, 13873740979092621907, 9993912342918529935, 66214439016909251, 10553169970007645345, 14059661153766146178, 1, 0, 0, 0, 1, 0, 15754956633454945151, 6055713190940499638, 11077250730155763388, 4527044298581192722, 5453168895411602323, 18142351346900318359, 15965643470182086386, 17553704974699598306, 16788616498952461620, 6396310504287885774, 12847173262736205772, 16999254614849428545, 7504629639084879386, 4946745422622378051, 1724041303048776424, 1, 0, 0, 0, 1, 0, 5043375237696906583, 4379507338442738151, 10191347065326962634, 15470787238396171217, 7649138216344653830, 3098698980745497723, 7317402970608805914, 10652219805906948351, 17377183878976452334, 17213560015461715510, 7630996533587302384, 8208119826419095432, 10242982970375452289, 16630221959750548176, 8338994289155538949, 1, 0, 0, 0, 1, 0, 27564165777955823, 2554423200420703486, 17579160449292996896, 11147561538212402733, 7271583017513514692, 11194864417357882388, 5717939852331496040, 1428764500637505382, 421533440407219618, 2958950328581697287, 5856098383496092000, 12651683228606533001, 9239012175869487665, 9831397389014117600, 15262849800927670044, 1, 0, 0, 0, 1, 0, 12554774560852918121, 7558057668449617622, 8341229243444900158, 11546140485006286209, 5702916883024911354, 10059737158050223658, 15942512744234440774, 2751093334206085539, 13224617406323308041, 12078599565132475515, 13785560116650003734, 18102951610480561318, 17448534469581521177, 17663607747965229138, 12928938600331453669, 1, 0, 0, 0, 1, 0, 6754601476785640702, 7736060991620510625, 1449884785010881379, 6135983205453599776, 9277341930384005575, 17852936504841763737, 15508051727969296111, 11875658036026604145, 14497665384991648640, 5591521890390007231, 7840142081125036731, 10575290756167155008, 6963375374275021656, 16616426694032134438, 6747622983845354522, 1, 0, 0, 0, 1, 0, 7929723072429044254, 16334448815751507577, 4434638168235316685, 17199894398730562705, 13653108884642243926, 18423338781077887809, 810875278274469351, 5684565403642367050, 13312171511942754529, 17728945623551220217, 2133036585496843963, 12373753045781314057, 4604616361036784646, 12451218545182255865, 4275250202523893223, 1, 0, 0, 0, 1, 0, 8602814005182217200, 9971451726661298505, 15671763834046105438, 7369439734883755459, 15167316901472929028, 9594540064387516595, 598273005722510655, 5216498913603536417, 5334026694118161468, 10671987699715228843, 5837806564591410604, 10199402949196411787, 17782855612978839775, 5745169166190656073, 2490003355474156145, 1, 0, 0, 0, 1, 0, 1420030357616461150, 0, 0, 14515762120928230173, 8611475648437961511, 7809934763889573038, 12653867244112536729, 5258230180909223265, 1299716947845207044, 11653871972148380806, 8985195681813998404, 15945306792731206141, 12753204151452870283, 7870235520772452232, 10334063888823214988, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13610167819530098127, 10900065459953722709, 18341122838405415754, 3153753366153954420, 1124366766375746940, 14709808073905360012, 8531928004921347162, 12041110943945791333, 5505106000120813030, 12896535568794110034, 5432056100901092307, 18314119367638727156, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11215445033353754262, 9162692523043045302, 11967784234256998242, 12197142511433562971, 9116801986360376826, 11742139955633481423, 98858158429688394, 11648250496545232642, 14774803975376978777, 7402084190222773115, 8994645443800925562, 15311716904301189063, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8081237365032914784, 17462008412377898139, 10761804868734649587, 13557680898519201450, 6650575029061305823, 13522070698443062110, 6167334615107562354, 7830634726555216225, 14575654492591748955, 598469278842686486, 5908996313982662075, 894706229073498557, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11656, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6714198787893475936, 18084035356118526352, 4199576522683349447, 7560057297276955988, 18280076181055982575, 15125170292333450443, 6055246182589913733, 8146055133796963630, 12761879591277148733, 4789346784708035796, 6351111885067026894, 2084118884093035279, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5262284953624879131, 8386870944408484201, 16513391592299529611, 7451013195867945919, 3965010120048981150, 7072657932567702059, 15015595405278911690, 4724864404296433607, 3794756304714494565, 9438751512570250357, 14086295994708840477, 16979859941949546961, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6828048997998717653, 18056918720989013854, 11415640949254272304, 7468487593070852196, 1623299660155787797, 10475291980250876467, 2209046468675768902, 10453305271538430204, 10919382803049057886, 447952077691938652, 3142920623105062021, 1454299506056429821, 1, 0, 0, 0, 1, 0, 11959032640791191427, 13666984456735322931, 12430950944235583873, 14647846255598321281, 11520229540186073721, 16138036929710694921, 5578183109591783882, 11930292174601709627, 14632109792663117375, 16429197663637467330, 17141108237620938331, 13927811434585922718, 6351356675900770483, 4317195510637014184, 9658643065222637557, 1, 0, 0, 0, 1, 0, 3078434273127823899, 5753377056128261292, 7043657405344780329, 9916068016290756984, 12303762929371991135, 15625472986208536177, 17025371161980089605, 17841510847136093686, 11537033439839832588, 18370261572729563296, 16936235645680974811, 41153506376499461, 11511034416225137032, 12977978004680762325, 16650374201325163722, 1, 0, 0, 0, 1, 0, 16093488747192154823, 9136889811217566327, 15238340014812686010, 6061515485015027193, 16455507557982986163, 13332197512776217968, 6710066216774366729, 2022739540363098314, 16116176887352657770, 15223121510830934757, 10618808740372936561, 18362204307013225363, 12230522212327928379, 211962335804367550, 17176177262691414244, 1, 0, 0, 0, 1, 0, 17584045558346364245, 8021141784340784171, 17538920393594018726, 9245574117575493602, 9198509167958908347, 706573335075180235, 4986060230214018536, 4092740078069974091, 7669544778380245671, 3912605942422700262, 17652411276563186968, 9538491437159792328, 15728916292645010880, 5244269534978718672, 442435874165139119, 1, 0, 0, 0, 1, 0, 3172838986399921646, 14996615673828945713, 2968596499138535119, 13553995817865937844, 1544674922431042375, 5341110475237803180, 6457499153671182820, 1597700055042697404, 4105927596877687309, 7112424425452913463, 12442058685904907795, 13797917351588149895, 8280685582260709248, 14654598206063183317, 4141759445261917472, 1, 0, 0, 0, 1, 0, 18432037966602915394, 11157278412179636212, 3333037102311562019, 8806896510487478352, 6533551228799195237, 13389502447794973829, 15065279868519608165, 10536769335197150641, 1322695487397776109, 15112974401160243995, 14778499304685795812, 2655893075036451977, 15172713941042952680, 13178742765486355260, 10387565380055278256, 1, 0, 0, 0, 1, 0, 18181589522906879612, 16462817036687190629, 13897413906888730423, 2444726075814550534, 13039263708530965818, 9767862146044075473, 16994104539161729445, 3295906456874767760, 16338446684875281086, 5238070817263862176, 11933451322373121057, 18163310674975357977, 3914062371738178895, 2639949635019592417, 3691450672437772660, 1, 0, 0, 0, 1, 0, 9441086471966058156, 0, 0, 3069389264726801426, 17714998603219848343, 3285997397792070136, 2327203233976270205, 4976836170739997781, 12287193162084105824, 4267926381848052110, 873880226830208445, 5002589281792664271, 8614894336467293783, 13436383826829479040, 12256855995572753726, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3979217445866956620, 14102459334756352921, 14473951691792990803, 8253253226048886083, 12319687016213027555, 13089916287630526229, 17044511642202081265, 6896812394605202475, 9256382872640968643, 14221135810103683560, 12080155723705641895, 7569214225554358494, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6693606464693965975, 13661835471193379756, 8827937223658185560, 11671578295265948239, 13490282225851742651, 1568845385281768860, 17370313250110904770, 2024842447089060639, 6570002101874463971, 11406071542091908609, 6767987840126452263, 1017686422583121037, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9525288177353527302, 3038016940647586670, 9698676695870635420, 14297456315487806992, 3371801902832234206, 982340402770608276, 13397257034080852565, 16625734836325714912, 3849537215181896567, 571586377235018247, 14392317091133450653, 10327407591150878848, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 3795543859124105201, 12910581729787565904, 17596568325206204932, 12512094004962322130, 5735281858523620986, 3013510715159483905, 7390177608867021213, 15025446886891081073, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11182969138190702361, 1109628455053940361, 13928676565061410159, 297470094449022674, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15045917672181612303, 8184561966951183876, 1314981229280595867, 10051713503687926694, 10772660272533654046, 10088766553729725414, 8691876854061179148, 5989289390391757114, 3407397722647202213, 7941852203687681180, 4199208231896291776, 15233230393479930649, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3672327111134984977, 12431805880114311043, 1393532256400242982, 5258910437097366761, 3331697170176629084, 12574093635772317570, 2952350747126730564, 15670015339098587014, 13644814392425193274, 2987825311454433607, 6349271639347163621, 15702789941308523576, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11902001817992340801, 2986356007899077631, 13433705342207763738, 14031537229609682064, 602109730184155310, 5470069473511751658, 7968203687716298290, 12708827926449341197, 9689174787852538317, 185071303888742221, 5568595648257864309, 8819781861782654629, 1, 0, 0, 0, 1, 0, 9433051896879704986, 3790096704121066977, 7848157813885660720, 97480563262877602, 2836244341662188919, 12880831435259048250, 18190284629542346231, 16230148280330706633, 9645793732101008923, 6747517476428823928, 10159927950043513901, 15759480978611340324, 16140725249773135932, 10224931331962954075, 7112644758334533508, 1, 0, 0, 0, 1, 0, 12268806337265941227, 8766527133291152460, 4573212491205067738, 1451330498122947575, 13878284404078727054, 13732313223959877570, 4019409425675168575, 14888577262766439787, 7118521641278947238, 5699380547329532508, 9229756563573051371, 1502926046713635634, 11073859438158044651, 3706462809677116963, 10242380937000070843, 1, 0, 0, 0, 1, 0, 12264599910826326487, 4401672593088936956, 3287770912268324671, 8550984974115591347, 11905155073870025459, 15581584642080412492, 16642022229570326204, 4740702640077452126, 8228232126921631746, 6257583805205658612, 10107168241231917326, 4186763142475177793, 16536071023746429034, 4953509182438845792, 17015988684670402201, 1, 0, 0, 0, 1, 0, 10482044717877897468, 11338035720719303533, 15111143544560920122, 5779906183691085674, 5883496260565631343, 17424758021352066268, 6872649224968331273, 18294822284401514132, 14018593041447406970, 3295089823193122164, 12619661555644649350, 13163397875087894329, 12116759677655250999, 12872180446847298231, 10753966634497852319, 1, 0, 0, 0, 1, 0, 2142659226510195682, 8250976014423777012, 11550997137187900197, 7239115491427587826, 6214639496702145664, 13747770174448213841, 8363779881416372286, 18258193129875665644, 3929539690735302143, 7640632346113799527, 10501448523390229441, 575959985319833606, 8057038266027202789, 5675564903335979949, 17845322355197915738, 1, 0, 0, 0, 1, 0, 1980663272019683980, 16254047807534945359, 12731791925462422257, 8817470180767843173, 1035954869286151888, 10799815877710934765, 12949568200151355456, 17581484848263912285, 12655249523595546680, 5805413556949044653, 9960833320626690499, 8665485641724560922, 11146351406925299070, 13879671978791253311, 9689802115657313068, 1, 0, 0, 0, 1, 0, 2823715339336108463, 15599274894951921542, 4792471773839294427, 1023167627240586914, 12555736327846716176, 1619117325320043308, 18184433440084438609, 10658559677463134471, 9638171237357393134, 13312272456227001370, 2557094292829749679, 6384512333148749163, 13509558775822115028, 6737505022417937354, 7845909286502989649, 1, 0, 0, 0, 1, 0, 15590779242968047633, 0, 0, 12615841091071546269, 14389918991418187594, 6190024525131486611, 1586181560816232196, 1052908464763109826, 8064604530099592479, 11252467974344770686, 11951277814213817673, 7414754653220847914, 4751058192101309365, 10017226585432634212, 1196237303718990885, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15373572920503822367, 5150637797762075635, 17671950935398765622, 8020025137186066841, 4274762298296320367, 544627542347870852, 2629112354487966090, 13884819925875295975, 8368586536930615942, 15345629614104209519, 11893931769684808775, 5064625229425039166, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11769995123877236600, 11237118474907085960, 15303512720733905693, 13419225700498867773, 7383511416371792464, 11879905738846635842, 10128035487146424848, 1926379571595510347, 10138228048917253579, 1689963602473071179, 16471875099240353401, 12661189034561966549, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3762647969008011219, 11752652705714102353, 10727837149375754730, 13671651770198504476, 17305170235876004791, 5683487714952213815, 18233951381382816412, 5918588896905128530, 344980745193352015, 12869561156624962469, 9975926385796085953, 11511655067934063768, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694, 2200823396264285425, 8088984326603898052, 1751709948898726303, 3405979658670756574, 5644431973654019812, 12554030503530361323, 11231727832144176264, 11479359825177848513, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([8269653645296248010, 997682303299740331, 12907160815575155319, 18024383338294781694]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_20.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_20.snap index 3aad1c0e3e..dd57e330fb 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_20.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_20.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 65, 65, 65, 65, 65, 65, 65, 65, 65, 1, 97, 97, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [16336503519826769294, 580999813345182728, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 16336503519826769294, 41, 0, 11006573531383828351, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862], [9197671798777409481, 580999813345182728, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9197671798777409481, 0, 1, 10983413158656624898, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770], [13035020452047724944, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13035020452047724944, 0, 0, 4869282124135316831, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811], [17733790707118953345, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17733790707118953345, 0, 0, 5899798166361732461, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096], [11006573531383828351, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [16336503519826769294, 7241595766844512545, 2990417547231451768, 8200055882763834902, 15107023413552199376, 8385687432658166895, 9658411005214642328, 4909632993745393767, 11139320331324068031, 7133947682362156748, 17192073988910191157, 1252671640222326947, 3013016866261693283, 8108123078799037039, 4014227156326565798, 12391143724758863082, 14176166539222112137, 17477853997594743235, 12238064792115483402, 14469369283093994356, 15706959181585180523, 9935807559722975979, 16381952245010805100, 15445358949429791952, 4394218334834403498, 7081942205803021819, 14286495051698513565, 1765182318039047708, 4315117985825319308, 13180871958580017059, 9324640818690322529, 6965138066206642862, 580999813345182728, 9441246971154186623, 14568136944800275082, 12559996978644727669, 16006034000059690936, 15808130082429351686, 11189427321576264326, 8056423375835200370, 894576452673648096, 1759663226535241487, 7111996287898491444, 9980680059887464609, 1246527623804764182, 15473044979114460820, 15843714178786416863, 11802722938645199711, 528524525625403517, 3395211782606276051, 4814987904082383725, 8549845730678305747, 3112263678112869121, 1192721472492662021, 5190583599302670309, 15237271270752782119, 4547129522910145518, 11550408183365383111, 6870828195219142669, 12383111777615982801, 12714099020863010695, 5224376302272959154, 14781572642473112572, 14537741408767373410, 4539061041759240, 166413184814318872, 3330424775026476592, 7732229819737520946, 12659763553976530720, 13820936547498519501, 15870553509947197608, 5797460196965489144, 5030538143349324000, 3122912243524936279, 7275337387902302889, 5695604368834329320, 14130306385452780113, 15363567770150994298, 8078757315035365696, 5442629662308931105, 16137685808790691775, 9729162786960114112, 6971938391156245940, 18003847752567480952, 3179630577014811908, 16175129257259814669, 7116272890564491051, 14999066466406693845, 11390566154350641025, 8405503273117460784, 17453232571701437290, 17122916750446457171, 7539745443808178835, 14554316550668318802, 15063345752223211733, 16336503519826769294, 41, 410, 8488924048752676071, 5473488137200086909, 16124688533662466636, 4527044298581192722, 16887055178922689595, 5249711198271717177, 15470787238396171217, 5632634005697013617, 7337408598993184022, 11147561538212402733, 9710911023591971572, 8752830793140649116, 11546140485006286209, 10738951369466640003, 2139663271495255306, 6135983205453599776, 17538856881976830392, 2031516987289365197, 17199894398730562705, 4010699482290892787, 3922552954514582360, 7369439734883755459, 108303794773646012, 14521269346803535153, 14515762120928230173, 13893962684375637966, 13610167819530098127, 11215445033353754262, 8081237365032914784, 11006573531383828351, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [9197671798777409481, 17469195903127682246, 11606517949721719272, 8595871163399933719, 7763683116636157069, 838997349906846708, 13728530742608929979, 6793201875126035063, 8111388737755370581, 14079832107643166597, 17737118927359740270, 3118134149246226434, 13627060471757962412, 587514782692598940, 2305040771202529034, 407676238176147180, 11304490035899669295, 4667652151526467516, 13681768858122081452, 17060146905316016781, 15750389702075093135, 7088767289424376680, 15640720737556518069, 2099687338970431013, 14448236636738050578, 5519067145334892916, 6791090761664616374, 420116652546322982, 17954920195441939375, 6438200026603866080, 1507262460208602102, 12596233587871940770, 580999813345182728, 2469249211011993887, 5693535723676280393, 9307941706856421244, 17583976365434994224, 11956256213068276591, 16650744379891120584, 11970932857482984253, 1340502547894095473, 17627623028259352738, 10800915493705299677, 12726130892030271688, 1966101965836764845, 8603197046817345275, 3287199712077657921, 4816347799520535722, 13726091214309035851, 14508720026418909433, 8845463819329319330, 319079387588421934, 9793349915183632648, 14664095371212951733, 7893897801913761594, 16244276080775719304, 5201962268638016263, 595824696721317186, 2520783628599955940, 849243249424286073, 12314456283572504356, 6535409800777915487, 11268362592956912536, 15771729313541940903, 0, 1073634951995504195, 13633250484821623215, 15098993065726469111, 1564281538360678972, 7168328730833322865, 9990637691333202156, 4315815088290272811, 13591172423217881213, 15655075338480513609, 996725104060870062, 1007570544942142144, 3729822968690386528, 10658087655041602841, 9498329046798837348, 14839704326644418801, 16811175179247371160, 5981274731275683258, 15610466289947195032, 14000599989678227804, 15292824893734897630, 627607295424670979, 2340223307289953865, 15059493462076997690, 16071082072689060288, 16820362574538767542, 5021883210577128063, 1555980395218755516, 9884045457320590091, 5367026278670357791, 8499294198486805672, 9197671798777409481, 0, 328, 7132218559010351790, 2687466917280430353, 14170238607512888511, 5453168895411602323, 8679138582261878552, 10871515559850126217, 7649138216344653830, 12086029516113687059, 14609582285822867389, 7271583017513514692, 3821121937809044409, 3833100151978191712, 5702916883024911354, 3579138882391492892, 14347405124134927123, 9277341930384005575, 2993137622300793545, 13370802209879109056, 13653108884642243926, 8702782587703766612, 12945832125614510830, 15167316901472929028, 4608694219239856197, 4443739924303229750, 8611475648437961511, 1575864515244779062, 10900065459953722709, 9162692523043045302, 17462008412377898139, 10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13035020452047724944, 4235056893170892481, 17598947928349150032, 4957589343064393818, 6242447045300438422, 4795761656943466364, 6264917032052353984, 15603723388972198024, 11627377236417283134, 6114228315229264629, 3286806106182827895, 15205984627333468001, 7321576485635388020, 17749542785007315566, 4569674865772026702, 7956650962315989946, 14478240861430583623, 14709859391037291514, 10913732310161131390, 2296203662546391134, 876174554396868075, 17404327975123101624, 2366722819671298513, 14303982336399641814, 12813527806534446210, 12774296173948151856, 12627603787832494922, 14277393185196427667, 2358074803509054857, 16405101789199201340, 1581131786309040293, 8197358252954291811, 580999813345182728, 9441246971154186623, 9230767544379437105, 18310630857442586767, 6798288544665969845, 12649659004750065655, 9127484939696035145, 3208400024176171154, 12601220862983867223, 3182150398630969932, 15946092271529760948, 312583470408719867, 1277989670489505373, 5390475388454384344, 1991947075903969606, 12041137591375643532, 17203613475518457508, 11172295513373146926, 1047366979417083402, 1230000128467178780, 166719433298183890, 9500917527157796789, 11443445413242899153, 18103925836791549846, 8328524023483162981, 16082128743854634628, 7353009946795117330, 18315678446936398634, 469635739213563567, 7901122908367659010, 5766087612434108876, 16254963956836991015, 0, 8506155510179977332, 16565837043221829196, 52948362219275850, 8677964002070154388, 7428484016288157022, 2806233373077400725, 13744878929079685610, 7596566350181367049, 8320838608801394259, 11416348334771026081, 5033691822950904881, 17904228615366476508, 1573747864700068677, 6115393411247877634, 299028171433900072, 17660677259671545725, 17197119244649549383, 11502210755699728407, 3657258890969942218, 3136236054167912163, 186206196971871344, 10885932290083514811, 11340220366618064719, 11020489504600957926, 15331358518756318712, 5496590912397587492, 14595950592094489892, 8382695108894398131, 9643181922175718153, 16042312733989464482, 13035020452047724944, 0, 82, 18152833202936203138, 10305147718805144715, 13246631902503555591, 18142351346900318359, 11971140429919100117, 6903484634638418138, 3098698980745497723, 3068992673894668202, 9164459936648953977, 11194864417357882388, 12005359455571366116, 12356306486226268709, 10059737158050223658, 17119982236602677307, 4225663824996553892, 17852936504841763737, 5778553506856942969, 9045001363359345866, 18423338781077887809, 2711240319770097821, 8346149567490270428, 9594540064387516595, 1859863665658604717, 16919987197409252682, 7809934763889573038, 12492597695329698922, 18341122838405415754, 11967784234256998242, 10761804868734649587, 4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [17733790707118953345, 2298049257819688964, 14580412695609233024, 12971821499548943886, 12942151567717980516, 293990104348951469, 9511447919780245828, 12096675465574714978, 11966816476348176754, 6745364430325410240, 124350208982409384, 11534859557249128228, 13499302804947319126, 2073163037044338276, 980116766328138766, 6249894809652649629, 5225655700408130435, 15576478276301900443, 7892851227093729574, 15711810664626070442, 4889082965904642440, 18118185760308539378, 14951898769476191069, 12393266145043202429, 18370579783025919052, 13670428043882183738, 853764681371061454, 11311873924545773972, 12566827890799503780, 12734261918077566887, 13460201712649497096, 10673667133036073096, 580999813345182728, 2469249211011993887, 1921340627054025915, 11168366585808691894, 16344827155364741241, 13917605778022436041, 16775788395149485828, 3448656772275438142, 16222497246401579549, 7203217594655996602, 11409282451484046090, 758472841121971562, 7818365927012965985, 7903960434340948362, 3767440642589974121, 11209692269971430929, 3035346059787720244, 3431797671267201506, 6118779023340710484, 11335358665561171709, 5274326486456948617, 5525087067228805129, 5704922620886162396, 15867602839234938544, 9623255540514358603, 6605123704860531855, 17045986882743664444, 13118883604429226706, 4147903628926627533, 4079954944710007123, 10588667258124334541, 2046774012797929459, 0, 144771942538542601, 12610063329678779487, 9599099202048490781, 7298046952032101196, 16026473122383984320, 14666633261274526329, 10912616786956595600, 5410472981661512575, 8351163137101469720, 6900106104861748151, 5904063656561684665, 16445251460715434195, 10832015734039673623, 2891811661249932042, 8924808732795308287, 4687342342302612015, 16735389142514185239, 1470376739244986162, 1819268707172544638, 13251084164183215555, 16740657538571711568, 12986569577580758510, 6580507474643651363, 14039388877064634044, 17925541740654686755, 6693558341526111425, 11597938374506256020, 5283201688561864115, 5334752974852163097, 451731299183430202, 17733790707118953345, 0, 82, 302695496926486902, 16415403596737407938, 12969246825596557956, 15965643470182086386, 14881573336337548597, 2868629484750761697, 7317402970608805914, 2570537868338555591, 6697005353407257884, 5717939852331496040, 9408357527608003903, 8011884131194179594, 15942512744234440774, 9052662470595673790, 11913271961595885333, 15508051727969296111, 6269710669185644103, 12322255659000247132, 810875278274469351, 3499523055983644139, 9453749819048496107, 598273005722510655, 12338854942180141395, 2829445891916136836, 12653867244112536729, 4648827005364006908, 3153753366153954420, 12197142511433562971, 13557680898519201450, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11006573531383828351, 4764651601843997947, 13599348264422318050, 9048627971498202333, 4616644171576346372, 13446530094027973481, 515125260461286305, 13270828405354296543, 3589365582169471582, 7410433095216666761, 17324168673998498317, 264848703107953315, 2519145233399390872, 16944105578845184537, 891801733175697187, 1917456671376826149, 2178489717179959491, 5288871968538360514, 173128619939349444, 14938204230051641776, 14848674461360674975, 3298163296153338543, 12736435946586958561, 14151277613136798520, 6993584357807298191, 17243220101971525650, 6760124904423015973, 15448478475120864966, 11226925817970638094, 323561318445804460, 11770041052112546722, 8087083728976074902, 580999813345182728, 9441246971154186623, 4826001026438697181, 13927464871572189232, 8487031467837880959, 7953084218463226909, 14357560502528070253, 9198678924697643847, 16644535012971742472, 2610427154842113175, 1362602973689891222, 14563339716269964045, 10893524038980604908, 8604291529520412550, 3375764636979625919, 4598760434596487640, 14370201798336911320, 11592395684445633353, 18428909381025170046, 7556816872757379313, 15838446667082529291, 11840899228072824840, 5666563878473838907, 12094773271668234643, 18145098371590981833, 6227739674905468508, 14360904859585829753, 6349150325802118522, 13470963638813042195, 13830904396796715875, 9960013932953480218, 9448749568492005186, 0, 143717879605522672, 1406583001570465792, 12562663752152469569, 16633851142346839330, 17021480690231868718, 8387812497337000660, 15004187181055446563, 12021280163646879782, 15544096072222322408, 132132622953814287, 944699227762067814, 15889407327776555006, 8234710954956267885, 14704623317114553828, 5225072174929433338, 9992674649041617391, 17342022136955130751, 9806643750569796986, 10854572141100075982, 9877562264475108305, 3741205325444910799, 3008635823591126704, 8487705884637814572, 10764537169012636484, 3173467127968428287, 8847518126511086492, 295935891940673208, 11767201095350394052, 11260389542763349256, 4551861726624713720, 1413881954865567393, 0, 205, 13622702382434675698, 8941567408770445183, 2168342371250989865, 17553704974699598306, 12818882650622055705, 16478401302589696546, 10652219805906948351, 13167156861512034068, 260666911081589986, 1428764500637505382, 2190433219200603887, 11999917547751101526, 2751093334206085539, 9318931023569054874, 16297727142514657495, 11875658036026604145, 5829323963705819601, 407792022339954638, 5684565403642367050, 13995368600016681288, 2845800306757116207, 5216498913603536417, 2411940295743487842, 2014066638340124975, 5258230180909223265, 17089893338044941808, 1124366766375746940, 9116801986360376826, 6650575029061305823, 4025036448660092914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 5310937309376166300, 69556848653847272, 2279577280749402753, 6239043535079259963, 7823300322844699129, 16996148474654794437, 4230459886680751700, 12959563699934572877, 17777188402634189686, 11688615314691277560, 5613634717561556402, 99293997352733151, 4641048264628364064, 10453514483181846641, 1290992838422522292, 1652879052062614258, 12559634219275278239, 11344475397534544312, 4122197572510879508, 15407253393194772940, 2851848389283930949, 11702605024239517145, 1998109451585880901, 585739809492349094, 13332688213147014025, 1333400193073781990, 8814857714812706426, 1361027555808818653, 5346936254995238101, 8929045628408978585, 14294118012339765875, 580999813345182728, 2469249211011993887, 9026977856739391370, 4386750069800107475, 10598485069506239844, 13751116549494668150, 5108328399444950450, 17844111358351956213, 6869486424216496389, 12517021987770120609, 7851907349568758598, 18010894049048312095, 16693413552305953061, 4804538971513236292, 17649433461619154043, 11634860025288790992, 11313962652641817505, 855825648432312573, 13762197753828465221, 5743720479766949980, 3952939840611939921, 9604762177227689240, 8138871928234011911, 11384225568855102440, 9154844205260484435, 14664846725851493074, 2924959973998026295, 12642953022837695767, 429476535988054822, 17383573277674600677, 1883220378389933149, 8503069890613114305, 0, 1055478707828467235, 16768526919827857497, 17573593815267411876, 10818335527229137478, 11942460420815768259, 11201145811561632930, 5337320314888759058, 11378469682479349365, 8043644167131082885, 10448639655673781918, 12631760754265391769, 7376593749874885103, 16058512323740159729, 17873088011118479782, 17353196649080642803, 4721598436263747464, 11599468651034345541, 14009687636872815249, 7066071671554154790, 764975448091728428, 390750909719918391, 6065087221876806603, 15179557481995246257, 3787608625370371137, 2510512133707130589, 11690776235517962509, 1719109731839136237, 11166959267981414839, 12815587692045090980, 7859047597365690811, 8496939594631729748, 0, 164, 6093021124582015914, 375332441348258328, 16597900739273350797, 16788616498952461620, 10323894478242846558, 3730474644926313294, 17377183878976452334, 12746711269593150718, 13699107349734059694, 421533440407219618, 15109303318896079214, 17746438429032263850, 13224617406323308041, 5646455969610140563, 12626985742338481481, 14497665384991648640, 13894375308737560134, 3268393834564630675, 13312171511942754529, 611321250913478210, 12048873764879264902, 5334026694118161468, 14360341460112568406, 17654490467796517057, 1299716947845207044, 7609683397541157642, 14709808073905360012, 11742139955633481423, 13522070698443062110, 12847434483856017691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 9722920045405101283, 3813457227114323323, 6994299592571856765, 5702578803007136341, 15311994542782308321, 15962779709098309522, 3251959243165075337, 16837525512190061999, 5255873350627198987, 13662096656243952301, 1237772870699038471, 14338999341360692181, 14673770949791486715, 18097642912412713810, 10340874988740490351, 14305190726983389511, 16952069533520764759, 1485150603424506365, 14762405621252678105, 14445929105909601636, 16354500586064479473, 17536697575147489470, 9606769581569578625, 16440689431974469334, 6912749596454005081, 18063649775432527150, 14363667461722498847, 3204687512694590580, 523131765818647386, 13905210272577125578, 1524835811237900732, 580999813345182728, 9441246971154186623, 10597412231254617917, 11056066896847582412, 926831815845570768, 15146036891941496142, 17796585342020107437, 14725691510160207757, 13266683287137316598, 11211493525824266688, 10363424299958068143, 16931617059033676533, 10317747226871568657, 5507137035801773730, 15150382077316258576, 3011814040489752698, 15693519808819939877, 3749972803617457769, 17618989739824101716, 16792606508352577565, 17343623425168465586, 7527635805457035516, 5997951179959432212, 5020084506774034519, 14024972486716132755, 12302404123334003808, 2455930810486398184, 3241163780490493161, 10543436976244887593, 13682516968888804929, 11574410555278975115, 9471994857288690980, 0, 8501616449138218092, 4292185681439734302, 7698449017624504359, 4120049919115121735, 12642019494772420219, 14296370119911864390, 11592997338406165909, 840282323232377843, 12539549423037404132, 2113471727240446420, 14684696359318715547, 10727937735414582667, 8692606315144869678, 12960248188949622509, 5257625079275344763, 13015387036798755754, 856522523927216338, 7257469808648011210, 16558963709047870874, 12450766651322475975, 13636667172445831102, 13577724383754573439, 11193936901615452288, 7697944572311111481, 3932182442483072865, 5392781400556584604, 17762170874626363624, 15703610354425254697, 12391508132885235615, 8620148927055889210, 18000133586140028187, 0, 41, 9617260353707541367, 9187825164453421957, 17649953659489375797, 6396310504287885774, 17019569090864760371, 870218876784769460, 17213560015461715510, 16812494438448165271, 15885717661613279263, 2958950328581697287, 14311601477626423214, 12599125587081655507, 12078599565132475515, 3332808335850364509, 374688056722968094, 5591521890390007231, 9584980789501913045, 4066644474875437132, 17728945623551220217, 1158050506628066296, 3730734784735709807, 10671987699715228843, 3173999018565335463, 14949604462817069254, 11653871972148380806, 312408327658285690, 8531928004921347162, 98858158429688394, 6167334615107562354, 1234843923022284190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 5767416489550511608, 2886498774908945457, 15711135636713186135, 17215236981565434804, 908232164244690453, 5342947965117461497, 3199707432515651559, 12254673123217560222, 15216440457821236670, 481214964859672572, 18319684398448937806, 12603763899442623918, 10439805318219614253, 3602725314699933855, 8845316204090048147, 7271929134996712285, 13774466749383009485, 11005842405313098356, 14132576890947137734, 14321220139057541288, 6232608833314116824, 18436966792264288712, 1379169538700861503, 12062619363135681450, 16153824494526799043, 14882639257257424707, 6766308366816242208, 4464924001417791506, 4566463403740325912, 1351933157961486422, 6763063898149860947, 580999813345182728, 2469249211011993887, 8653818256660346722, 821691781470963977, 17943701130779573558, 3491480252041350267, 16358518409573919398, 16267496100921628089, 12162679553338055516, 1260655305474572880, 9540238327664971413, 15435832236802784694, 3812327996641515614, 10851655192011526024, 10610490743746459257, 13300292692349174603, 10113218173788314502, 10969265948996096203, 6220402056944103440, 3968382988012899732, 5018759638511748755, 2202263529713616511, 12948196389634753645, 3608565717871609608, 2453582700597880552, 2749677163981800836, 7973159619665332708, 16804313747076081769, 14670346996245963865, 6184594554218323809, 17786267665435354569, 16948092911786303144, 0, 140232881496783361, 10299881888812700030, 13506878991346097494, 14759589214631061464, 7301829639095749904, 15244303073312648502, 18132523245900274389, 2494235991830255255, 3432426521039531155, 7122756551450847884, 5549456538037663492, 10046538650654098331, 15912355352055409492, 17727271824480331481, 6704708084565647373, 4884177682333066524, 15210444525259934523, 3029374613861219290, 4615876382287073253, 7423511914796799812, 15469469226126445149, 8382746819546300959, 2890705529596562428, 9630719428827082769, 13318034444579216655, 4682383242810761218, 14195663397355254272, 12064640095342720771, 16112425486122001154, 9666454503914171857, 10680190414005925338, 0, 41, 12529483521877137515, 4671467226762388980, 13873740979092621907, 12847173262736205772, 2640423636460273022, 8374058502362870155, 7630996533587302384, 3556075572123538464, 8078558398785937163, 5856098383496092000, 7999607615804135893, 15509992149354799776, 13785560116650003734, 8358196300413379173, 10412508239405514928, 7840142081125036731, 18075062342410207477, 18173191150607640442, 2133036585496843963, 8931901040624025193, 9454731621283026961, 5837806564591410604, 5850596656185029719, 296117354535505751, 8985195681813998404, 1975947551471322175, 12041110943945791333, 11648250496545232642, 7830634726555216225, 5266777994490151623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 16299911835839227190, 7439600795053578285, 17764699242312753117, 72379023848321437, 3840146011074602084, 10358472899138824122, 8678403567076310671, 771969030954554421, 17107733370651064258, 3926130618298284866, 777766613761440792, 18302679616424742231, 4399658422830000888, 14586568436552896239, 7848898512724128276, 16028822053598615935, 7613061892596625462, 13083593386467993284, 3013879140705624968, 17693711337466712468, 5033175548360176402, 5071731402891436170, 7353230019346707888, 17252905843818454714, 2640505909682592156, 14567186806364265088, 11858169615721049009, 8265106158072298997, 6616889263695345418, 11403119304603636779, 2145158521494695437, 0, 145249957631262975, 2401047653221911346, 4346621156346694740, 15690230013100567693, 12052213250462948496, 4313034443454791583, 2986358406776419767, 3160744395414731040, 14031039024085093183, 3877496541600093734, 10720145895975203640, 14936894451943192844, 4924903395035620384, 12381787083236736442, 12547862058645445192, 17342901573615257923, 16441368248785967826, 16642290968979905665, 8400425547892097127, 8935168685033341816, 11133810960521952919, 7535134649436940418, 5752598619104470273, 3942368633516548816, 15338087145388864340, 12628972628903398239, 13438747263841181181, 3139557918845001204, 1597138777695243925, 15852581941664405912, 12566536223313831832, 12566536223313831832, 264740454002249144, 5070319740822484234, 11549475095918428048, 9819109219817742568, 5677600078177657746, 250382926802577021, 3413687351079729358, 6870174020804907583, 2950358385880233426, 7094567085672854808, 14117325213115724257, 17249265058838620523, 6364580434745257188, 16537587825367420675, 6255602063998060074, 1816448877154048697, 1665145345483041546, 14003506401044241980, 10434287967974565457, 9500338696261382317, 13133067026913450803, 11258578054901736835, 14430869544081691912, 8503613085408412261, 3343513116649617296, 9343508596961576512, 12753874820303454617, 11936680880561889502, 3422498555177881379, 17255066275290727039, 2339032462720454103, 0, 205, 7876112718273244024, 1276143811675585923, 9993912342918529935, 16999254614849428545, 8194747920293058753, 11171758628037424552, 8208119826419095432, 5568149314099479773, 17551537772960996556, 12651683228606533001, 13584145944854843210, 12212300608708011466, 18102951610480561318, 14720258372954226591, 15448472262117068008, 10575290756167155008, 11997391634424499349, 9879556170680135793, 12373753045781314057, 9529470285212177396, 10620662102176580756, 10199402949196411787, 9825825353570660203, 18337390924518345383, 15945306792731206141, 10537181099344133724, 5505106000120813030, 14774803975376978777, 14575654492591748955, 8207377881872409730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 13742292427306144985, 17809381881860746878, 14185813834021479236, 2902380466328372776, 10999219428618119040, 9481695403573415070, 17673131597834433577, 12696786409220765700, 15592207435049660262, 13736774864431335246, 16717684302941853782, 14364466680417169443, 12260890044409800607, 17206474997006265051, 5035815000061711911, 9674580830266028521, 5580437753203777486, 15970593365487106653, 4096979907706804740, 15051763954056533599, 6913739807603556015, 9886633434535102281, 844824200045222171, 8033531154978796131, 17667639225113520026, 5672989858483365109, 2139538828134465604, 14154439558213594386, 15349070088087119300, 17443416980221933050, 10234632751699861532, 0, 13943995520284385472, 3038244952392737403, 2166498267314208258, 16766052460675760559, 17479836829311383480, 2421503110457951828, 4244078595888625427, 16470951341042419630, 10761733147329482159, 13363868789360680527, 8361105415211156204, 1063676068352620466, 15563346705142691804, 16788006368298087947, 1542676998191593053, 3303936282197422453, 6962236012055562966, 10808278092072460642, 5434427870325080160, 5951881526364525804, 10397118299016726484, 17744715934780154469, 6560905318933416747, 9119760857355898684, 12080225949269433371, 5462523753418276656, 4395579796774914984, 5461299377107545721, 10515379984412735135, 1357729935919477555, 4049192570105751375, 4049192570105751375, 2092801171489897510, 11830947885319956418, 7737209888784159602, 13533379427213586747, 12969897466948219293, 4397768078443292399, 11254764769292894033, 18099434164004083138, 2485855531816604722, 13525894453675963834, 8196759787025064775, 5345512927193726757, 10899057564736574513, 18177523421240333385, 5914611942628028009, 15108016113357317953, 1860837626615492164, 2201407520096262430, 15072295315432912557, 2703103454418315711, 923818922603460716, 18443738463070648510, 9827923975568229619, 11004068350566519627, 3092487934656948277, 16549791451828015234, 4910799883829461137, 15606093107492977367, 40421079456104423, 33594342817809819, 16993857945986913175, 0, 164, 14482187202392982684, 17682350329754313417, 66214439016909251, 7504629639084879386, 11708178258767948919, 188011405648496761, 10242982970375452289, 16510140404231294235, 13381084464566932690, 9239012175869487665, 9339694231140180875, 9917181315244873380, 17448534469581521177, 4965043893766771965, 13305445405772227224, 6963375374275021656, 4554518835153561582, 1694446457415578298, 4604616361036784646, 11439774970058559661, 10784225701912607868, 17782855612978839775, 13368223431578003475, 18100595786373494652, 12753204151452870283, 17504098334052422651, 12896535568794110034, 7402084190222773115, 598469278842686486, 5912604878679295331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10801573669330193043, 4014163844046372573, 1979187468149850032, 7068929233685234045, 6627279045165985143, 956116317527270230, 11757065279852506121, 1740402123045436483, 10251517583944092682, 5551917630030385122, 65503834883425781, 15453754233876106148, 10203814174951024159, 11998108441263059891, 922784102208491029, 17685677737193760186, 5204010590575197441, 3224334584493279137, 12733973074113146504, 12628586848138973198, 9618350092243669634, 1435727158819410801, 6720472488718189255, 8476570694128937109, 7307051990735150855, 15061013104031335890, 11522811345813436372, 4676228375886937826, 17477781110059685856, 9362502897182671987, 11254953448960768625, 0, 145249957631262975, 8386361303932939763, 13068211219747943554, 10741543262911175860, 16819603317278983686, 5783881320200053288, 18417524745718206114, 17717239843479976187, 4030689483576599003, 879151411992161296, 2779769903465702190, 14759893362240473482, 6691146416202555339, 11287199716539837261, 11126920347653441896, 12376075663235117060, 17793881754348373966, 2747583073029700026, 10825449445092551825, 5205786761888799519, 5879451121482504957, 8279206964799001491, 3768506969286097604, 10538414058473986667, 4512042016117019806, 9367766578866915876, 12466325711864282871, 4805225664863956509, 7450238737884914862, 7510284002737324288, 9029012768772075486, 9029012768772075486, 16998693837234676944, 15125640082304919550, 6110574402514906801, 4404297180800676786, 4728227612288081644, 5806909779738895718, 13841571116725704679, 10405162090868595527, 1295701329370151493, 15339349621927026708, 13512312828114051231, 10968291943912870575, 2665224526083019926, 11454603613487247488, 18085989619482158634, 8156733875584402577, 15725343254588574135, 17190667807892286789, 4147804706937142458, 13843504867107001118, 13430940141760251552, 2236397580466830219, 3736249992832820982, 11869484276361150688, 939908675643132953, 8795331189349109030, 1903118753742396596, 10434554919272483089, 15053297738150165437, 12279517140635782046, 8264942609101286638, 0, 41, 3800418813655617572, 14503408479575576010, 10553169970007645345, 4946745422622378051, 7127828976000219721, 2687285609278369395, 16630221959750548176, 1114885198959805561, 3895092647933222339, 9831397389014117600, 12816842684293233323, 1779119880742935864, 17663607747965229138, 5382558247959552902, 11972955750871888364, 16616426694032134438, 9711126273890628516, 376576173107709408, 12451218545182255865, 14301764572821220192, 13209253693600827240, 5745169166190656073, 12916752429524642864, 14463770325561420619, 7870235520772452232, 13278341252249613603, 5432056100901092307, 8994645443800925562, 5908996313982662075, 1494658977663487041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2688488582456733640, 3176173060019065635, 18309940476973301558, 6936565830330512698, 6894736762296179522, 90344116647093812, 7242437296897104684, 6840278566006653320, 12841299952034848927, 13801531974995903464, 3431188141752586880, 6945555547969535469, 16385619022525424479, 2302137229552580420, 3562300556391111858, 18050279212829828519, 11845451884839552921, 18010307414852664162, 1572578420442156655, 12278794746552983052, 7729016306498836651, 17389954356356902848, 14310782857892986700, 16540335065460741454, 9418678319655461294, 9662888408142346895, 9673811223372787800, 16236416741726566504, 1941798973941376537, 5283201687609097620, 677503724821015517, 0, 13943995520284385472, 13893715067188783613, 3737686312150097138, 6408571846489205195, 5309320507954343198, 7907473214578333250, 3220998093077600799, 6474302970739201787, 16744589822124330786, 15338963790186860624, 12429535237881910980, 4353091614275483153, 12430118441204168389, 15563175998310034114, 7172174870857485673, 2253621527545508840, 4507428390885076546, 2693291710499435080, 18303680792619501937, 12658208632913334575, 18044025142180450635, 14512997676069758708, 6038828855361889649, 16387791750090568457, 2816243451374973997, 15990457456638139626, 5938146028305439666, 8292027417405396428, 12456535987381445341, 4686309106959500238, 9680729728072440816, 9680729728072440816, 275926701951807482, 2368214261414429154, 15583218305860063073, 12342565443853005153, 7791191498940082574, 5368134609913732769, 18241043179323819051, 6247074573395806345, 7865016694973943467, 13276760677885131566, 12501576801121215107, 14003841288523724393, 7706369500077994851, 14277720092332100080, 16831403894744601879, 9685715221108858847, 12090932747658876990, 15574096712669166429, 16819229186816553924, 3675188622214856303, 6131072316753506600, 5455404512357596637, 3180536826353817667, 6733192297441041488, 3057140685660277923, 15037300764129498232, 12789460187938846931, 12722152077589496357, 5754948178406885282, 9383881360936187956, 10120172904062862410, 0, 41, 13092032916490151270, 2856458557507854671, 14059661153766146178, 1724041303048776424, 7119687853704366589, 3699246950542313036, 8338994289155538949, 7732171807197958061, 10653644351656999339, 15262849800927670044, 6132373490633371091, 16473831322001214578, 12928938600331453669, 6959935525856744214, 17173069020016176920, 6747622983845354522, 2484033613426731933, 9879916419081378373, 4275250202523893223, 5995505684018086986, 16115855409799741127, 2490003355474156145, 10034475279304353355, 7223217715426381376, 10334063888823214988, 2139000562522371457, 18314119367638727156, 15311716904301189063, 894706229073498557, 1570146104298050273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(88) }, program_info: ProgramInfo { program_hash: Word([6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 89, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 0, 9, 0, 1, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 8, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 8, 2, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 8, 3, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 8, 4, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 8, 5, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 8, 6, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 8, 7, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 8, 8, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 7, 1, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 7, 2, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 7, 3, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 7, 4, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 7, 5, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 7, 6, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 7, 7, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 7, 8, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 6, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 6, 2, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 6, 3, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 6, 4, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 6, 5, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 6, 6, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 6, 7, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 6, 8, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 5, 1, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 5, 2, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 5, 3, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 5, 4, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 5, 5, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 5, 6, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 5, 7, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 5, 8, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 4, 2, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 4, 3, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 4, 4, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 4, 5, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 4, 6, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 4, 7, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 4, 8, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 3, 2, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 3, 3, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 3, 4, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 3, 5, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 3, 6, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 3, 7, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 3, 8, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 2, 4, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 2, 6, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 2, 7, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 8, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 1, 3, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 1, 4, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 1, 5, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 1, 6, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 1, 7, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 8, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 1, 1, 1, 4539061041759240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 7, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 8087083728976074902, 14294118012339765875, 1524835811237900732, 6763063898149860947, 2145158521494695437, 10234632751699861532, 11254953448960768625, 677503724821015517, 0, 0, 1, 0, 0, 1, 1, 0, 0, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 14537741408767373410, 15771729313541940903, 16254963956836991015, 2046774012797929459, 9448749568492005186, 8503069890613114305, 9471994857288690980, 16948092911786303144, 12566536223313831832, 4049192570105751375, 9029012768772075486, 9680729728072440816, 0, 0, 0, 0, 0, 1, 1, 0, 0, 4539061041759240, 0, 0, 0, 0, 0, 0, 0, 12566536223313831832, 4049192570105751375, 9029012768772075486, 9680729728072440816, 0, 0, 0, 0, 0, 1, 0, 0, 0, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 1413881954865567393, 8496939594631729748, 18000133586140028187, 10680190414005925338, 2339032462720454103, 16993857945986913175, 8264942609101286638, 10120172904062862410, 0, 0, 1, 0, 0, 1, 1, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8488924048752676071, 7132218559010351790, 18152833202936203138, 302695496926486902, 13622702382434675698, 6093021124582015914, 9617260353707541367, 12529483521877137515, 7876112718273244024, 14482187202392982684, 3800418813655617572, 13092032916490151270, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5473488137200086909, 2687466917280430353, 10305147718805144715, 16415403596737407938, 8941567408770445183, 375332441348258328, 9187825164453421957, 4671467226762388980, 1276143811675585923, 17682350329754313417, 14503408479575576010, 2856458557507854671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16124688533662466636, 14170238607512888511, 13246631902503555591, 12969246825596557956, 2168342371250989865, 16597900739273350797, 17649953659489375797, 13873740979092621907, 9993912342918529935, 66214439016909251, 10553169970007645345, 14059661153766146178, 1, 0, 0, 0, 1, 0, 15754956633454945151, 6055713190940499638, 11077250730155763388, 4527044298581192722, 5453168895411602323, 18142351346900318359, 15965643470182086386, 17553704974699598306, 16788616498952461620, 6396310504287885774, 12847173262736205772, 16999254614849428545, 7504629639084879386, 4946745422622378051, 1724041303048776424, 1, 0, 0, 0, 1, 0, 5043375237696906583, 4379507338442738151, 10191347065326962634, 15470787238396171217, 7649138216344653830, 3098698980745497723, 7317402970608805914, 10652219805906948351, 17377183878976452334, 17213560015461715510, 7630996533587302384, 8208119826419095432, 10242982970375452289, 16630221959750548176, 8338994289155538949, 1, 0, 0, 0, 1, 0, 27564165777955823, 2554423200420703486, 17579160449292996896, 11147561538212402733, 7271583017513514692, 11194864417357882388, 5717939852331496040, 1428764500637505382, 421533440407219618, 2958950328581697287, 5856098383496092000, 12651683228606533001, 9239012175869487665, 9831397389014117600, 15262849800927670044, 1, 0, 0, 0, 1, 0, 12554774560852918121, 7558057668449617622, 8341229243444900158, 11546140485006286209, 5702916883024911354, 10059737158050223658, 15942512744234440774, 2751093334206085539, 13224617406323308041, 12078599565132475515, 13785560116650003734, 18102951610480561318, 17448534469581521177, 17663607747965229138, 12928938600331453669, 1, 0, 0, 0, 1, 0, 6754601476785640702, 7736060991620510625, 1449884785010881379, 6135983205453599776, 9277341930384005575, 17852936504841763737, 15508051727969296111, 11875658036026604145, 14497665384991648640, 5591521890390007231, 7840142081125036731, 10575290756167155008, 6963375374275021656, 16616426694032134438, 6747622983845354522, 1, 0, 0, 0, 1, 0, 7929723072429044254, 16334448815751507577, 4434638168235316685, 17199894398730562705, 13653108884642243926, 18423338781077887809, 810875278274469351, 5684565403642367050, 13312171511942754529, 17728945623551220217, 2133036585496843963, 12373753045781314057, 4604616361036784646, 12451218545182255865, 4275250202523893223, 1, 0, 0, 0, 1, 0, 8602814005182217200, 9971451726661298505, 15671763834046105438, 7369439734883755459, 15167316901472929028, 9594540064387516595, 598273005722510655, 5216498913603536417, 5334026694118161468, 10671987699715228843, 5837806564591410604, 10199402949196411787, 17782855612978839775, 5745169166190656073, 2490003355474156145, 1, 0, 0, 0, 1, 0, 1420030357616461150, 0, 0, 14515762120928230173, 8611475648437961511, 7809934763889573038, 12653867244112536729, 5258230180909223265, 1299716947845207044, 11653871972148380806, 8985195681813998404, 15945306792731206141, 12753204151452870283, 7870235520772452232, 10334063888823214988, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13610167819530098127, 10900065459953722709, 18341122838405415754, 3153753366153954420, 1124366766375746940, 14709808073905360012, 8531928004921347162, 12041110943945791333, 5505106000120813030, 12896535568794110034, 5432056100901092307, 18314119367638727156, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11215445033353754262, 9162692523043045302, 11967784234256998242, 12197142511433562971, 9116801986360376826, 11742139955633481423, 98858158429688394, 11648250496545232642, 14774803975376978777, 7402084190222773115, 8994645443800925562, 15311716904301189063, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8081237365032914784, 17462008412377898139, 10761804868734649587, 13557680898519201450, 6650575029061305823, 13522070698443062110, 6167334615107562354, 7830634726555216225, 14575654492591748955, 598469278842686486, 5908996313982662075, 894706229073498557, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4539061041759240, 0, 0, 0, 0, 0, 0, 0, 12566536223313831832, 4049192570105751375, 9029012768772075486, 9680729728072440816, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3330424775026476592, 13633250484821623215, 16565837043221829196, 12610063329678779487, 1406583001570465792, 16768526919827857497, 4292185681439734302, 10299881888812700030, 5070319740822484234, 11830947885319956418, 15125640082304919550, 2368214261414429154, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7732229819737520946, 15098993065726469111, 52948362219275850, 9599099202048490781, 12562663752152469569, 17573593815267411876, 7698449017624504359, 13506878991346097494, 11549475095918428048, 7737209888784159602, 6110574402514906801, 15583218305860063073, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12659763553976530720, 1564281538360678972, 8677964002070154388, 7298046952032101196, 16633851142346839330, 10818335527229137478, 4120049919115121735, 14759589214631061464, 9819109219817742568, 13533379427213586747, 4404297180800676786, 12342565443853005153, 1, 0, 0, 0, 1, 0, 6508846668869650000, 17336912220865242963, 2268843052628052976, 13820936547498519501, 7168328730833322865, 7428484016288157022, 16026473122383984320, 17021480690231868718, 11942460420815768259, 12642019494772420219, 7301829639095749904, 5677600078177657746, 12969897466948219293, 4728227612288081644, 7791191498940082574, 1, 0, 0, 0, 1, 0, 15837335187878938475, 5466507011147170445, 11650170051303322910, 5030538143349324000, 13591172423217881213, 7596566350181367049, 5410472981661512575, 12021280163646879782, 11378469682479349365, 840282323232377843, 2494235991830255255, 6870174020804907583, 18099434164004083138, 10405162090868595527, 6247074573395806345, 1, 0, 0, 0, 1, 0, 14897033870199487714, 13140683236260271155, 14159644452561526580, 5695604368834329320, 1007570544942142144, 5033691822950904881, 5904063656561684665, 944699227762067814, 12631760754265391769, 14684696359318715547, 5549456538037663492, 14117325213115724257, 8196759787025064775, 13512312828114051231, 12501576801121215107, 1, 0, 0, 0, 1, 0, 7883221524574062887, 13183696492710529508, 6213114786013009576, 8078757315035365696, 9498329046798837348, 6115393411247877634, 2891811661249932042, 14704623317114553828, 17873088011118479782, 12960248188949622509, 17727271824480331481, 16537587825367420675, 18177523421240333385, 11454603613487247488, 14277720092332100080, 1, 0, 0, 0, 1, 0, 3351410150454291730, 16279278462051668121, 10035562370865624816, 9729162786960114112, 5981274731275683258, 17197119244649549383, 16735389142514185239, 17342022136955130751, 11599468651034345541, 856522523927216338, 15210444525259934523, 1665145345483041546, 1860837626615492164, 15725343254588574135, 12090932747658876990, 1, 0, 0, 0, 1, 0, 15032980823283040232, 2668283458286770416, 12407409512729445019, 3179630577014811908, 15292824893734897630, 3136236054167912163, 13251084164183215555, 9877562264475108305, 764975448091728428, 12450766651322475975, 7423511914796799812, 9500338696261382317, 2703103454418315711, 13843504867107001118, 3675188622214856303, 1, 0, 0, 0, 1, 0, 6987334820542205177, 436417979830380839, 13177538606264077422, 14999066466406693845, 15059493462076997690, 11340220366618064719, 6580507474643651363, 8487705884637814572, 15179557481995246257, 11193936901615452288, 2890705529596562428, 14430869544081691912, 9827923975568229619, 3736249992832820982, 3180536826353817667, 1, 0, 0, 0, 1, 0, 7020168012590274751, 0, 0, 17453232571701437290, 5021883210577128063, 5496590912397587492, 6693558341526111425, 8847518126511086492, 11690776235517962509, 5392781400556584604, 4682383242810761218, 9343508596961576512, 16549791451828015234, 8795331189349109030, 15037300764129498232, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7539745443808178835, 9884045457320590091, 8382695108894398131, 5283201688561864115, 11767201095350394052, 11166959267981414839, 15703610354425254697, 12064640095342720771, 11936680880561889502, 15606093107492977367, 10434554919272483089, 12722152077589496357, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14554316550668318802, 5367026278670357791, 9643181922175718153, 5334752974852163097, 11260389542763349256, 12815587692045090980, 12391508132885235615, 16112425486122001154, 3422498555177881379, 40421079456104423, 15053297738150165437, 5754948178406885282, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15063345752223211733, 8499294198486805672, 16042312733989464482, 451731299183430202, 4551861726624713720, 7859047597365690811, 8620148927055889210, 9666454503914171857, 17255066275290727039, 33594342817809819, 12279517140635782046, 9383881360936187956, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 1413881954865567393, 8496939594631729748, 18000133586140028187, 10680190414005925338, 2339032462720454103, 16993857945986913175, 8264942609101286638, 10120172904062862410, 1, 0, 0, 0, 1, 0, 0, 0, 0, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14568136944800275082, 5693535723676280393, 9230767544379437105, 1921340627054025915, 4826001026438697181, 9026977856739391370, 10597412231254617917, 8653818256660346722, 2401047653221911346, 3038244952392737403, 8386361303932939763, 13893715067188783613, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12559996978644727669, 9307941706856421244, 18310630857442586767, 11168366585808691894, 13927464871572189232, 4386750069800107475, 11056066896847582412, 821691781470963977, 4346621156346694740, 2166498267314208258, 13068211219747943554, 3737686312150097138, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16006034000059690936, 17583976365434994224, 6798288544665969845, 16344827155364741241, 8487031467837880959, 10598485069506239844, 926831815845570768, 17943701130779573558, 15690230013100567693, 16766052460675760559, 10741543262911175860, 6408571846489205195, 1, 0, 0, 0, 1, 0, 9144131815937747872, 3342878222920529613, 4791714562823606942, 15808130082429351686, 11956256213068276591, 12649659004750065655, 13917605778022436041, 7953084218463226909, 13751116549494668150, 15146036891941496142, 3491480252041350267, 12052213250462948496, 17479836829311383480, 16819603317278983686, 5309320507954343198, 1, 0, 0, 0, 1, 0, 1038103851795962350, 4430605040022927656, 16365904851233496502, 894576452673648096, 1340502547894095473, 12601220862983867223, 16222497246401579549, 16644535012971742472, 6869486424216496389, 13266683287137316598, 12162679553338055516, 3160744395414731040, 16470951341042419630, 17717239843479976187, 6474302970739201787, 1, 0, 0, 0, 1, 0, 16229564526704673406, 10174200792466558210, 5132793225392427293, 9980680059887464609, 12726130892030271688, 312583470408719867, 758472841121971562, 14563339716269964045, 18010894049048312095, 16931617059033676533, 15435832236802784694, 10720145895975203640, 8361105415211156204, 2779769903465702190, 12429535237881910980, 1, 0, 0, 0, 1, 0, 6215541400981523569, 1953204460931882521, 12589335010609790225, 15843714178786416863, 3287199712077657921, 1991947075903969606, 3767440642589974121, 3375764636979625919, 17649433461619154043, 15150382077316258576, 10610490743746459257, 12381787083236736442, 16788006368298087947, 11287199716539837261, 15563175998310034114, 1, 0, 0, 0, 1, 0, 14427469169104333761, 6340093208524402435, 12262828500061219108, 3395211782606276051, 14508720026418909433, 11172295513373146926, 3431797671267201506, 11592395684445633353, 855825648432312573, 3749972803617457769, 10969265948996096203, 16441368248785967826, 6962236012055562966, 17793881754348373966, 4507428390885076546, 1, 0, 0, 0, 1, 0, 14592383679640689303, 1910163776289539337, 13338365197478444082, 3112263678112869121, 9793349915183632648, 166719433298183890, 5274326486456948617, 15838446667082529291, 3952939840611939921, 17343623425168465586, 5018759638511748755, 8935168685033341816, 5951881526364525804, 5205786761888799519, 12658208632913334575, 1, 0, 0, 0, 1, 0, 16738660098177737227, 9829750214121427853, 12484115052089468332, 15237271270752782119, 16244276080775719304, 18103925836791549846, 15867602839234938544, 12094773271668234643, 11384225568855102440, 5020084506774034519, 3608565717871609608, 5752598619104470273, 6560905318933416747, 3768506969286097604, 6038828855361889649, 1, 0, 0, 0, 1, 0, 75223512047035789, 0, 0, 6870828195219142669, 2520783628599955940, 7353009946795117330, 17045986882743664444, 14360904859585829753, 2924959973998026295, 2455930810486398184, 7973159619665332708, 12628972628903398239, 5462523753418276656, 9367766578866915876, 15990457456638139626, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12714099020863010695, 12314456283572504356, 469635739213563567, 4147903628926627533, 13470963638813042195, 429476535988054822, 10543436976244887593, 14670346996245963865, 3139557918845001204, 5461299377107545721, 4805225664863956509, 8292027417405396428, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5224376302272959154, 6535409800777915487, 7901122908367659010, 4079954944710007123, 13830904396796715875, 17383573277674600677, 13682516968888804929, 6184594554218323809, 1597138777695243925, 10515379984412735135, 7450238737884914862, 12456535987381445341, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14781572642473112572, 11268362592956912536, 5766087612434108876, 10588667258124334541, 9960013932953480218, 1883220378389933149, 11574410555278975115, 17786267665435354569, 15852581941664405912, 1357729935919477555, 7510284002737324288, 4686309106959500238, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14537741408767373410, 15771729313541940903, 16254963956836991015, 2046774012797929459, 9448749568492005186, 8503069890613114305, 9471994857288690980, 16948092911786303144, 12566536223313831832, 4049192570105751375, 9029012768772075486, 9680729728072440816, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2990417547231451768, 11606517949721719272, 17598947928349150032, 14580412695609233024, 13599348264422318050, 69556848653847272, 3813457227114323323, 2886498774908945457, 7439600795053578285, 17809381881860746878, 4014163844046372573, 3176173060019065635, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8200055882763834902, 8595871163399933719, 4957589343064393818, 12971821499548943886, 9048627971498202333, 2279577280749402753, 6994299592571856765, 15711135636713186135, 17764699242312753117, 14185813834021479236, 1979187468149850032, 18309940476973301558, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15107023413552199376, 7763683116636157069, 6242447045300438422, 12942151567717980516, 4616644171576346372, 6239043535079259963, 5702578803007136341, 17215236981565434804, 72379023848321437, 2902380466328372776, 7068929233685234045, 6936565830330512698, 1, 0, 0, 0, 1, 0, 528576776446583989, 10409606060068835052, 5784423647953917837, 8385687432658166895, 838997349906846708, 4795761656943466364, 293990104348951469, 13446530094027973481, 7823300322844699129, 15311994542782308321, 908232164244690453, 3840146011074602084, 10999219428618119040, 6627279045165985143, 6894736762296179522, 1, 0, 0, 0, 1, 0, 12380241214066733373, 6763481784501978893, 3664971892418121107, 11139320331324068031, 8111388737755370581, 11627377236417283134, 11966816476348176754, 3589365582169471582, 12959563699934572877, 16837525512190061999, 12254673123217560222, 771969030954554421, 12696786409220765700, 1740402123045436483, 6840278566006653320, 1, 0, 0, 0, 1, 0, 8758598539355441563, 14327797909354101607, 3238487269456306309, 1252671640222326947, 3118134149246226434, 15205984627333468001, 11534859557249128228, 264848703107953315, 5613634717561556402, 1237772870699038471, 18319684398448937806, 777766613761440792, 16717684302941853782, 65503834883425781, 3431188141752586880, 1, 0, 0, 0, 1, 0, 17573171947292431650, 6692160042088053455, 9889382861130386235, 4014227156326565798, 2305040771202529034, 4569674865772026702, 980116766328138766, 891801733175697187, 10453514483181846641, 18097642912412713810, 3602725314699933855, 14586568436552896239, 17206474997006265051, 11998108441263059891, 2302137229552580420, 1, 0, 0, 0, 1, 0, 11214541640256768195, 1456276470065412101, 3012063381053750362, 17477853997594743235, 4667652151526467516, 14709859391037291514, 15576478276301900443, 5288871968538360514, 12559634219275278239, 16952069533520764759, 13774466749383009485, 7613061892596625462, 5580437753203777486, 5204010590575197441, 11845451884839552921, 1, 0, 0, 0, 1, 0, 10349408106071310053, 10035088333115331288, 14142664761481779532, 15706959181585180523, 15750389702075093135, 876174554396868075, 4889082965904642440, 14848674461360674975, 15407253393194772940, 14445929105909601636, 14321220139057541288, 17693711337466712468, 15051763954056533599, 12628586848138973198, 12278794746552983052, 1, 0, 0, 0, 1, 0, 951615792977801264, 1211405113549675186, 17985020091891048998, 15445358949429791952, 2099687338970431013, 14303982336399641814, 12393266145043202429, 14151277613136798520, 1998109451585880901, 9606769581569578625, 1379169538700861503, 7353230019346707888, 844824200045222171, 6720472488718189255, 14310782857892986700, 1, 0, 0, 0, 1, 0, 7643984727775434844, 0, 0, 14286495051698513565, 6791090761664616374, 12627603787832494922, 853764681371061454, 6760124904423015973, 1333400193073781990, 18063649775432527150, 14882639257257424707, 14567186806364265088, 5672989858483365109, 15061013104031335890, 9662888408142346895, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4315117985825319308, 17954920195441939375, 2358074803509054857, 12566827890799503780, 11226925817970638094, 1361027555808818653, 3204687512694590580, 4464924001417791506, 8265106158072298997, 14154439558213594386, 4676228375886937826, 16236416741726566504, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13180871958580017059, 6438200026603866080, 16405101789199201340, 12734261918077566887, 323561318445804460, 5346936254995238101, 523131765818647386, 4566463403740325912, 6616889263695345418, 15349070088087119300, 17477781110059685856, 1941798973941376537, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9324640818690322529, 1507262460208602102, 1581131786309040293, 13460201712649497096, 11770041052112546722, 8929045628408978585, 13905210272577125578, 1351933157961486422, 11403119304603636779, 17443416980221933050, 9362502897182671987, 5283201687609097620, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 8087083728976074902, 14294118012339765875, 1524835811237900732, 6763063898149860947, 2145158521494695437, 10234632751699861532, 11254953448960768625, 677503724821015517, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(88) }, program_info: ProgramInfo { program_hash: Word([6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 89, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_21.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_21.snap index 3aad1c0e3e..dd57e330fb 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_21.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_21.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 65, 65, 65, 65, 65, 65, 65, 65, 65, 1, 97, 97, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [16336503519826769294, 580999813345182728, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 4539061041759240, 35461414388744, 277042299912, 2164392968, 16909320, 132104, 1032, 8, 0, 16336503519826769294, 41, 0, 11006573531383828351, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862, 6965138066206642862], [9197671798777409481, 580999813345182728, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9197671798777409481, 0, 1, 10983413158656624898, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770, 12596233587871940770], [13035020452047724944, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13035020452047724944, 0, 0, 4869282124135316831, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811, 8197358252954291811], [17733790707118953345, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17733790707118953345, 0, 0, 5899798166361732461, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096, 10673667133036073096], [11006573531383828351, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 580999813345182728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [16336503519826769294, 7241595766844512545, 2990417547231451768, 8200055882763834902, 15107023413552199376, 8385687432658166895, 9658411005214642328, 4909632993745393767, 11139320331324068031, 7133947682362156748, 17192073988910191157, 1252671640222326947, 3013016866261693283, 8108123078799037039, 4014227156326565798, 12391143724758863082, 14176166539222112137, 17477853997594743235, 12238064792115483402, 14469369283093994356, 15706959181585180523, 9935807559722975979, 16381952245010805100, 15445358949429791952, 4394218334834403498, 7081942205803021819, 14286495051698513565, 1765182318039047708, 4315117985825319308, 13180871958580017059, 9324640818690322529, 6965138066206642862, 580999813345182728, 9441246971154186623, 14568136944800275082, 12559996978644727669, 16006034000059690936, 15808130082429351686, 11189427321576264326, 8056423375835200370, 894576452673648096, 1759663226535241487, 7111996287898491444, 9980680059887464609, 1246527623804764182, 15473044979114460820, 15843714178786416863, 11802722938645199711, 528524525625403517, 3395211782606276051, 4814987904082383725, 8549845730678305747, 3112263678112869121, 1192721472492662021, 5190583599302670309, 15237271270752782119, 4547129522910145518, 11550408183365383111, 6870828195219142669, 12383111777615982801, 12714099020863010695, 5224376302272959154, 14781572642473112572, 14537741408767373410, 4539061041759240, 166413184814318872, 3330424775026476592, 7732229819737520946, 12659763553976530720, 13820936547498519501, 15870553509947197608, 5797460196965489144, 5030538143349324000, 3122912243524936279, 7275337387902302889, 5695604368834329320, 14130306385452780113, 15363567770150994298, 8078757315035365696, 5442629662308931105, 16137685808790691775, 9729162786960114112, 6971938391156245940, 18003847752567480952, 3179630577014811908, 16175129257259814669, 7116272890564491051, 14999066466406693845, 11390566154350641025, 8405503273117460784, 17453232571701437290, 17122916750446457171, 7539745443808178835, 14554316550668318802, 15063345752223211733, 16336503519826769294, 41, 410, 8488924048752676071, 5473488137200086909, 16124688533662466636, 4527044298581192722, 16887055178922689595, 5249711198271717177, 15470787238396171217, 5632634005697013617, 7337408598993184022, 11147561538212402733, 9710911023591971572, 8752830793140649116, 11546140485006286209, 10738951369466640003, 2139663271495255306, 6135983205453599776, 17538856881976830392, 2031516987289365197, 17199894398730562705, 4010699482290892787, 3922552954514582360, 7369439734883755459, 108303794773646012, 14521269346803535153, 14515762120928230173, 13893962684375637966, 13610167819530098127, 11215445033353754262, 8081237365032914784, 11006573531383828351, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [9197671798777409481, 17469195903127682246, 11606517949721719272, 8595871163399933719, 7763683116636157069, 838997349906846708, 13728530742608929979, 6793201875126035063, 8111388737755370581, 14079832107643166597, 17737118927359740270, 3118134149246226434, 13627060471757962412, 587514782692598940, 2305040771202529034, 407676238176147180, 11304490035899669295, 4667652151526467516, 13681768858122081452, 17060146905316016781, 15750389702075093135, 7088767289424376680, 15640720737556518069, 2099687338970431013, 14448236636738050578, 5519067145334892916, 6791090761664616374, 420116652546322982, 17954920195441939375, 6438200026603866080, 1507262460208602102, 12596233587871940770, 580999813345182728, 2469249211011993887, 5693535723676280393, 9307941706856421244, 17583976365434994224, 11956256213068276591, 16650744379891120584, 11970932857482984253, 1340502547894095473, 17627623028259352738, 10800915493705299677, 12726130892030271688, 1966101965836764845, 8603197046817345275, 3287199712077657921, 4816347799520535722, 13726091214309035851, 14508720026418909433, 8845463819329319330, 319079387588421934, 9793349915183632648, 14664095371212951733, 7893897801913761594, 16244276080775719304, 5201962268638016263, 595824696721317186, 2520783628599955940, 849243249424286073, 12314456283572504356, 6535409800777915487, 11268362592956912536, 15771729313541940903, 0, 1073634951995504195, 13633250484821623215, 15098993065726469111, 1564281538360678972, 7168328730833322865, 9990637691333202156, 4315815088290272811, 13591172423217881213, 15655075338480513609, 996725104060870062, 1007570544942142144, 3729822968690386528, 10658087655041602841, 9498329046798837348, 14839704326644418801, 16811175179247371160, 5981274731275683258, 15610466289947195032, 14000599989678227804, 15292824893734897630, 627607295424670979, 2340223307289953865, 15059493462076997690, 16071082072689060288, 16820362574538767542, 5021883210577128063, 1555980395218755516, 9884045457320590091, 5367026278670357791, 8499294198486805672, 9197671798777409481, 0, 328, 7132218559010351790, 2687466917280430353, 14170238607512888511, 5453168895411602323, 8679138582261878552, 10871515559850126217, 7649138216344653830, 12086029516113687059, 14609582285822867389, 7271583017513514692, 3821121937809044409, 3833100151978191712, 5702916883024911354, 3579138882391492892, 14347405124134927123, 9277341930384005575, 2993137622300793545, 13370802209879109056, 13653108884642243926, 8702782587703766612, 12945832125614510830, 15167316901472929028, 4608694219239856197, 4443739924303229750, 8611475648437961511, 1575864515244779062, 10900065459953722709, 9162692523043045302, 17462008412377898139, 10983413158656624898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13035020452047724944, 4235056893170892481, 17598947928349150032, 4957589343064393818, 6242447045300438422, 4795761656943466364, 6264917032052353984, 15603723388972198024, 11627377236417283134, 6114228315229264629, 3286806106182827895, 15205984627333468001, 7321576485635388020, 17749542785007315566, 4569674865772026702, 7956650962315989946, 14478240861430583623, 14709859391037291514, 10913732310161131390, 2296203662546391134, 876174554396868075, 17404327975123101624, 2366722819671298513, 14303982336399641814, 12813527806534446210, 12774296173948151856, 12627603787832494922, 14277393185196427667, 2358074803509054857, 16405101789199201340, 1581131786309040293, 8197358252954291811, 580999813345182728, 9441246971154186623, 9230767544379437105, 18310630857442586767, 6798288544665969845, 12649659004750065655, 9127484939696035145, 3208400024176171154, 12601220862983867223, 3182150398630969932, 15946092271529760948, 312583470408719867, 1277989670489505373, 5390475388454384344, 1991947075903969606, 12041137591375643532, 17203613475518457508, 11172295513373146926, 1047366979417083402, 1230000128467178780, 166719433298183890, 9500917527157796789, 11443445413242899153, 18103925836791549846, 8328524023483162981, 16082128743854634628, 7353009946795117330, 18315678446936398634, 469635739213563567, 7901122908367659010, 5766087612434108876, 16254963956836991015, 0, 8506155510179977332, 16565837043221829196, 52948362219275850, 8677964002070154388, 7428484016288157022, 2806233373077400725, 13744878929079685610, 7596566350181367049, 8320838608801394259, 11416348334771026081, 5033691822950904881, 17904228615366476508, 1573747864700068677, 6115393411247877634, 299028171433900072, 17660677259671545725, 17197119244649549383, 11502210755699728407, 3657258890969942218, 3136236054167912163, 186206196971871344, 10885932290083514811, 11340220366618064719, 11020489504600957926, 15331358518756318712, 5496590912397587492, 14595950592094489892, 8382695108894398131, 9643181922175718153, 16042312733989464482, 13035020452047724944, 0, 82, 18152833202936203138, 10305147718805144715, 13246631902503555591, 18142351346900318359, 11971140429919100117, 6903484634638418138, 3098698980745497723, 3068992673894668202, 9164459936648953977, 11194864417357882388, 12005359455571366116, 12356306486226268709, 10059737158050223658, 17119982236602677307, 4225663824996553892, 17852936504841763737, 5778553506856942969, 9045001363359345866, 18423338781077887809, 2711240319770097821, 8346149567490270428, 9594540064387516595, 1859863665658604717, 16919987197409252682, 7809934763889573038, 12492597695329698922, 18341122838405415754, 11967784234256998242, 10761804868734649587, 4869282124135316831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [17733790707118953345, 2298049257819688964, 14580412695609233024, 12971821499548943886, 12942151567717980516, 293990104348951469, 9511447919780245828, 12096675465574714978, 11966816476348176754, 6745364430325410240, 124350208982409384, 11534859557249128228, 13499302804947319126, 2073163037044338276, 980116766328138766, 6249894809652649629, 5225655700408130435, 15576478276301900443, 7892851227093729574, 15711810664626070442, 4889082965904642440, 18118185760308539378, 14951898769476191069, 12393266145043202429, 18370579783025919052, 13670428043882183738, 853764681371061454, 11311873924545773972, 12566827890799503780, 12734261918077566887, 13460201712649497096, 10673667133036073096, 580999813345182728, 2469249211011993887, 1921340627054025915, 11168366585808691894, 16344827155364741241, 13917605778022436041, 16775788395149485828, 3448656772275438142, 16222497246401579549, 7203217594655996602, 11409282451484046090, 758472841121971562, 7818365927012965985, 7903960434340948362, 3767440642589974121, 11209692269971430929, 3035346059787720244, 3431797671267201506, 6118779023340710484, 11335358665561171709, 5274326486456948617, 5525087067228805129, 5704922620886162396, 15867602839234938544, 9623255540514358603, 6605123704860531855, 17045986882743664444, 13118883604429226706, 4147903628926627533, 4079954944710007123, 10588667258124334541, 2046774012797929459, 0, 144771942538542601, 12610063329678779487, 9599099202048490781, 7298046952032101196, 16026473122383984320, 14666633261274526329, 10912616786956595600, 5410472981661512575, 8351163137101469720, 6900106104861748151, 5904063656561684665, 16445251460715434195, 10832015734039673623, 2891811661249932042, 8924808732795308287, 4687342342302612015, 16735389142514185239, 1470376739244986162, 1819268707172544638, 13251084164183215555, 16740657538571711568, 12986569577580758510, 6580507474643651363, 14039388877064634044, 17925541740654686755, 6693558341526111425, 11597938374506256020, 5283201688561864115, 5334752974852163097, 451731299183430202, 17733790707118953345, 0, 82, 302695496926486902, 16415403596737407938, 12969246825596557956, 15965643470182086386, 14881573336337548597, 2868629484750761697, 7317402970608805914, 2570537868338555591, 6697005353407257884, 5717939852331496040, 9408357527608003903, 8011884131194179594, 15942512744234440774, 9052662470595673790, 11913271961595885333, 15508051727969296111, 6269710669185644103, 12322255659000247132, 810875278274469351, 3499523055983644139, 9453749819048496107, 598273005722510655, 12338854942180141395, 2829445891916136836, 12653867244112536729, 4648827005364006908, 3153753366153954420, 12197142511433562971, 13557680898519201450, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11006573531383828351, 4764651601843997947, 13599348264422318050, 9048627971498202333, 4616644171576346372, 13446530094027973481, 515125260461286305, 13270828405354296543, 3589365582169471582, 7410433095216666761, 17324168673998498317, 264848703107953315, 2519145233399390872, 16944105578845184537, 891801733175697187, 1917456671376826149, 2178489717179959491, 5288871968538360514, 173128619939349444, 14938204230051641776, 14848674461360674975, 3298163296153338543, 12736435946586958561, 14151277613136798520, 6993584357807298191, 17243220101971525650, 6760124904423015973, 15448478475120864966, 11226925817970638094, 323561318445804460, 11770041052112546722, 8087083728976074902, 580999813345182728, 9441246971154186623, 4826001026438697181, 13927464871572189232, 8487031467837880959, 7953084218463226909, 14357560502528070253, 9198678924697643847, 16644535012971742472, 2610427154842113175, 1362602973689891222, 14563339716269964045, 10893524038980604908, 8604291529520412550, 3375764636979625919, 4598760434596487640, 14370201798336911320, 11592395684445633353, 18428909381025170046, 7556816872757379313, 15838446667082529291, 11840899228072824840, 5666563878473838907, 12094773271668234643, 18145098371590981833, 6227739674905468508, 14360904859585829753, 6349150325802118522, 13470963638813042195, 13830904396796715875, 9960013932953480218, 9448749568492005186, 0, 143717879605522672, 1406583001570465792, 12562663752152469569, 16633851142346839330, 17021480690231868718, 8387812497337000660, 15004187181055446563, 12021280163646879782, 15544096072222322408, 132132622953814287, 944699227762067814, 15889407327776555006, 8234710954956267885, 14704623317114553828, 5225072174929433338, 9992674649041617391, 17342022136955130751, 9806643750569796986, 10854572141100075982, 9877562264475108305, 3741205325444910799, 3008635823591126704, 8487705884637814572, 10764537169012636484, 3173467127968428287, 8847518126511086492, 295935891940673208, 11767201095350394052, 11260389542763349256, 4551861726624713720, 1413881954865567393, 0, 205, 13622702382434675698, 8941567408770445183, 2168342371250989865, 17553704974699598306, 12818882650622055705, 16478401302589696546, 10652219805906948351, 13167156861512034068, 260666911081589986, 1428764500637505382, 2190433219200603887, 11999917547751101526, 2751093334206085539, 9318931023569054874, 16297727142514657495, 11875658036026604145, 5829323963705819601, 407792022339954638, 5684565403642367050, 13995368600016681288, 2845800306757116207, 5216498913603536417, 2411940295743487842, 2014066638340124975, 5258230180909223265, 17089893338044941808, 1124366766375746940, 9116801986360376826, 6650575029061305823, 4025036448660092914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10983413158656624898, 5310937309376166300, 69556848653847272, 2279577280749402753, 6239043535079259963, 7823300322844699129, 16996148474654794437, 4230459886680751700, 12959563699934572877, 17777188402634189686, 11688615314691277560, 5613634717561556402, 99293997352733151, 4641048264628364064, 10453514483181846641, 1290992838422522292, 1652879052062614258, 12559634219275278239, 11344475397534544312, 4122197572510879508, 15407253393194772940, 2851848389283930949, 11702605024239517145, 1998109451585880901, 585739809492349094, 13332688213147014025, 1333400193073781990, 8814857714812706426, 1361027555808818653, 5346936254995238101, 8929045628408978585, 14294118012339765875, 580999813345182728, 2469249211011993887, 9026977856739391370, 4386750069800107475, 10598485069506239844, 13751116549494668150, 5108328399444950450, 17844111358351956213, 6869486424216496389, 12517021987770120609, 7851907349568758598, 18010894049048312095, 16693413552305953061, 4804538971513236292, 17649433461619154043, 11634860025288790992, 11313962652641817505, 855825648432312573, 13762197753828465221, 5743720479766949980, 3952939840611939921, 9604762177227689240, 8138871928234011911, 11384225568855102440, 9154844205260484435, 14664846725851493074, 2924959973998026295, 12642953022837695767, 429476535988054822, 17383573277674600677, 1883220378389933149, 8503069890613114305, 0, 1055478707828467235, 16768526919827857497, 17573593815267411876, 10818335527229137478, 11942460420815768259, 11201145811561632930, 5337320314888759058, 11378469682479349365, 8043644167131082885, 10448639655673781918, 12631760754265391769, 7376593749874885103, 16058512323740159729, 17873088011118479782, 17353196649080642803, 4721598436263747464, 11599468651034345541, 14009687636872815249, 7066071671554154790, 764975448091728428, 390750909719918391, 6065087221876806603, 15179557481995246257, 3787608625370371137, 2510512133707130589, 11690776235517962509, 1719109731839136237, 11166959267981414839, 12815587692045090980, 7859047597365690811, 8496939594631729748, 0, 164, 6093021124582015914, 375332441348258328, 16597900739273350797, 16788616498952461620, 10323894478242846558, 3730474644926313294, 17377183878976452334, 12746711269593150718, 13699107349734059694, 421533440407219618, 15109303318896079214, 17746438429032263850, 13224617406323308041, 5646455969610140563, 12626985742338481481, 14497665384991648640, 13894375308737560134, 3268393834564630675, 13312171511942754529, 611321250913478210, 12048873764879264902, 5334026694118161468, 14360341460112568406, 17654490467796517057, 1299716947845207044, 7609683397541157642, 14709808073905360012, 11742139955633481423, 13522070698443062110, 12847434483856017691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4869282124135316831, 9722920045405101283, 3813457227114323323, 6994299592571856765, 5702578803007136341, 15311994542782308321, 15962779709098309522, 3251959243165075337, 16837525512190061999, 5255873350627198987, 13662096656243952301, 1237772870699038471, 14338999341360692181, 14673770949791486715, 18097642912412713810, 10340874988740490351, 14305190726983389511, 16952069533520764759, 1485150603424506365, 14762405621252678105, 14445929105909601636, 16354500586064479473, 17536697575147489470, 9606769581569578625, 16440689431974469334, 6912749596454005081, 18063649775432527150, 14363667461722498847, 3204687512694590580, 523131765818647386, 13905210272577125578, 1524835811237900732, 580999813345182728, 9441246971154186623, 10597412231254617917, 11056066896847582412, 926831815845570768, 15146036891941496142, 17796585342020107437, 14725691510160207757, 13266683287137316598, 11211493525824266688, 10363424299958068143, 16931617059033676533, 10317747226871568657, 5507137035801773730, 15150382077316258576, 3011814040489752698, 15693519808819939877, 3749972803617457769, 17618989739824101716, 16792606508352577565, 17343623425168465586, 7527635805457035516, 5997951179959432212, 5020084506774034519, 14024972486716132755, 12302404123334003808, 2455930810486398184, 3241163780490493161, 10543436976244887593, 13682516968888804929, 11574410555278975115, 9471994857288690980, 0, 8501616449138218092, 4292185681439734302, 7698449017624504359, 4120049919115121735, 12642019494772420219, 14296370119911864390, 11592997338406165909, 840282323232377843, 12539549423037404132, 2113471727240446420, 14684696359318715547, 10727937735414582667, 8692606315144869678, 12960248188949622509, 5257625079275344763, 13015387036798755754, 856522523927216338, 7257469808648011210, 16558963709047870874, 12450766651322475975, 13636667172445831102, 13577724383754573439, 11193936901615452288, 7697944572311111481, 3932182442483072865, 5392781400556584604, 17762170874626363624, 15703610354425254697, 12391508132885235615, 8620148927055889210, 18000133586140028187, 0, 41, 9617260353707541367, 9187825164453421957, 17649953659489375797, 6396310504287885774, 17019569090864760371, 870218876784769460, 17213560015461715510, 16812494438448165271, 15885717661613279263, 2958950328581697287, 14311601477626423214, 12599125587081655507, 12078599565132475515, 3332808335850364509, 374688056722968094, 5591521890390007231, 9584980789501913045, 4066644474875437132, 17728945623551220217, 1158050506628066296, 3730734784735709807, 10671987699715228843, 3173999018565335463, 14949604462817069254, 11653871972148380806, 312408327658285690, 8531928004921347162, 98858158429688394, 6167334615107562354, 1234843923022284190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5899798166361732461, 5767416489550511608, 2886498774908945457, 15711135636713186135, 17215236981565434804, 908232164244690453, 5342947965117461497, 3199707432515651559, 12254673123217560222, 15216440457821236670, 481214964859672572, 18319684398448937806, 12603763899442623918, 10439805318219614253, 3602725314699933855, 8845316204090048147, 7271929134996712285, 13774466749383009485, 11005842405313098356, 14132576890947137734, 14321220139057541288, 6232608833314116824, 18436966792264288712, 1379169538700861503, 12062619363135681450, 16153824494526799043, 14882639257257424707, 6766308366816242208, 4464924001417791506, 4566463403740325912, 1351933157961486422, 6763063898149860947, 580999813345182728, 2469249211011993887, 8653818256660346722, 821691781470963977, 17943701130779573558, 3491480252041350267, 16358518409573919398, 16267496100921628089, 12162679553338055516, 1260655305474572880, 9540238327664971413, 15435832236802784694, 3812327996641515614, 10851655192011526024, 10610490743746459257, 13300292692349174603, 10113218173788314502, 10969265948996096203, 6220402056944103440, 3968382988012899732, 5018759638511748755, 2202263529713616511, 12948196389634753645, 3608565717871609608, 2453582700597880552, 2749677163981800836, 7973159619665332708, 16804313747076081769, 14670346996245963865, 6184594554218323809, 17786267665435354569, 16948092911786303144, 0, 140232881496783361, 10299881888812700030, 13506878991346097494, 14759589214631061464, 7301829639095749904, 15244303073312648502, 18132523245900274389, 2494235991830255255, 3432426521039531155, 7122756551450847884, 5549456538037663492, 10046538650654098331, 15912355352055409492, 17727271824480331481, 6704708084565647373, 4884177682333066524, 15210444525259934523, 3029374613861219290, 4615876382287073253, 7423511914796799812, 15469469226126445149, 8382746819546300959, 2890705529596562428, 9630719428827082769, 13318034444579216655, 4682383242810761218, 14195663397355254272, 12064640095342720771, 16112425486122001154, 9666454503914171857, 10680190414005925338, 0, 41, 12529483521877137515, 4671467226762388980, 13873740979092621907, 12847173262736205772, 2640423636460273022, 8374058502362870155, 7630996533587302384, 3556075572123538464, 8078558398785937163, 5856098383496092000, 7999607615804135893, 15509992149354799776, 13785560116650003734, 8358196300413379173, 10412508239405514928, 7840142081125036731, 18075062342410207477, 18173191150607640442, 2133036585496843963, 8931901040624025193, 9454731621283026961, 5837806564591410604, 5850596656185029719, 296117354535505751, 8985195681813998404, 1975947551471322175, 12041110943945791333, 11648250496545232642, 7830634726555216225, 5266777994490151623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 16299911835839227190, 7439600795053578285, 17764699242312753117, 72379023848321437, 3840146011074602084, 10358472899138824122, 8678403567076310671, 771969030954554421, 17107733370651064258, 3926130618298284866, 777766613761440792, 18302679616424742231, 4399658422830000888, 14586568436552896239, 7848898512724128276, 16028822053598615935, 7613061892596625462, 13083593386467993284, 3013879140705624968, 17693711337466712468, 5033175548360176402, 5071731402891436170, 7353230019346707888, 17252905843818454714, 2640505909682592156, 14567186806364265088, 11858169615721049009, 8265106158072298997, 6616889263695345418, 11403119304603636779, 2145158521494695437, 0, 145249957631262975, 2401047653221911346, 4346621156346694740, 15690230013100567693, 12052213250462948496, 4313034443454791583, 2986358406776419767, 3160744395414731040, 14031039024085093183, 3877496541600093734, 10720145895975203640, 14936894451943192844, 4924903395035620384, 12381787083236736442, 12547862058645445192, 17342901573615257923, 16441368248785967826, 16642290968979905665, 8400425547892097127, 8935168685033341816, 11133810960521952919, 7535134649436940418, 5752598619104470273, 3942368633516548816, 15338087145388864340, 12628972628903398239, 13438747263841181181, 3139557918845001204, 1597138777695243925, 15852581941664405912, 12566536223313831832, 12566536223313831832, 264740454002249144, 5070319740822484234, 11549475095918428048, 9819109219817742568, 5677600078177657746, 250382926802577021, 3413687351079729358, 6870174020804907583, 2950358385880233426, 7094567085672854808, 14117325213115724257, 17249265058838620523, 6364580434745257188, 16537587825367420675, 6255602063998060074, 1816448877154048697, 1665145345483041546, 14003506401044241980, 10434287967974565457, 9500338696261382317, 13133067026913450803, 11258578054901736835, 14430869544081691912, 8503613085408412261, 3343513116649617296, 9343508596961576512, 12753874820303454617, 11936680880561889502, 3422498555177881379, 17255066275290727039, 2339032462720454103, 0, 205, 7876112718273244024, 1276143811675585923, 9993912342918529935, 16999254614849428545, 8194747920293058753, 11171758628037424552, 8208119826419095432, 5568149314099479773, 17551537772960996556, 12651683228606533001, 13584145944854843210, 12212300608708011466, 18102951610480561318, 14720258372954226591, 15448472262117068008, 10575290756167155008, 11997391634424499349, 9879556170680135793, 12373753045781314057, 9529470285212177396, 10620662102176580756, 10199402949196411787, 9825825353570660203, 18337390924518345383, 15945306792731206141, 10537181099344133724, 5505106000120813030, 14774803975376978777, 14575654492591748955, 8207377881872409730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 13742292427306144985, 17809381881860746878, 14185813834021479236, 2902380466328372776, 10999219428618119040, 9481695403573415070, 17673131597834433577, 12696786409220765700, 15592207435049660262, 13736774864431335246, 16717684302941853782, 14364466680417169443, 12260890044409800607, 17206474997006265051, 5035815000061711911, 9674580830266028521, 5580437753203777486, 15970593365487106653, 4096979907706804740, 15051763954056533599, 6913739807603556015, 9886633434535102281, 844824200045222171, 8033531154978796131, 17667639225113520026, 5672989858483365109, 2139538828134465604, 14154439558213594386, 15349070088087119300, 17443416980221933050, 10234632751699861532, 0, 13943995520284385472, 3038244952392737403, 2166498267314208258, 16766052460675760559, 17479836829311383480, 2421503110457951828, 4244078595888625427, 16470951341042419630, 10761733147329482159, 13363868789360680527, 8361105415211156204, 1063676068352620466, 15563346705142691804, 16788006368298087947, 1542676998191593053, 3303936282197422453, 6962236012055562966, 10808278092072460642, 5434427870325080160, 5951881526364525804, 10397118299016726484, 17744715934780154469, 6560905318933416747, 9119760857355898684, 12080225949269433371, 5462523753418276656, 4395579796774914984, 5461299377107545721, 10515379984412735135, 1357729935919477555, 4049192570105751375, 4049192570105751375, 2092801171489897510, 11830947885319956418, 7737209888784159602, 13533379427213586747, 12969897466948219293, 4397768078443292399, 11254764769292894033, 18099434164004083138, 2485855531816604722, 13525894453675963834, 8196759787025064775, 5345512927193726757, 10899057564736574513, 18177523421240333385, 5914611942628028009, 15108016113357317953, 1860837626615492164, 2201407520096262430, 15072295315432912557, 2703103454418315711, 923818922603460716, 18443738463070648510, 9827923975568229619, 11004068350566519627, 3092487934656948277, 16549791451828015234, 4910799883829461137, 15606093107492977367, 40421079456104423, 33594342817809819, 16993857945986913175, 0, 164, 14482187202392982684, 17682350329754313417, 66214439016909251, 7504629639084879386, 11708178258767948919, 188011405648496761, 10242982970375452289, 16510140404231294235, 13381084464566932690, 9239012175869487665, 9339694231140180875, 9917181315244873380, 17448534469581521177, 4965043893766771965, 13305445405772227224, 6963375374275021656, 4554518835153561582, 1694446457415578298, 4604616361036784646, 11439774970058559661, 10784225701912607868, 17782855612978839775, 13368223431578003475, 18100595786373494652, 12753204151452870283, 17504098334052422651, 12896535568794110034, 7402084190222773115, 598469278842686486, 5912604878679295331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10801573669330193043, 4014163844046372573, 1979187468149850032, 7068929233685234045, 6627279045165985143, 956116317527270230, 11757065279852506121, 1740402123045436483, 10251517583944092682, 5551917630030385122, 65503834883425781, 15453754233876106148, 10203814174951024159, 11998108441263059891, 922784102208491029, 17685677737193760186, 5204010590575197441, 3224334584493279137, 12733973074113146504, 12628586848138973198, 9618350092243669634, 1435727158819410801, 6720472488718189255, 8476570694128937109, 7307051990735150855, 15061013104031335890, 11522811345813436372, 4676228375886937826, 17477781110059685856, 9362502897182671987, 11254953448960768625, 0, 145249957631262975, 8386361303932939763, 13068211219747943554, 10741543262911175860, 16819603317278983686, 5783881320200053288, 18417524745718206114, 17717239843479976187, 4030689483576599003, 879151411992161296, 2779769903465702190, 14759893362240473482, 6691146416202555339, 11287199716539837261, 11126920347653441896, 12376075663235117060, 17793881754348373966, 2747583073029700026, 10825449445092551825, 5205786761888799519, 5879451121482504957, 8279206964799001491, 3768506969286097604, 10538414058473986667, 4512042016117019806, 9367766578866915876, 12466325711864282871, 4805225664863956509, 7450238737884914862, 7510284002737324288, 9029012768772075486, 9029012768772075486, 16998693837234676944, 15125640082304919550, 6110574402514906801, 4404297180800676786, 4728227612288081644, 5806909779738895718, 13841571116725704679, 10405162090868595527, 1295701329370151493, 15339349621927026708, 13512312828114051231, 10968291943912870575, 2665224526083019926, 11454603613487247488, 18085989619482158634, 8156733875584402577, 15725343254588574135, 17190667807892286789, 4147804706937142458, 13843504867107001118, 13430940141760251552, 2236397580466830219, 3736249992832820982, 11869484276361150688, 939908675643132953, 8795331189349109030, 1903118753742396596, 10434554919272483089, 15053297738150165437, 12279517140635782046, 8264942609101286638, 0, 41, 3800418813655617572, 14503408479575576010, 10553169970007645345, 4946745422622378051, 7127828976000219721, 2687285609278369395, 16630221959750548176, 1114885198959805561, 3895092647933222339, 9831397389014117600, 12816842684293233323, 1779119880742935864, 17663607747965229138, 5382558247959552902, 11972955750871888364, 16616426694032134438, 9711126273890628516, 376576173107709408, 12451218545182255865, 14301764572821220192, 13209253693600827240, 5745169166190656073, 12916752429524642864, 14463770325561420619, 7870235520772452232, 13278341252249613603, 5432056100901092307, 8994645443800925562, 5908996313982662075, 1494658977663487041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2688488582456733640, 3176173060019065635, 18309940476973301558, 6936565830330512698, 6894736762296179522, 90344116647093812, 7242437296897104684, 6840278566006653320, 12841299952034848927, 13801531974995903464, 3431188141752586880, 6945555547969535469, 16385619022525424479, 2302137229552580420, 3562300556391111858, 18050279212829828519, 11845451884839552921, 18010307414852664162, 1572578420442156655, 12278794746552983052, 7729016306498836651, 17389954356356902848, 14310782857892986700, 16540335065460741454, 9418678319655461294, 9662888408142346895, 9673811223372787800, 16236416741726566504, 1941798973941376537, 5283201687609097620, 677503724821015517, 0, 13943995520284385472, 13893715067188783613, 3737686312150097138, 6408571846489205195, 5309320507954343198, 7907473214578333250, 3220998093077600799, 6474302970739201787, 16744589822124330786, 15338963790186860624, 12429535237881910980, 4353091614275483153, 12430118441204168389, 15563175998310034114, 7172174870857485673, 2253621527545508840, 4507428390885076546, 2693291710499435080, 18303680792619501937, 12658208632913334575, 18044025142180450635, 14512997676069758708, 6038828855361889649, 16387791750090568457, 2816243451374973997, 15990457456638139626, 5938146028305439666, 8292027417405396428, 12456535987381445341, 4686309106959500238, 9680729728072440816, 9680729728072440816, 275926701951807482, 2368214261414429154, 15583218305860063073, 12342565443853005153, 7791191498940082574, 5368134609913732769, 18241043179323819051, 6247074573395806345, 7865016694973943467, 13276760677885131566, 12501576801121215107, 14003841288523724393, 7706369500077994851, 14277720092332100080, 16831403894744601879, 9685715221108858847, 12090932747658876990, 15574096712669166429, 16819229186816553924, 3675188622214856303, 6131072316753506600, 5455404512357596637, 3180536826353817667, 6733192297441041488, 3057140685660277923, 15037300764129498232, 12789460187938846931, 12722152077589496357, 5754948178406885282, 9383881360936187956, 10120172904062862410, 0, 41, 13092032916490151270, 2856458557507854671, 14059661153766146178, 1724041303048776424, 7119687853704366589, 3699246950542313036, 8338994289155538949, 7732171807197958061, 10653644351656999339, 15262849800927670044, 6132373490633371091, 16473831322001214578, 12928938600331453669, 6959935525856744214, 17173069020016176920, 6747622983845354522, 2484033613426731933, 9879916419081378373, 4275250202523893223, 5995505684018086986, 16115855409799741127, 2490003355474156145, 10034475279304353355, 7223217715426381376, 10334063888823214988, 2139000562522371457, 18314119367638727156, 15311716904301189063, 894706229073498557, 1570146104298050273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(88) }, program_info: ProgramInfo { program_hash: Word([6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 89, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 0, 9, 0, 1, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 8, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 8, 2, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 8, 3, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 8, 4, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 8, 5, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 8, 6, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 8, 7, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 8, 8, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 7, 1, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 7, 2, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 7, 3, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 7, 4, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 7, 5, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 7, 6, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 7, 7, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 7, 8, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 6, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 6, 2, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 6, 3, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 6, 4, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 6, 5, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 6, 6, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 6, 7, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 6, 8, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 5, 1, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 5, 2, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 5, 3, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 5, 4, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 5, 5, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 5, 6, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 5, 7, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 5, 8, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 4, 2, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 4, 3, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 4, 4, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 4, 5, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 4, 6, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 4, 7, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 4, 8, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 3, 2, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 3, 3, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 3, 4, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 3, 5, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 3, 6, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 3, 7, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 3, 8, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 2, 4, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 2, 6, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 2, 7, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 8, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4539061041759240, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 1, 3, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 1, 4, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 1, 5, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 1, 6, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 1, 7, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 8, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 1, 1, 1, 4539061041759240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 35461414388744, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 277042299912, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 2164392968, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 16909320, 1, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 132104, 1, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 1032, 1, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 7, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 8087083728976074902, 14294118012339765875, 1524835811237900732, 6763063898149860947, 2145158521494695437, 10234632751699861532, 11254953448960768625, 677503724821015517, 0, 0, 1, 0, 0, 1, 1, 0, 0, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 14537741408767373410, 15771729313541940903, 16254963956836991015, 2046774012797929459, 9448749568492005186, 8503069890613114305, 9471994857288690980, 16948092911786303144, 12566536223313831832, 4049192570105751375, 9029012768772075486, 9680729728072440816, 0, 0, 0, 0, 0, 1, 1, 0, 0, 4539061041759240, 0, 0, 0, 0, 0, 0, 0, 12566536223313831832, 4049192570105751375, 9029012768772075486, 9680729728072440816, 0, 0, 0, 0, 0, 1, 0, 0, 0, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 1413881954865567393, 8496939594631729748, 18000133586140028187, 10680190414005925338, 2339032462720454103, 16993857945986913175, 8264942609101286638, 10120172904062862410, 0, 0, 1, 0, 0, 1, 1, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8488924048752676071, 7132218559010351790, 18152833202936203138, 302695496926486902, 13622702382434675698, 6093021124582015914, 9617260353707541367, 12529483521877137515, 7876112718273244024, 14482187202392982684, 3800418813655617572, 13092032916490151270, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5473488137200086909, 2687466917280430353, 10305147718805144715, 16415403596737407938, 8941567408770445183, 375332441348258328, 9187825164453421957, 4671467226762388980, 1276143811675585923, 17682350329754313417, 14503408479575576010, 2856458557507854671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16124688533662466636, 14170238607512888511, 13246631902503555591, 12969246825596557956, 2168342371250989865, 16597900739273350797, 17649953659489375797, 13873740979092621907, 9993912342918529935, 66214439016909251, 10553169970007645345, 14059661153766146178, 1, 0, 0, 0, 1, 0, 15754956633454945151, 6055713190940499638, 11077250730155763388, 4527044298581192722, 5453168895411602323, 18142351346900318359, 15965643470182086386, 17553704974699598306, 16788616498952461620, 6396310504287885774, 12847173262736205772, 16999254614849428545, 7504629639084879386, 4946745422622378051, 1724041303048776424, 1, 0, 0, 0, 1, 0, 5043375237696906583, 4379507338442738151, 10191347065326962634, 15470787238396171217, 7649138216344653830, 3098698980745497723, 7317402970608805914, 10652219805906948351, 17377183878976452334, 17213560015461715510, 7630996533587302384, 8208119826419095432, 10242982970375452289, 16630221959750548176, 8338994289155538949, 1, 0, 0, 0, 1, 0, 27564165777955823, 2554423200420703486, 17579160449292996896, 11147561538212402733, 7271583017513514692, 11194864417357882388, 5717939852331496040, 1428764500637505382, 421533440407219618, 2958950328581697287, 5856098383496092000, 12651683228606533001, 9239012175869487665, 9831397389014117600, 15262849800927670044, 1, 0, 0, 0, 1, 0, 12554774560852918121, 7558057668449617622, 8341229243444900158, 11546140485006286209, 5702916883024911354, 10059737158050223658, 15942512744234440774, 2751093334206085539, 13224617406323308041, 12078599565132475515, 13785560116650003734, 18102951610480561318, 17448534469581521177, 17663607747965229138, 12928938600331453669, 1, 0, 0, 0, 1, 0, 6754601476785640702, 7736060991620510625, 1449884785010881379, 6135983205453599776, 9277341930384005575, 17852936504841763737, 15508051727969296111, 11875658036026604145, 14497665384991648640, 5591521890390007231, 7840142081125036731, 10575290756167155008, 6963375374275021656, 16616426694032134438, 6747622983845354522, 1, 0, 0, 0, 1, 0, 7929723072429044254, 16334448815751507577, 4434638168235316685, 17199894398730562705, 13653108884642243926, 18423338781077887809, 810875278274469351, 5684565403642367050, 13312171511942754529, 17728945623551220217, 2133036585496843963, 12373753045781314057, 4604616361036784646, 12451218545182255865, 4275250202523893223, 1, 0, 0, 0, 1, 0, 8602814005182217200, 9971451726661298505, 15671763834046105438, 7369439734883755459, 15167316901472929028, 9594540064387516595, 598273005722510655, 5216498913603536417, 5334026694118161468, 10671987699715228843, 5837806564591410604, 10199402949196411787, 17782855612978839775, 5745169166190656073, 2490003355474156145, 1, 0, 0, 0, 1, 0, 1420030357616461150, 0, 0, 14515762120928230173, 8611475648437961511, 7809934763889573038, 12653867244112536729, 5258230180909223265, 1299716947845207044, 11653871972148380806, 8985195681813998404, 15945306792731206141, 12753204151452870283, 7870235520772452232, 10334063888823214988, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13610167819530098127, 10900065459953722709, 18341122838405415754, 3153753366153954420, 1124366766375746940, 14709808073905360012, 8531928004921347162, 12041110943945791333, 5505106000120813030, 12896535568794110034, 5432056100901092307, 18314119367638727156, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11215445033353754262, 9162692523043045302, 11967784234256998242, 12197142511433562971, 9116801986360376826, 11742139955633481423, 98858158429688394, 11648250496545232642, 14774803975376978777, 7402084190222773115, 8994645443800925562, 15311716904301189063, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8081237365032914784, 17462008412377898139, 10761804868734649587, 13557680898519201450, 6650575029061305823, 13522070698443062110, 6167334615107562354, 7830634726555216225, 14575654492591748955, 598469278842686486, 5908996313982662075, 894706229073498557, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 4025036448660092914, 12847434483856017691, 1234843923022284190, 5266777994490151623, 8207377881872409730, 5912604878679295331, 1494658977663487041, 1570146104298050273, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4539061041759240, 0, 0, 0, 0, 0, 0, 0, 12566536223313831832, 4049192570105751375, 9029012768772075486, 9680729728072440816, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3330424775026476592, 13633250484821623215, 16565837043221829196, 12610063329678779487, 1406583001570465792, 16768526919827857497, 4292185681439734302, 10299881888812700030, 5070319740822484234, 11830947885319956418, 15125640082304919550, 2368214261414429154, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7732229819737520946, 15098993065726469111, 52948362219275850, 9599099202048490781, 12562663752152469569, 17573593815267411876, 7698449017624504359, 13506878991346097494, 11549475095918428048, 7737209888784159602, 6110574402514906801, 15583218305860063073, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12659763553976530720, 1564281538360678972, 8677964002070154388, 7298046952032101196, 16633851142346839330, 10818335527229137478, 4120049919115121735, 14759589214631061464, 9819109219817742568, 13533379427213586747, 4404297180800676786, 12342565443853005153, 1, 0, 0, 0, 1, 0, 6508846668869650000, 17336912220865242963, 2268843052628052976, 13820936547498519501, 7168328730833322865, 7428484016288157022, 16026473122383984320, 17021480690231868718, 11942460420815768259, 12642019494772420219, 7301829639095749904, 5677600078177657746, 12969897466948219293, 4728227612288081644, 7791191498940082574, 1, 0, 0, 0, 1, 0, 15837335187878938475, 5466507011147170445, 11650170051303322910, 5030538143349324000, 13591172423217881213, 7596566350181367049, 5410472981661512575, 12021280163646879782, 11378469682479349365, 840282323232377843, 2494235991830255255, 6870174020804907583, 18099434164004083138, 10405162090868595527, 6247074573395806345, 1, 0, 0, 0, 1, 0, 14897033870199487714, 13140683236260271155, 14159644452561526580, 5695604368834329320, 1007570544942142144, 5033691822950904881, 5904063656561684665, 944699227762067814, 12631760754265391769, 14684696359318715547, 5549456538037663492, 14117325213115724257, 8196759787025064775, 13512312828114051231, 12501576801121215107, 1, 0, 0, 0, 1, 0, 7883221524574062887, 13183696492710529508, 6213114786013009576, 8078757315035365696, 9498329046798837348, 6115393411247877634, 2891811661249932042, 14704623317114553828, 17873088011118479782, 12960248188949622509, 17727271824480331481, 16537587825367420675, 18177523421240333385, 11454603613487247488, 14277720092332100080, 1, 0, 0, 0, 1, 0, 3351410150454291730, 16279278462051668121, 10035562370865624816, 9729162786960114112, 5981274731275683258, 17197119244649549383, 16735389142514185239, 17342022136955130751, 11599468651034345541, 856522523927216338, 15210444525259934523, 1665145345483041546, 1860837626615492164, 15725343254588574135, 12090932747658876990, 1, 0, 0, 0, 1, 0, 15032980823283040232, 2668283458286770416, 12407409512729445019, 3179630577014811908, 15292824893734897630, 3136236054167912163, 13251084164183215555, 9877562264475108305, 764975448091728428, 12450766651322475975, 7423511914796799812, 9500338696261382317, 2703103454418315711, 13843504867107001118, 3675188622214856303, 1, 0, 0, 0, 1, 0, 6987334820542205177, 436417979830380839, 13177538606264077422, 14999066466406693845, 15059493462076997690, 11340220366618064719, 6580507474643651363, 8487705884637814572, 15179557481995246257, 11193936901615452288, 2890705529596562428, 14430869544081691912, 9827923975568229619, 3736249992832820982, 3180536826353817667, 1, 0, 0, 0, 1, 0, 7020168012590274751, 0, 0, 17453232571701437290, 5021883210577128063, 5496590912397587492, 6693558341526111425, 8847518126511086492, 11690776235517962509, 5392781400556584604, 4682383242810761218, 9343508596961576512, 16549791451828015234, 8795331189349109030, 15037300764129498232, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7539745443808178835, 9884045457320590091, 8382695108894398131, 5283201688561864115, 11767201095350394052, 11166959267981414839, 15703610354425254697, 12064640095342720771, 11936680880561889502, 15606093107492977367, 10434554919272483089, 12722152077589496357, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14554316550668318802, 5367026278670357791, 9643181922175718153, 5334752974852163097, 11260389542763349256, 12815587692045090980, 12391508132885235615, 16112425486122001154, 3422498555177881379, 40421079456104423, 15053297738150165437, 5754948178406885282, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15063345752223211733, 8499294198486805672, 16042312733989464482, 451731299183430202, 4551861726624713720, 7859047597365690811, 8620148927055889210, 9666454503914171857, 17255066275290727039, 33594342817809819, 12279517140635782046, 9383881360936187956, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 1413881954865567393, 8496939594631729748, 18000133586140028187, 10680190414005925338, 2339032462720454103, 16993857945986913175, 8264942609101286638, 10120172904062862410, 1, 0, 0, 0, 1, 0, 0, 0, 0, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 580999813345182728, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14568136944800275082, 5693535723676280393, 9230767544379437105, 1921340627054025915, 4826001026438697181, 9026977856739391370, 10597412231254617917, 8653818256660346722, 2401047653221911346, 3038244952392737403, 8386361303932939763, 13893715067188783613, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12559996978644727669, 9307941706856421244, 18310630857442586767, 11168366585808691894, 13927464871572189232, 4386750069800107475, 11056066896847582412, 821691781470963977, 4346621156346694740, 2166498267314208258, 13068211219747943554, 3737686312150097138, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16006034000059690936, 17583976365434994224, 6798288544665969845, 16344827155364741241, 8487031467837880959, 10598485069506239844, 926831815845570768, 17943701130779573558, 15690230013100567693, 16766052460675760559, 10741543262911175860, 6408571846489205195, 1, 0, 0, 0, 1, 0, 9144131815937747872, 3342878222920529613, 4791714562823606942, 15808130082429351686, 11956256213068276591, 12649659004750065655, 13917605778022436041, 7953084218463226909, 13751116549494668150, 15146036891941496142, 3491480252041350267, 12052213250462948496, 17479836829311383480, 16819603317278983686, 5309320507954343198, 1, 0, 0, 0, 1, 0, 1038103851795962350, 4430605040022927656, 16365904851233496502, 894576452673648096, 1340502547894095473, 12601220862983867223, 16222497246401579549, 16644535012971742472, 6869486424216496389, 13266683287137316598, 12162679553338055516, 3160744395414731040, 16470951341042419630, 17717239843479976187, 6474302970739201787, 1, 0, 0, 0, 1, 0, 16229564526704673406, 10174200792466558210, 5132793225392427293, 9980680059887464609, 12726130892030271688, 312583470408719867, 758472841121971562, 14563339716269964045, 18010894049048312095, 16931617059033676533, 15435832236802784694, 10720145895975203640, 8361105415211156204, 2779769903465702190, 12429535237881910980, 1, 0, 0, 0, 1, 0, 6215541400981523569, 1953204460931882521, 12589335010609790225, 15843714178786416863, 3287199712077657921, 1991947075903969606, 3767440642589974121, 3375764636979625919, 17649433461619154043, 15150382077316258576, 10610490743746459257, 12381787083236736442, 16788006368298087947, 11287199716539837261, 15563175998310034114, 1, 0, 0, 0, 1, 0, 14427469169104333761, 6340093208524402435, 12262828500061219108, 3395211782606276051, 14508720026418909433, 11172295513373146926, 3431797671267201506, 11592395684445633353, 855825648432312573, 3749972803617457769, 10969265948996096203, 16441368248785967826, 6962236012055562966, 17793881754348373966, 4507428390885076546, 1, 0, 0, 0, 1, 0, 14592383679640689303, 1910163776289539337, 13338365197478444082, 3112263678112869121, 9793349915183632648, 166719433298183890, 5274326486456948617, 15838446667082529291, 3952939840611939921, 17343623425168465586, 5018759638511748755, 8935168685033341816, 5951881526364525804, 5205786761888799519, 12658208632913334575, 1, 0, 0, 0, 1, 0, 16738660098177737227, 9829750214121427853, 12484115052089468332, 15237271270752782119, 16244276080775719304, 18103925836791549846, 15867602839234938544, 12094773271668234643, 11384225568855102440, 5020084506774034519, 3608565717871609608, 5752598619104470273, 6560905318933416747, 3768506969286097604, 6038828855361889649, 1, 0, 0, 0, 1, 0, 75223512047035789, 0, 0, 6870828195219142669, 2520783628599955940, 7353009946795117330, 17045986882743664444, 14360904859585829753, 2924959973998026295, 2455930810486398184, 7973159619665332708, 12628972628903398239, 5462523753418276656, 9367766578866915876, 15990457456638139626, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12714099020863010695, 12314456283572504356, 469635739213563567, 4147903628926627533, 13470963638813042195, 429476535988054822, 10543436976244887593, 14670346996245963865, 3139557918845001204, 5461299377107545721, 4805225664863956509, 8292027417405396428, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5224376302272959154, 6535409800777915487, 7901122908367659010, 4079954944710007123, 13830904396796715875, 17383573277674600677, 13682516968888804929, 6184594554218323809, 1597138777695243925, 10515379984412735135, 7450238737884914862, 12456535987381445341, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14781572642473112572, 11268362592956912536, 5766087612434108876, 10588667258124334541, 9960013932953480218, 1883220378389933149, 11574410555278975115, 17786267665435354569, 15852581941664405912, 1357729935919477555, 7510284002737324288, 4686309106959500238, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14537741408767373410, 15771729313541940903, 16254963956836991015, 2046774012797929459, 9448749568492005186, 8503069890613114305, 9471994857288690980, 16948092911786303144, 12566536223313831832, 4049192570105751375, 9029012768772075486, 9680729728072440816, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16336503519826769294, 9197671798777409481, 13035020452047724944, 17733790707118953345, 11006573531383828351, 10983413158656624898, 4869282124135316831, 5899798166361732461, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2990417547231451768, 11606517949721719272, 17598947928349150032, 14580412695609233024, 13599348264422318050, 69556848653847272, 3813457227114323323, 2886498774908945457, 7439600795053578285, 17809381881860746878, 4014163844046372573, 3176173060019065635, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8200055882763834902, 8595871163399933719, 4957589343064393818, 12971821499548943886, 9048627971498202333, 2279577280749402753, 6994299592571856765, 15711135636713186135, 17764699242312753117, 14185813834021479236, 1979187468149850032, 18309940476973301558, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15107023413552199376, 7763683116636157069, 6242447045300438422, 12942151567717980516, 4616644171576346372, 6239043535079259963, 5702578803007136341, 17215236981565434804, 72379023848321437, 2902380466328372776, 7068929233685234045, 6936565830330512698, 1, 0, 0, 0, 1, 0, 528576776446583989, 10409606060068835052, 5784423647953917837, 8385687432658166895, 838997349906846708, 4795761656943466364, 293990104348951469, 13446530094027973481, 7823300322844699129, 15311994542782308321, 908232164244690453, 3840146011074602084, 10999219428618119040, 6627279045165985143, 6894736762296179522, 1, 0, 0, 0, 1, 0, 12380241214066733373, 6763481784501978893, 3664971892418121107, 11139320331324068031, 8111388737755370581, 11627377236417283134, 11966816476348176754, 3589365582169471582, 12959563699934572877, 16837525512190061999, 12254673123217560222, 771969030954554421, 12696786409220765700, 1740402123045436483, 6840278566006653320, 1, 0, 0, 0, 1, 0, 8758598539355441563, 14327797909354101607, 3238487269456306309, 1252671640222326947, 3118134149246226434, 15205984627333468001, 11534859557249128228, 264848703107953315, 5613634717561556402, 1237772870699038471, 18319684398448937806, 777766613761440792, 16717684302941853782, 65503834883425781, 3431188141752586880, 1, 0, 0, 0, 1, 0, 17573171947292431650, 6692160042088053455, 9889382861130386235, 4014227156326565798, 2305040771202529034, 4569674865772026702, 980116766328138766, 891801733175697187, 10453514483181846641, 18097642912412713810, 3602725314699933855, 14586568436552896239, 17206474997006265051, 11998108441263059891, 2302137229552580420, 1, 0, 0, 0, 1, 0, 11214541640256768195, 1456276470065412101, 3012063381053750362, 17477853997594743235, 4667652151526467516, 14709859391037291514, 15576478276301900443, 5288871968538360514, 12559634219275278239, 16952069533520764759, 13774466749383009485, 7613061892596625462, 5580437753203777486, 5204010590575197441, 11845451884839552921, 1, 0, 0, 0, 1, 0, 10349408106071310053, 10035088333115331288, 14142664761481779532, 15706959181585180523, 15750389702075093135, 876174554396868075, 4889082965904642440, 14848674461360674975, 15407253393194772940, 14445929105909601636, 14321220139057541288, 17693711337466712468, 15051763954056533599, 12628586848138973198, 12278794746552983052, 1, 0, 0, 0, 1, 0, 951615792977801264, 1211405113549675186, 17985020091891048998, 15445358949429791952, 2099687338970431013, 14303982336399641814, 12393266145043202429, 14151277613136798520, 1998109451585880901, 9606769581569578625, 1379169538700861503, 7353230019346707888, 844824200045222171, 6720472488718189255, 14310782857892986700, 1, 0, 0, 0, 1, 0, 7643984727775434844, 0, 0, 14286495051698513565, 6791090761664616374, 12627603787832494922, 853764681371061454, 6760124904423015973, 1333400193073781990, 18063649775432527150, 14882639257257424707, 14567186806364265088, 5672989858483365109, 15061013104031335890, 9662888408142346895, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4315117985825319308, 17954920195441939375, 2358074803509054857, 12566827890799503780, 11226925817970638094, 1361027555808818653, 3204687512694590580, 4464924001417791506, 8265106158072298997, 14154439558213594386, 4676228375886937826, 16236416741726566504, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13180871958580017059, 6438200026603866080, 16405101789199201340, 12734261918077566887, 323561318445804460, 5346936254995238101, 523131765818647386, 4566463403740325912, 6616889263695345418, 15349070088087119300, 17477781110059685856, 1941798973941376537, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9324640818690322529, 1507262460208602102, 1581131786309040293, 13460201712649497096, 11770041052112546722, 8929045628408978585, 13905210272577125578, 1351933157961486422, 11403119304603636779, 17443416980221933050, 9362502897182671987, 5283201687609097620, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096, 8087083728976074902, 14294118012339765875, 1524835811237900732, 6763063898149860947, 2145158521494695437, 10234632751699861532, 11254953448960768625, 677503724821015517, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(88) }, program_info: ProgramInfo { program_hash: Word([6965138066206642862, 12596233587871940770, 8197358252954291811, 10673667133036073096]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 89, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_22.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_22.snap index f743d6b60a..0f9c32d88a 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_22.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_22.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 1, 65, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5482243896119908732, 401642074298203, 3137828705454, 24514286761, 191517865, 1496233, 11689, 91, 0, 0, 0, 5482243896119908732, 3358534066525179769, 8, 0, 3358534066525179769, 13210061556570014836, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525], [17271741639510569126, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17271741639510569126, 9365253138981608257, 0, 65, 9365253138981608257, 16003296542960478536, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728], [10627125303494028926, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10627125303494028926, 4243893038989355703, 0, 0, 4243893038989355703, 6732564319544917702, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410], [12334791106787903660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12334791106787903660, 2372900269115514267, 0, 0, 2372900269115514267, 16687523027086140644, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683], [13210061556570014836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16003296542960478536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6732564319544917702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16687523027086140644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4, 3, 2, 2, 2, 2, 2, 2, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [3358534066525179769, 3358534066525179769, 3358534066525179769, 40, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [9365253138981608257, 9365253138981608257, 9365253138981608257, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4243893038989355703, 4243893038989355703, 4243893038989355703, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2372900269115514267, 2372900269115514267, 2372900269115514267, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 17, 16, 16, 16, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 2, 0, 0, 0, 0, 0, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 7, 8, 9, 2196, 4383, 6570, 8757, 10944, 13131, 15318, 17505, 19692, 21879, 24066, 26253, 28440, 30627, 32814, 35001, 37188, 39375, 41562, 43749, 45936, 48123, 50310, 52497, 54684, 56871, 59058, 61245, 63432, 64161, 64890, 65133, 65376, 65457, 65484, 65511, 65520, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5482243896119908732, 18015781855758016478, 4383606322674378669, 11282929110176162954, 17215248529293365853, 13193227772306657556, 11735240166769603875, 3717289286029653294, 5492874275384737590, 12486768927296380145, 7992161010257837902, 5965860733558915216, 13973209423992708161, 5139670008027876415, 6906630570311142812, 808538110186084468, 2187643142553675840, 11028121748345672612, 18181286167455191614, 15014367804365107227, 10866688391213961683, 16520440189869744108, 5493823407617825232, 501346961392724628, 18105097706170191265, 13534558354914049543, 3820689183586493894, 16784019981734849061, 2862138511955678409, 7758258992155315690, 17115115516972321026, 9874694795284567525, 401642074298203, 4016420742982670, 14280802901810915241, 7925919485060883878, 9094034340168608638, 6650811367268781560, 13344927435882217244, 15870694671012449597, 13091389828882674218, 168434371192049215, 13973668876111195937, 680445747454648704, 15441309962929722976, 15749770188837954531, 5233297770622824375, 3367253731665130938, 5066484463076591248, 9867160564810673994, 16707816004584596036, 6832899290197418961, 10263347723858682786, 6209209797490182000, 8678413656546712232, 9643915442530902318, 17208626611000903707, 11389822518212260982, 887493237489321299, 48736118273260452, 13483864438078018308, 8159241411748295729, 10385528691577928985, 5482243896119908732, 0, 616, 13342492399873323769, 1439796670523758837, 2591609871503882494, 5919456033500076693, 5232333079875635931, 12079101376381790329, 5687909194194711965, 13514584364960626778, 10501272396704173758, 7941686916236651549, 11501430483965911830, 10227424397178507773, 10471520652203868473, 14226149352545573719, 5877312072455938554, 4586059525590481046, 1601223390241498740, 2723805050156540964, 14314758709191331837, 15918659712373688555, 3030433806959200828, 16403500445172050158, 4533755278593082652, 10807446599885826609, 6981555831806437627, 13412972662619459764, 13711912288503888270, 7425430573821419685, 16752277069679715408, 13210061556570014836, 8, 80, 16253482711025978099, 16690839578921925157, 11755424915479552417, 17934377671577204140, 15509754874715907467, 6426721221030580337, 11049594146888643723, 14912334368661229147, 17657273147290084056, 9105126057127804171, 13430225876739607206, 3614830725909060912, 14569284676797348998, 4705513459362295944, 424917224365117418, 2835737623710330612, 1964100172858915134, 14896843043547784767, 15482419984058848245, 18437547705335910066, 3162257106529980441, 5297995970636059087, 9661978795293871188, 10128143329575104151, 770728251595531533, 9782965673735423214, 1347942901513492691, 12086966446141742548, 10239457018222882008, 3358534066525179769, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [17271741639510569126, 8154194758959345943, 13264028927506398677, 5896249534368220847, 11382862066285680273, 5436084715181539253, 3806787319072410229, 6511238228694043548, 9049442861863566881, 3576764171564075210, 450124369605914003, 3732227441816681926, 14029816209330408163, 8200782329890006994, 10416842793286403595, 6907512650407721813, 5351083897603196824, 9182929970775715030, 16141859999570517823, 9888871621811661249, 4078956937078417294, 5937931242192299623, 3211370055999743360, 12301747922262729865, 11292399879083020280, 5346237718208015471, 8535816953133153286, 9097410120098142273, 2554244438665697829, 6695383891040002341, 9265251570417433175, 11914585017133270728, 40, 3213136594386184, 1835177830541154044, 826263100281998566, 9612296353153372169, 2509054224639990472, 11363599377854067153, 5593295816013818122, 4611398810491526224, 17064807786960234347, 18427889571151062396, 10159688738464070440, 14427917509182297997, 6874689601963577621, 745298233749984501, 4960831845018172313, 1451394763904737446, 17942681985602265676, 17508193444101172646, 1672370857206926433, 10152063658776528390, 14576660961872281746, 13602838247655372264, 5274902253855511588, 3163862752932557920, 7292072545764012550, 6033538369482377655, 10941848106600998110, 3570589185097006252, 4587292818271677447, 16771298688176486904, 17271741639510569126, 0, 528, 4511615971967153504, 11189511375577512439, 14523290705070057408, 11602649596278030541, 15937333004537029302, 7414360896531864023, 7973996941547777109, 691576170553327010, 16392526795103433215, 3672880019205947738, 3018308815206440911, 15753827566219281917, 12969815742735761919, 16814873348334179176, 9850453545266944859, 10757916804785969985, 15838808218411872755, 4464803664915013475, 1326425913004665964, 12560438841096766551, 448453576971543277, 8998725782446855275, 14421875759181138198, 3100710952877190431, 3320646806195653797, 11565789183953445370, 502156843765695809, 13147348360138928114, 11903841834984596874, 16003296542960478536, 0, 64, 5751576643258238090, 7830268710878889486, 4868320831660690795, 7042762868047858013, 1028615964620729689, 12270587957620579653, 7267371538363991280, 16125626865182516658, 16950134439933558852, 13427183447069512151, 16117382505273595827, 2222792985740553749, 6517696895688418945, 15516128650333221731, 6357034143715229949, 12960707821770488929, 12451444460344609421, 8786747128188560390, 7634329044629047826, 7741107824034642016, 10975559322169081956, 6007758954686348362, 13971256108093330407, 16868860295450858142, 434120282701603474, 11571634562637977474, 5581285869985960561, 6581368197537384623, 17661012293298952642, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10627125303494028926, 14952889910786498171, 4766776471757604196, 12230245468863423579, 18104224094677170296, 15873409126341319274, 10073785188538358192, 9346697284679931865, 9007898958502691821, 18310381669862731969, 6720634958674998611, 4972858056675247397, 3284008361973965746, 14482858214234206831, 15154449156086880838, 5792220624700559072, 12843525862417693577, 642245012387336876, 14582627702688057517, 2964899186980974939, 8169860993617536308, 10855885493426519851, 1871971423867885122, 7909458165142256993, 3879457158905131550, 11439385698067115077, 12781603895645888322, 12658641528827989062, 9129723360543316479, 2424787611628537668, 16343713044075599831, 14619522228640933410, 40, 803284148597046, 10010111294767420802, 16943179644353820008, 8996122336997085030, 17350347680949584060, 13520911097528541892, 14769691589967587136, 81685142906752346, 7559897225353479520, 128512095027132822, 9792116363139842106, 4634576985104787587, 8679380235287294885, 1134592111928495305, 4684288247441474792, 15613043314698948257, 4841731940180862534, 5786518576333159075, 12666070374819933283, 2487841274273895537, 5690982477694717281, 5924572671969496500, 8629130978595053833, 18206699227813987098, 14234831161984809711, 16798226782780142546, 9330568307929665420, 9731250716956559616, 12286920896461242142, 1919835269886444210, 10627125303494028926, 0, 264, 9085863547783897978, 4029278259426396811, 16053154709446024998, 15730095788089532534, 1184856151594203190, 7658158244024203478, 7908104163460391198, 11768448888839053133, 15952542848401697239, 2236539493336923746, 12654027314481387133, 183479441840898968, 12829755263022627333, 14927722658095997307, 8579481663516436508, 2326984138263422166, 12584151503586926798, 5547037854005909933, 18320766430359725566, 16436941964924985549, 2398490839703252269, 15603212774947060210, 2697950444757558845, 7336230381913860230, 2577750295211676178, 16469775866150825791, 360850050916534143, 7183698983616787617, 9070535322622906244, 6732564319544917702, 0, 16, 7110029021941723513, 10115409991715085575, 11428668827299215140, 4015039023438705588, 3732466887400149035, 5870841944205588609, 8421627027326523148, 8231214549142439222, 10318470559229280016, 15171283498151438808, 12477430934852872037, 3853779543897991795, 14662750186533371679, 7423988381383082226, 13549468426633458145, 11079168775731474830, 12471207782095033761, 17595325414333663547, 7042468264080735391, 17650115337646869205, 14946074228061446423, 4655654314239637986, 11187552516160183253, 18115881480442018545, 899748567092010447, 14020868337400209874, 15417366235984526759, 3331301994171189600, 15814677761660135474, 4243893038989355703, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12334791106787903660, 10536106724359599792, 14660905060901389201, 17357985657180629743, 10490790376815116141, 8856174280738574418, 17564486157138470037, 2383050989032417578, 9423711593310475409, 4142017075081989212, 6217567350304044823, 15435624740876731287, 3215908606625999288, 11222238183310766613, 17187582840477322187, 11654551786904653634, 6201498867875513095, 9940061963065628902, 1432819846316931691, 5068010018173215582, 13903556343063122489, 8872060411343823556, 17720392065240548352, 17643816943101201258, 1449530809054027683, 17965277233811019017, 4895491920411997249, 10751559368097521724, 16513197729164811328, 4815287357290896051, 3003012580421078075, 6636010883309744683, 0, 803284148596806, 2549897079792572603, 5670682422759337153, 4249626004536644548, 9138873913574622404, 1343119293110958009, 15707367360995172765, 2149720931386886989, 12579497520806083785, 14990373923527496282, 7330871518527332444, 5790961380321049961, 5495469617420264118, 10789212522972025785, 4356961356341052500, 8032044444015716361, 5554647570062987979, 1022644107902166331, 6764324513849573852, 14002884382934858252, 14316154512513580139, 8331374540726760892, 13067519389098510351, 8671032013540344722, 13457978878695920483, 16399505509770566014, 10578307416004071064, 11950037765875050974, 12195903600484928258, 17694444981837938563, 12334791106787903660, 0, 88, 13728083094831419091, 5555139373262852832, 2905384006316447019, 12155959663009124293, 13187847930197094867, 15053688477158705110, 5239197399579256268, 18372875045424962848, 6782570937531856778, 5670979983981263850, 10968120781620208764, 2099848306821515114, 7984319522957739004, 14143871504578433969, 14093328990578646811, 5769086287272836702, 13010501651213663576, 16984828703781093727, 13803823311240773956, 17471084929704555662, 5508754216278517899, 14994098977964244257, 8220163139135834751, 17625713553185819225, 15041604777168753281, 17976701769209321205, 10958079103202840999, 17793074612839242130, 3601655880141993647, 16687523027086140644, 0, 16, 3208043314804619251, 6920597847411412414, 17985619796195836408, 11907191178709112742, 16377455862733420451, 15572876043608056600, 9466912758182965715, 17480763791598773801, 15029113851915312964, 1953587265841775225, 7175742902791404624, 6820764940134875350, 16069841829669607101, 15548451706938320654, 11760680638795846495, 1560700914733041660, 762367990279432470, 2603436428456411224, 6200990949184863170, 11673627333152839295, 7804486006334068097, 1006207264024395366, 11193609705356653459, 5704515878100803393, 14918729158665343812, 10658508130485449873, 380737719356524599, 12870561906904032245, 6984680585936259437, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13210061556570014836, 1599157050859759633, 12446750015896088802, 10353774239160274935, 11424271721157330669, 15057005486179715954, 8861044108273791962, 12243038632327996294, 6387235594535598756, 10620968503766467282, 10090957857949391364, 610949617653761740, 2641692952954235941, 16682338453560518377, 1667764180674112574, 3944406972826047531, 7937338373741897463, 677543792580138430, 16064632909904135712, 18144484844415291494, 7226453148331774623, 1179808805540104806, 2700524299164928450, 739842910379542056, 18551850792840682, 16856435263285305760, 6893839572721182305, 14666214556500183752, 10619536471246139015, 4063396021928247911, 1116280449848444285, 11377866377890790275, 0, 2008210371491335, 16850544756775285522, 652387120995254672, 4188956971131276775, 18389965100329173053, 852421464532798418, 17258729097516267384, 11347427093515448316, 13908538323250058716, 6558337355650114042, 4089976927111145333, 17816809041231283545, 12843997071522346840, 1655996231185402724, 11256141768734986569, 3019459069615110433, 16778373777892540383, 10175251160015024193, 11396702708789693017, 16481019216530994753, 5122353003150766192, 17913616556333538828, 6485826671956173957, 15738756542654855641, 12199621872357116369, 12077164016468113545, 8907315944885273345, 4878983963291132913, 1618531819557712390, 565132887411573955, 7288090792972058500, 0, 616, 4968648927826019469, 17195207199910519646, 6734621562241387182, 9715952180361858627, 2034771934048449998, 13730246563790151743, 15224252119305799711, 16575323315490024998, 9453153207794904511, 8194394828646838882, 1235308382947710635, 134218781076142871, 12444330148186854115, 16838588367568106248, 3274404606032631663, 8680261223649739505, 13512134067010568333, 15074317169196019601, 3919235389861209780, 14979187502739607198, 1116932806094012842, 12657319342943489784, 998626228777839492, 2347840117369842691, 15743276195226846510, 9881270424621082635, 2778123425092199841, 2613774562373586415, 1448060333031158668, 6190635258012880107, 0, 40, 18130890293586930078, 18252951749527557342, 4460903658820341507, 859505755654562117, 5961685480015386121, 12134776249586726543, 11174658189737631113, 18385152961050631924, 9881471501704199804, 9636744945302995714, 12323181865658998064, 14903454669611502952, 1490539036394497080, 11688514875590095153, 16093513520259190726, 7731471377060742735, 5247500963110975116, 5269361527156951110, 13733877647296302634, 11865469401112846356, 7643242142337524006, 15572658687280648106, 9345628789826937825, 3291248301730279223, 16808111015808513609, 16274730253017522022, 12243901590027926887, 6559275936659510680, 17224785255700525855, 1390310476158884261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16003296542960478536, 13466221688393768258, 12927954860087459534, 3759003303159369746, 1148549753827007441, 7129001791528740265, 5281592040827142238, 16203079979032760691, 7039074043166063940, 9054598259215599503, 2018397558465392243, 16413792935045431209, 12604373665766922919, 1493466405559625913, 11868526707386259660, 3043746450373199613, 8246328563832581273, 5887036391937389613, 2796053561793572028, 7645118395649289364, 12303475117195379639, 207358776078213315, 9218579057118601952, 14479451218433079532, 2031744097966400086, 2566041186493151514, 17259376159632543425, 10376116775360567681, 11289943669462175698, 10804772324353478999, 17288383771256214060, 9885671831159451104, 0, 1606568297193092, 1076973899277284702, 14086579741019377519, 3818478693739735842, 5593621083784091164, 11728670858811596587, 12625736484548160126, 968047239546776409, 15493380284459454506, 15542100289574010625, 15053368214221814937, 17388070103506970075, 4738318434573394804, 15389814481683087606, 14763812299525073807, 384493414835098150, 7660052382355122994, 7691788916209089905, 14721544157906502013, 737940994724202658, 3221762534387838371, 7517398897305596666, 13211005290810103003, 12141388589516060378, 13672030567886044471, 12296311093518063031, 6143526203440544581, 5554567664494429423, 12302163852964786956, 14310991091785572129, 7008881577152522467, 0, 528, 12828040835569540857, 15946070950510533025, 6868712626693654693, 16719465941571322506, 15929304398043808838, 7333330621525318559, 8574904634803746916, 11585949634519199591, 14215120915846294561, 15431555872184246136, 556415272972402332, 13729762303106745810, 1895854814022398925, 16120810718921859928, 14563556215553868244, 9584551737159741567, 1050656582218051719, 2849157683178260515, 4987801895818641338, 3252006976820452311, 4232022539410523688, 12145542090324719848, 13475056960068950678, 4212050629407893798, 18068871666013902057, 4214295938146797537, 13664544216029702565, 1391392205806749871, 3418909895274525076, 4840757955412667387, 0, 32, 10452764368937945515, 6969997263492352670, 15570786589164252178, 16136993048454358354, 16378352067056606124, 11747573379431147483, 12296464969648251345, 8155132212936940581, 2470200969414032680, 18126939303114916528, 16736276280592238734, 15549342782445497049, 9033882039108268313, 5121596298161079296, 14336897502470956191, 6301009824137139871, 16614860627935231068, 10383378433371415142, 10330363517752279308, 10937466001850040595, 16305844076412050396, 7189713532379018536, 7568236447715590536, 10805187342082326609, 7424874700566577356, 13861219118264849665, 7052270251739242825, 17586339544079318164, 14071176523136369481, 12282546735285148319, 3, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6732564319544917702, 11424946734513850952, 14751589151467562513, 3091073535594807983, 17274728363719186424, 6785780051417756764, 15374515033027594653, 12476673273305390844, 11491856728648046938, 889587581187765015, 1832729573374625479, 11964718430105317483, 10284914521902415429, 4989117988224154817, 7310308994414837120, 4896165117485439507, 781193619199190152, 4972018469228063343, 11237024791849123316, 8136517227202567877, 12980119595156137175, 5277784125198234251, 8730957263237386090, 6627357084936364627, 9579937749716133270, 13182791294901350976, 7788172704304532836, 1814160375547940386, 7818804555865981505, 11573391963135759227, 18390005084876364234, 49905639292627904, 0, 401642074298523, 16072847024087248681, 1047399340937520223, 13840617071834531990, 13835424809772757395, 12438858367585478828, 14080077230806112448, 11208516754282785707, 7691155727086178136, 17898846423848868766, 13990233438164144322, 14765296463244153634, 10144768301469359068, 16658833476738371029, 4674204014270448977, 12722211832796318871, 492549161703070590, 13986658207276323375, 14512155514173182920, 13983563295828088546, 2440687363152463730, 15931932209781173412, 11078906302351818677, 3584926465549602493, 6813538466449503008, 2334817027508375898, 12619526317209583817, 6515674137823977144, 393947096345211186, 1951192747307666741, 7526556702499462773, 0, 264, 14858685484860085108, 16638144790071955925, 14803289513390493682, 7947368985060100292, 8540021318758160201, 1005829865088874654, 2182109332887118586, 2709878912677862734, 8639678844062658411, 1087022739668739893, 10504771173378443613, 10062807734250201377, 7979854057356878352, 5264886220300798691, 17178601938487182393, 14209807647112141969, 364963036030481104, 6977342036970944167, 9475211165936098151, 2067156367555811068, 13444810812224497486, 17338503932931685384, 18075892757378330321, 5992364927925930356, 280994234174845985, 4192504288997153355, 10293012497513243194, 12632074680840502609, 12384471116364520725, 14304772746964984975, 0, 8, 9114363797835460134, 5446076396314160376, 12863008906537145423, 10008421878335836436, 9952321233871043669, 12872379155893703237, 7266552182027361169, 1266036355585216796, 2621902104176569009, 8791105532651972211, 6351975813451610601, 11821139808280113179, 11281913023757770338, 3277134497757048289, 13219080767636598429, 10181825490691565485, 2766637533497216499, 5527857141123489970, 8463471033597650592, 16863468430858262436, 4521466714741486225, 2112404415880305855, 6776665887355979100, 4283028800297139078, 17448147405455891940, 2672696094870261596, 654959311657763753, 15404879372302137522, 458610335793450516, 11708893791522292939, 3358534066525179769, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16687523027086140644, 9086882804838007993, 18208410790236506017, 3398985649909830369, 11870335859895317550, 1782594595734670280, 7950908231675299553, 11699755763721080867, 5559192297727634984, 15856483324254330201, 3827177513892222045, 8697421447132597636, 6525137006607571383, 9739016092723027913, 37096681180297292, 5998909423699657245, 1737478325904747641, 9603988472267868801, 14612309354257526062, 963817021754931361, 2954837086209820968, 11485058781500311480, 10011022503247302490, 6596157637386353039, 2185026052398200396, 8667196121129603577, 17444739644589522901, 17384087895468261804, 4673396992430997118, 5652365973964779246, 14148401294484512817, 594790136239256278, 0, 401642074298403, 6959791354043610236, 1843180796447728437, 9556362158826632350, 3220022195391792741, 6012411438022691140, 4309223969498591447, 7596903557041777533, 18393682838284953355, 3973832102121938954, 12190997158276486897, 15972235844585587264, 14899488070931524727, 17337514399056563302, 10500237188498665928, 18440452962210035879, 7481614450647261413, 65300580117832193, 14713590013611289205, 13086268929321267306, 17247769089209001713, 11421561962034654967, 4561010052951998759, 9562817622798343284, 3062054327467638127, 6016566887476098647, 5513989129644936969, 13097123292793361360, 17631302057213141907, 8382824402074565601, 16136160484984138575, 0, 88, 11332670461359993442, 14431967032738938661, 10393518078208184991, 2462224494429193628, 2381519205788696693, 5156397633515475273, 13071332837477200404, 6583788956280193302, 8309261923972302555, 7204946769828595498, 10143223184962015615, 2291749916011172217, 12651590612371699683, 1757329184049619756, 8575055855333374088, 10782010546727900871, 11693001677843026089, 13372591108841832182, 6745878472543166577, 17326074735792689056, 17178266551378060244, 9012900451066906030, 9513119903156534723, 14316793092410720577, 15850020848376370982, 5093266838540794296, 2953143545478827927, 9172592184988170325, 3259030218090439002, 13670896049781213124, 0, 8, 6104172690014223231, 3119855977255645286, 2700229040680838768, 4228220371303630837, 12976691418076017877, 15391527008624099592, 15522155400452634037, 17655908650961725957, 5157987610310047621, 13664486701019622043, 12908699189677656287, 14840926611057477527, 6092037682822283700, 15181448373122947619, 2083722204849270202, 1893419523737526751, 11329911669537538562, 12331432886354737271, 9636585409664050258, 5131588463040403759, 10248116973079783912, 2136665268102207704, 17448444978654544666, 11945433761064128885, 4462464721020457233, 17579935132869425842, 7098417589530391109, 15343623253038912080, 7762335122892638892, 10310226363807226654, 9365253138981608257, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 6538312968872592849, 8060897427763484267, 15694315280551902473, 15462035367190511759, 16783127636073026773, 10756964923802715923, 4768450986425500783, 586150029444692874, 14745636460228146879, 5204776334183399126, 7685703760533694936, 16111592919872596132, 6944599323919802145, 1254987403839644538, 9402574875622777470, 16210856058698621820, 6207690803740787708, 5909774410804808527, 11610503998702777421, 686805010274260483, 8419527378140004636, 6342702858222909287, 8706567413279745902, 8451985615096117101, 8796637399824800240, 15979424445015031332, 13704751155696621736, 18261872069356847559, 7568935938034555881, 3939988349760901151, 3558778201956820739, 0, 2008210371491335, 13098960849839742034, 9449621519891201049, 2814310786559014444, 5305842545683321494, 4969236906288915907, 1243780951433164967, 6167749875842285147, 9490220981060631819, 3665259354621890034, 7437125179920904126, 12655958476488865400, 17935537000594940941, 91614862745339577, 1869550524566103495, 17384150297165671545, 1154605885284628266, 8665046436862728398, 6741156569294553317, 9490927005547387767, 8947900188307771735, 13752550215202657538, 7714188412126691626, 12225947487197390724, 13509943592829854189, 7120740401378484294, 6789669275155346195, 2929601484581949152, 1077164174037184778, 7253613682453412944, 12957959164911169922, 0, 1232, 6031863247325663438, 674016650738724202, 9655491867310024790, 4753798685424869288, 10749041705000945043, 14520855376130294244, 1540176383869885892, 10236894625417199268, 9196614711423540610, 7978597004657283049, 6086008265617713639, 14043785705271347590, 10693788391520380705, 12309293813476849789, 12287432898048046644, 12476380710530844150, 2814554338965902349, 12370730861881949935, 13055692992345669402, 801564953257569940, 10614676804436196472, 7985393687855976209, 16788264280259941604, 4042445936043537075, 17844212763579117389, 14723420347046552696, 2456530167870834703, 7343890316269580191, 6483315548845037473, 9440211366785524370, 0, 40, 1560947813056021755, 6935064976442414148, 9999441144135002932, 10354700837586583171, 6040781227937012106, 4698117391978117444, 4735711626023545756, 11217844833019453026, 3130590714605394722, 2809204122464618686, 10935232469327759448, 18335893537613898174, 10868401885487323501, 15799177281014635734, 17187052562019754838, 4027411046406207040, 11879721967266924677, 3613659344771632047, 1846469577394958972, 14668357323201408029, 14939045883642543835, 2885718226990976376, 4969257074069595075, 10824274197210729467, 13212275138420405274, 10563919532671437398, 12234598862193668129, 14653607410806008848, 2498958194485300229, 3512215170452429648, 4243893038989355703, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 7206805482451038763, 10391043349415287037, 17044036436784806527, 13171139175044072684, 2094744771380247596, 13239410091625892436, 168039991714389118, 9272483157421678641, 9491323991579079848, 16844742792488708348, 9520544349855559315, 792788122696624862, 16163267682416611248, 7281147841738764349, 9382208451579624348, 15681622260194273891, 1390751769269680465, 8196141638178857464, 15172831853577650839, 12922697597526240324, 7829823799088278618, 1783927422614660621, 4975249353684987436, 13048186608776014077, 3034445649013398243, 6966167031354634355, 7794510095811729812, 8010670397007670803, 871847630272290682, 18441078654886601219, 1106728433230065324, 0, 1606568297193092, 17457628753812655267, 5096693283465186518, 12947605480618213072, 13490514080936595140, 16186587491946121120, 10245245868334896235, 6026705707665599719, 9827345407768028181, 2812471843237874845, 12940670116574659651, 2714930976118111710, 11931084046533097040, 5957825878304116293, 4815270995456833861, 3281433232253188744, 1527514044633931889, 3155608937877823823, 496495357063373704, 12643114535206930756, 2926290280590787897, 4481685646324082958, 2913086696180341350, 4929647997916999987, 9053067786296036128, 12860916533743270733, 13426707234447106813, 15934882759672330788, 2173747106952139997, 5260381980138555939, 9238536158694879401, 88, 1056, 10194964851803169917, 2476887483552371976, 9610004573075108621, 4964236593939309395, 10117579878001530331, 8588168632019162203, 7961669463441676499, 8688363314921128388, 7669238601546834041, 15117861700401653408, 7267798175629900560, 18420331634788000621, 2168204218347522931, 13774182815867438503, 11793649490935032382, 264326996749206681, 422815844549413164, 11144132125283193307, 16600930886850462534, 14741236577529096830, 7550071867985447349, 10163945784944658272, 8810849992229527370, 979169410947035438, 18181508983255172512, 10501853123801116024, 10292737970295456228, 632012914013142222, 9098012027422757538, 7698805642109006453, 0, 32, 9302012295643728416, 424328237663665361, 17748121622218558811, 6681769685034042719, 10907932526941371789, 14996603190997478665, 13982878080104642188, 3336783822228111865, 7403528606603453519, 7309352233404946366, 11509327586943808925, 6803943428138467537, 12870260590513220077, 3798257798625653324, 15652192157997003684, 8260391000410661595, 9099897743400681933, 16067207775248165408, 7640841583197908852, 16739199083410292994, 1998275509994500625, 10688417071827877337, 16160081185811655577, 2725954513011781037, 3040692668058239811, 15097072321276989567, 7813293313258815644, 15261763399945716285, 2258772319189190202, 6756061023037720295, 2372900269115514267, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2643697525295255282, 7848268271641614303, 1670964981039714496, 12506995107569119516, 16020980424362300069, 3910461774754452973, 14887150284650111993, 11430895388638705560, 15925982986489674986, 559122298435457095, 16369319727902045750, 5911900249842037740, 9993545485068101534, 16804807948024450931, 6109216944498588777, 6962786378900996817, 14779846517676698965, 14597810963258762343, 16333362039819991192, 2239891938742671995, 8902636803530046125, 12348911713752556021, 9576130314342554279, 9464686824958661262, 14724291818312841818, 5956660324772534609, 5179789141411429720, 14891365206755013222, 833106187556617464, 14690990432528119604, 7399742180187746173, 0, 401642074298523, 10076989882539553734, 13617634258944637452, 11664888937794835322, 6832371865971954132, 7435465380685145582, 8856983143236954540, 15647394574465449881, 5004639611979401749, 16333513927375132208, 11586223746088007538, 17258599442845821467, 10089347514894229223, 8927362828162004403, 1274761678102044944, 13987176689734561031, 968318691601385838, 17920302096119022338, 18172419653743826470, 5238866342343116613, 4715585282245523496, 6782917713521523376, 845034972551066538, 8264516316211712068, 4395820162956710988, 17367170950581948054, 11715439359473390301, 4924405821869545305, 1674381281184830519, 4077397353846458666, 16570851802495678006, 0, 528, 3020492374890726247, 15867024276402164724, 2691485309401819348, 10383311521670833729, 16323720466012865692, 12111425008963394821, 6863497050423701439, 4068736078963485223, 6871052579055075230, 11135759119963236724, 8026699645344521142, 4857505768584918289, 10792639723427933554, 15144263097518946995, 2672819086738268108, 9175748808845810742, 8523928999979138359, 5837654600063955860, 4020408003683484830, 6777545915715419993, 16222025381660955186, 14681340973312169871, 11211579677305883898, 8623233971250462580, 418056849863168392, 2919384330136358405, 2666974936005298869, 14966813495153624489, 13584072213050301608, 17057575786157171701, 0, 8, 7519454690376123692, 7627104070861575574, 17604686071836489236, 14277148259130460564, 8312218486680706135, 8395439642754559152, 17307771294890409643, 9298206908486537717, 3027629924013931359, 2933551330348935458, 1450485994192951386, 8585052201707081835, 10624425952582111111, 16773523322999621677, 13337622149287916761, 17874287708894504070, 14164897610403484003, 11216401648549709020, 911970190394256131, 3202853507803349037, 14616902435260689479, 14924823153427050614, 4881022900440414264, 9723366934152472594, 16335725686098559697, 8087897843744270993, 11437013713086863200, 7627258546495067733, 18044191572661655945, 16490279521751489469, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 392081819927674604, 13621084556403650323, 17078772340992927473, 862170971660204027, 5676881743340217488, 5517012370953012053, 3863387227510711423, 6521284656283570782, 17282496836457066698, 8668839984066399279, 10481218501610762636, 13268880552322298648, 9575112247205521418, 14191613402325013881, 17855143966403217682, 8464300128340058390, 4400313738036540825, 14739186344673284697, 1501891124109012983, 9798699259742823392, 8843421723884165135, 7746605484191389759, 8323169935435436763, 15323881858459172368, 8509325593168557185, 14233099751914870044, 12164983556041574509, 17356025534910089368, 2031310896521954322, 16067965450256037769, 8147499972447601337, 0, 401642074298403, 9851586117636382793, 7414079509745519565, 10414894202973226643, 11403399710197601656, 10230759118395809329, 4887466173119518776, 12376579030877442488, 15222686873173021915, 11343634646223977946, 15054143113295762432, 8578483304162845495, 8187399805941604842, 17460975957431844228, 12368453570037757143, 4715095521846408852, 10685847052710927197, 5160934306801665605, 12877482432527277885, 1026289052488784895, 12183816968946827507, 954239020314042893, 1899038343674936222, 3582199871763692750, 10141562795735590523, 5883730844910027408, 10313342961711791200, 10308552102917724507, 1101239144209002141, 16732112788727027442, 6132059608254040410, 0, 176, 14015299246960655077, 18240053740881435667, 9264051620447261114, 3770835013589498382, 14269426645353023865, 1064418857115644823, 9055361938666247589, 1923541152082479674, 7329032621716426413, 14147095007921770778, 12290092320014837503, 14167154425694482177, 2008826339817234435, 12727493810822145141, 13765995246049388004, 5723824967382588797, 11506863252089006870, 13547802874613831044, 2099106023167119258, 6345494554579617353, 13921991112058773762, 5885105447661412229, 8709961227558437878, 9751610933111772233, 13912537796384226859, 5691895930177454540, 2936046437280927758, 7163672760378086559, 12965649133168865250, 17131584050600476194, 0, 8, 17781582622500481192, 12847902632736061277, 12021499907877242591, 16751519355106661703, 9062087890172095618, 3834953580385337540, 2969703856153678454, 11604562295556139307, 10447912046373566534, 12987934619706800857, 12352596220492768030, 14816150974992525275, 2172600571554701126, 18086375044546604023, 16313093185369681775, 14997664071320688070, 347950016295486690, 9206182676441692601, 3566552483989599402, 4925983231752336365, 1728701557101400581, 7087476601458867917, 9759961360999781392, 12569092891286895547, 14206292953735333262, 16422952955631166803, 6294107725304445883, 9537940691512987143, 15535806100011306333, 7080716573279759555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4099276459869907627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(18) }, program_info: ProgramInfo { program_hash: Word([9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 19, range_trace_len: 47, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 2, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 0, 0, 0, 0, 0, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 3137828705454, 1, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 1, 1, 1, 0, 1, 0, 24514286761, 1, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 40, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 2, 1, 4, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 191517865, 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 1496233, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 11689, 1, 0, 0, 0, 0, 0, 0, 1, 2, 4, 0, 0, 0, 0, 0, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 91, 1, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 7, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 11, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 13, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 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, 16, 0, 0, 15, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 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, 16, 0, 0, 16, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 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, 16, 0, 0, 17, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 11377866377890790275, 9885671831159451104, 49905639292627904, 594790136239256278, 3558778201956820739, 1106728433230065324, 7399742180187746173, 8147499972447601337, 0, 0, 1, 0, 0, 1, 1, 0, 0, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 7288090792972058500, 7008881577152522467, 7526556702499462773, 16136160484984138575, 12957959164911169922, 9238536158694879401, 16570851802495678006, 6132059608254040410, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 6190635258012880107, 4840757955412667387, 14304772746964984975, 13670896049781213124, 9440211366785524370, 7698805642109006453, 17057575786157171701, 17131584050600476194, 0, 0, 1, 0, 0, 1, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 88, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13342492399873323769, 4511615971967153504, 9085863547783897978, 13728083094831419091, 4968648927826019469, 12828040835569540857, 14858685484860085108, 11332670461359993442, 6031863247325663438, 10194964851803169917, 3020492374890726247, 14015299246960655077, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1439796670523758837, 11189511375577512439, 4029278259426396811, 5555139373262852832, 17195207199910519646, 15946070950510533025, 16638144790071955925, 14431967032738938661, 674016650738724202, 2476887483552371976, 15867024276402164724, 18240053740881435667, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2591609871503882494, 14523290705070057408, 16053154709446024998, 2905384006316447019, 6734621562241387182, 6868712626693654693, 14803289513390493682, 10393518078208184991, 9655491867310024790, 9610004573075108621, 2691485309401819348, 9264051620447261114, 1, 0, 0, 0, 1, 0, 16310674867943291767, 6055575173485499620, 12415403453461233454, 5919456033500076693, 11602649596278030541, 15730095788089532534, 12155959663009124293, 9715952180361858627, 16719465941571322506, 7947368985060100292, 2462224494429193628, 4753798685424869288, 4964236593939309395, 10383311521670833729, 3770835013589498382, 1, 0, 0, 0, 1, 0, 18087077157995694324, 16330777485816030986, 10063042555031126160, 5687909194194711965, 7973996941547777109, 7908104163460391198, 5239197399579256268, 15224252119305799711, 8574904634803746916, 2182109332887118586, 13071332837477200404, 1540176383869885892, 7961669463441676499, 6863497050423701439, 9055361938666247589, 1, 0, 0, 0, 1, 0, 16967670111924614213, 17486841943826861107, 18307481886056309438, 7941686916236651549, 3672880019205947738, 2236539493336923746, 5670979983981263850, 8194394828646838882, 15431555872184246136, 1087022739668739893, 7204946769828595498, 7978597004657283049, 15117861700401653408, 11135759119963236724, 14147095007921770778, 1, 0, 0, 0, 1, 0, 15248998622285712496, 1816831098907864072, 1977941839824239836, 10471520652203868473, 12969815742735761919, 12829755263022627333, 7984319522957739004, 12444330148186854115, 1895854814022398925, 7979854057356878352, 12651590612371699683, 10693788391520380705, 2168204218347522931, 10792639723427933554, 2008826339817234435, 1, 0, 0, 0, 1, 0, 1949341260302477275, 10525442150725175322, 10268663784703415650, 4586059525590481046, 10757916804785969985, 2326984138263422166, 5769086287272836702, 8680261223649739505, 9584551737159741567, 14209807647112141969, 10782010546727900871, 12476380710530844150, 264326996749206681, 9175748808845810742, 5723824967382588797, 1, 0, 0, 0, 1, 0, 13440535156983805468, 12080935995323460100, 9067005830434678477, 14314758709191331837, 1326425913004665964, 18320766430359725566, 13803823311240773956, 3919235389861209780, 4987801895818641338, 9475211165936098151, 6745878472543166577, 13055692992345669402, 16600930886850462534, 4020408003683484830, 2099106023167119258, 1, 0, 0, 0, 1, 0, 5892436324803940896, 7017064751240904271, 10317850206740106337, 16403500445172050158, 8998725782446855275, 15603212774947060210, 14994098977964244257, 12657319342943489784, 12145542090324719848, 17338503932931685384, 9012900451066906030, 7985393687855976209, 10163945784944658272, 14681340973312169871, 5885105447661412229, 1, 0, 0, 0, 1, 0, 13935905759807022949, 0, 0, 6981555831806437627, 3320646806195653797, 2577750295211676178, 15041604777168753281, 15743276195226846510, 18068871666013902057, 280994234174845985, 15850020848376370982, 17844212763579117389, 18181508983255172512, 418056849863168392, 13912537796384226859, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13711912288503888270, 502156843765695809, 360850050916534143, 10958079103202840999, 2778123425092199841, 13664544216029702565, 10293012497513243194, 2953143545478827927, 2456530167870834703, 10292737970295456228, 2666974936005298869, 2936046437280927758, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7425430573821419685, 13147348360138928114, 7183698983616787617, 17793074612839242130, 2613774562373586415, 1391392205806749871, 12632074680840502609, 9172592184988170325, 7343890316269580191, 632012914013142222, 14966813495153624489, 7163672760378086559, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16752277069679715408, 11903841834984596874, 9070535322622906244, 3601655880141993647, 1448060333031158668, 3418909895274525076, 12384471116364520725, 3259030218090439002, 6483315548845037473, 9098012027422757538, 13584072213050301608, 12965649133168865250, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 6190635258012880107, 4840757955412667387, 14304772746964984975, 13670896049781213124, 9440211366785524370, 7698805642109006453, 17057575786157171701, 17131584050600476194, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16253482711025978099, 5751576643258238090, 7110029021941723513, 3208043314804619251, 18130890293586930078, 10452764368937945515, 9114363797835460134, 6104172690014223231, 1560947813056021755, 9302012295643728416, 7519454690376123692, 17781582622500481192, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16690839578921925157, 7830268710878889486, 10115409991715085575, 6920597847411412414, 18252951749527557342, 6969997263492352670, 5446076396314160376, 3119855977255645286, 6935064976442414148, 424328237663665361, 7627104070861575574, 12847902632736061277, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11755424915479552417, 4868320831660690795, 11428668827299215140, 17985619796195836408, 4460903658820341507, 15570786589164252178, 12863008906537145423, 2700229040680838768, 9999441144135002932, 17748121622218558811, 17604686071836489236, 12021499907877242591, 1, 0, 0, 0, 1, 0, 4447686994046778179, 11785000236654418865, 10679155400143926564, 17934377671577204140, 7042762868047858013, 4015039023438705588, 11907191178709112742, 859505755654562117, 16136993048454358354, 10008421878335836436, 4228220371303630837, 10354700837586583171, 6681769685034042719, 14277148259130460564, 16751519355106661703, 1, 0, 0, 0, 1, 0, 217106376514171653, 11707313943908545641, 15092932467239161061, 11049594146888643723, 7267371538363991280, 8421627027326523148, 9466912758182965715, 11174658189737631113, 12296464969648251345, 7266552182027361169, 15522155400452634037, 4735711626023545756, 13982878080104642188, 17307771294890409643, 2969703856153678454, 1, 0, 0, 0, 1, 0, 11044550050665632476, 8958367422149199561, 16497379967830959424, 9105126057127804171, 13427183447069512151, 15171283498151438808, 1953587265841775225, 9636744945302995714, 18126939303114916528, 8791105532651972211, 13664486701019622043, 2809204122464618686, 7309352233404946366, 2933551330348935458, 12987934619706800857, 1, 0, 0, 0, 1, 0, 1877907417051268915, 6151364593092129113, 13049072304454003157, 14569284676797348998, 6517696895688418945, 14662750186533371679, 16069841829669607101, 1490539036394497080, 9033882039108268313, 11281913023757770338, 6092037682822283700, 10868401885487323501, 12870260590513220077, 10624425952582111111, 2172600571554701126, 1, 0, 0, 0, 1, 0, 10197860193367132813, 18317591232122268101, 11864893253666570624, 2835737623710330612, 12960707821770488929, 11079168775731474830, 1560700914733041660, 7731471377060742735, 6301009824137139871, 10181825490691565485, 1893419523737526751, 4027411046406207040, 8260391000410661595, 17874287708894504070, 14997664071320688070, 1, 0, 0, 0, 1, 0, 7903888723576875237, 18382523577454102436, 13167437966520740716, 15482419984058848245, 7634329044629047826, 7042468264080735391, 6200990949184863170, 13733877647296302634, 10330363517752279308, 8463471033597650592, 9636585409664050258, 1846469577394958972, 7640841583197908852, 911970190394256131, 3566552483989599402, 1, 0, 0, 0, 1, 0, 2186301169863059887, 6122215293275160143, 16696916221087249943, 5297995970636059087, 6007758954686348362, 4655654314239637986, 1006207264024395366, 15572658687280648106, 7189713532379018536, 2112404415880305855, 2136665268102207704, 2885718226990976376, 10688417071827877337, 14924823153427050614, 7087476601458867917, 1, 0, 0, 0, 1, 0, 4350099661540135647, 0, 0, 770728251595531533, 434120282701603474, 899748567092010447, 14918729158665343812, 16808111015808513609, 7424874700566577356, 17448147405455891940, 4462464721020457233, 13212275138420405274, 3040692668058239811, 16335725686098559697, 14206292953735333262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1347942901513492691, 5581285869985960561, 15417366235984526759, 380737719356524599, 12243901590027926887, 7052270251739242825, 654959311657763753, 7098417589530391109, 12234598862193668129, 7813293313258815644, 11437013713086863200, 6294107725304445883, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12086966446141742548, 6581368197537384623, 3331301994171189600, 12870561906904032245, 6559275936659510680, 17586339544079318164, 15404879372302137522, 15343623253038912080, 14653607410806008848, 15261763399945716285, 7627258546495067733, 9537940691512987143, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10239457018222882008, 17661012293298952642, 15814677761660135474, 6984680585936259437, 17224785255700525855, 14071176523136369481, 458610335793450516, 7762335122892638892, 2498958194485300229, 2258772319189190202, 18044191572661655945, 15535806100011306333, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 1, 0, 0, 0, 1, 0, 0, 0, 0, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14280802901810915241, 1835177830541154044, 10010111294767420802, 2549897079792572603, 16850544756775285522, 1076973899277284702, 16072847024087248681, 6959791354043610236, 13098960849839742034, 17457628753812655267, 10076989882539553734, 9851586117636382793, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7925919485060883878, 826263100281998566, 16943179644353820008, 5670682422759337153, 652387120995254672, 14086579741019377519, 1047399340937520223, 1843180796447728437, 9449621519891201049, 5096693283465186518, 13617634258944637452, 7414079509745519565, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9094034340168608638, 9612296353153372169, 8996122336997085030, 4249626004536644548, 4188956971131276775, 3818478693739735842, 13840617071834531990, 9556362158826632350, 2814310786559014444, 12947605480618213072, 11664888937794835322, 10414894202973226643, 1, 0, 0, 0, 1, 0, 206637164063268726, 10092260866618400225, 13038545162971821924, 6650811367268781560, 2509054224639990472, 17350347680949584060, 9138873913574622404, 18389965100329173053, 5593621083784091164, 13835424809772757395, 3220022195391792741, 5305842545683321494, 13490514080936595140, 6832371865971954132, 11403399710197601656, 1, 0, 0, 0, 1, 0, 13042021488072180943, 17665366762968375743, 14514089290800305099, 13091389828882674218, 4611398810491526224, 81685142906752346, 2149720931386886989, 11347427093515448316, 968047239546776409, 11208516754282785707, 7596903557041777533, 6167749875842285147, 6026705707665599719, 15647394574465449881, 12376579030877442488, 1, 0, 0, 0, 1, 0, 7479226098762365380, 20647088475708265, 14234714302482719672, 680445747454648704, 10159688738464070440, 9792116363139842106, 7330871518527332444, 4089976927111145333, 15053368214221814937, 13990233438164144322, 12190997158276486897, 7437125179920904126, 12940670116574659651, 11586223746088007538, 15054143113295762432, 1, 0, 0, 0, 1, 0, 13347963917530181895, 10889708507292659338, 4175833649164370394, 5233297770622824375, 745298233749984501, 1134592111928495305, 10789212522972025785, 1655996231185402724, 15389814481683087606, 16658833476738371029, 17337514399056563302, 91614862745339577, 5957825878304116293, 8927362828162004403, 17460975957431844228, 1, 0, 0, 0, 1, 0, 6929809241430544204, 6641711964892684437, 12124997350307806549, 9867160564810673994, 17942681985602265676, 4841731940180862534, 5554647570062987979, 16778373777892540383, 7660052382355122994, 492549161703070590, 7481614450647261413, 1154605885284628266, 1527514044633931889, 968318691601385838, 10685847052710927197, 1, 0, 0, 0, 1, 0, 17634176407370476921, 7739526124990237795, 13838384228721941065, 10263347723858682786, 10152063658776528390, 2487841274273895537, 14002884382934858252, 16481019216530994753, 737940994724202658, 13983563295828088546, 13086268929321267306, 9490927005547387767, 12643114535206930756, 5238866342343116613, 1026289052488784895, 1, 0, 0, 0, 1, 0, 6697396169967230934, 18287805115840952516, 14443334479498508931, 9643915442530902318, 5274902253855511588, 8629130978595053833, 13067519389098510351, 6485826671956173957, 13211005290810103003, 11078906302351818677, 4561010052951998759, 7714188412126691626, 2913086696180341350, 845034972551066538, 1899038343674936222, 1, 0, 0, 0, 1, 0, 15116382065750335012, 0, 0, 887493237489321299, 6033538369482377655, 16798226782780142546, 16399505509770566014, 12077164016468113545, 12296311093518063031, 2334817027508375898, 6016566887476098647, 7120740401378484294, 12860916533743270733, 17367170950581948054, 5883730844910027408, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13483864438078018308, 3570589185097006252, 9731250716956559616, 11950037765875050974, 4878983963291132913, 5554567664494429423, 6515674137823977144, 13097123292793361360, 2929601484581949152, 15934882759672330788, 4924405821869545305, 10308552102917724507, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8159241411748295729, 4587292818271677447, 12286920896461242142, 12195903600484928258, 1618531819557712390, 12302163852964786956, 393947096345211186, 17631302057213141907, 1077164174037184778, 2173747106952139997, 1674381281184830519, 1101239144209002141, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10385528691577928985, 16771298688176486904, 1919835269886444210, 17694444981837938563, 565132887411573955, 14310991091785572129, 1951192747307666741, 8382824402074565601, 7253613682453412944, 5260381980138555939, 4077397353846458666, 16732112788727027442, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 7288090792972058500, 7008881577152522467, 7526556702499462773, 16136160484984138575, 12957959164911169922, 9238536158694879401, 16570851802495678006, 6132059608254040410, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4383606322674378669, 13264028927506398677, 4766776471757604196, 14660905060901389201, 12446750015896088802, 12927954860087459534, 14751589151467562513, 18208410790236506017, 8060897427763484267, 10391043349415287037, 7848268271641614303, 13621084556403650323, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11282929110176162954, 5896249534368220847, 12230245468863423579, 17357985657180629743, 10353774239160274935, 3759003303159369746, 3091073535594807983, 3398985649909830369, 15694315280551902473, 17044036436784806527, 1670964981039714496, 17078772340992927473, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17215248529293365853, 11382862066285680273, 18104224094677170296, 10490790376815116141, 11424271721157330669, 1148549753827007441, 17274728363719186424, 11870335859895317550, 15462035367190511759, 13171139175044072684, 12506995107569119516, 862170971660204027, 1, 0, 0, 0, 1, 0, 18208784611061899534, 11090107870009134382, 15816468029966600756, 13193227772306657556, 5436084715181539253, 15873409126341319274, 8856174280738574418, 15057005486179715954, 7129001791528740265, 6785780051417756764, 1782594595734670280, 16783127636073026773, 2094744771380247596, 16020980424362300069, 5676881743340217488, 1, 0, 0, 0, 1, 0, 3995660239591967986, 13991065272063476564, 4842320139602494012, 5492874275384737590, 9049442861863566881, 9007898958502691821, 9423711593310475409, 6387235594535598756, 7039074043166063940, 11491856728648046938, 5559192297727634984, 586150029444692874, 9272483157421678641, 11430895388638705560, 6521284656283570782, 1, 0, 0, 0, 1, 0, 10265417819422388610, 3230613796530740211, 8204482557338271208, 5965860733558915216, 3732227441816681926, 4972858056675247397, 15435624740876731287, 610949617653761740, 16413792935045431209, 11964718430105317483, 8697421447132597636, 7685703760533694936, 9520544349855559315, 16369319727902045750, 10481218501610762636, 1, 0, 0, 0, 1, 0, 4200148723083586126, 8898019494692638676, 9361391436000884061, 6906630570311142812, 10416842793286403595, 15154449156086880838, 17187582840477322187, 1667764180674112574, 11868526707386259660, 7310308994414837120, 37096681180297292, 1254987403839644538, 7281147841738764349, 16804807948024450931, 14191613402325013881, 1, 0, 0, 0, 1, 0, 6921512846940257894, 8083147322870350598, 7402338099048749868, 11028121748345672612, 9182929970775715030, 642245012387336876, 9940061963065628902, 677543792580138430, 5887036391937389613, 4972018469228063343, 9603988472267868801, 6207690803740787708, 1390751769269680465, 14779846517676698965, 4400313738036540825, 1, 0, 0, 0, 1, 0, 15720913686265040726, 11620345195770806393, 392865519522630483, 10866688391213961683, 4078956937078417294, 8169860993617536308, 13903556343063122489, 7226453148331774623, 12303475117195379639, 12980119595156137175, 2954837086209820968, 686805010274260483, 12922697597526240324, 2239891938742671995, 9798699259742823392, 1, 0, 0, 0, 1, 0, 1576291082626878936, 6836143998208741199, 5718769156293156294, 501346961392724628, 12301747922262729865, 7909458165142256993, 17643816943101201258, 739842910379542056, 14479451218433079532, 6627357084936364627, 6596157637386353039, 8706567413279745902, 4975249353684987436, 9576130314342554279, 8323169935435436763, 1, 0, 0, 0, 1, 0, 13015036049004182291, 0, 0, 3820689183586493894, 8535816953133153286, 12781603895645888322, 4895491920411997249, 6893839572721182305, 17259376159632543425, 7788172704304532836, 17444739644589522901, 15979424445015031332, 6966167031354634355, 5956660324772534609, 14233099751914870044, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2862138511955678409, 2554244438665697829, 9129723360543316479, 16513197729164811328, 10619536471246139015, 11289943669462175698, 7818804555865981505, 4673396992430997118, 18261872069356847559, 8010670397007670803, 14891365206755013222, 17356025534910089368, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7758258992155315690, 6695383891040002341, 2424787611628537668, 4815287357290896051, 4063396021928247911, 10804772324353478999, 11573391963135759227, 5652365973964779246, 7568935938034555881, 871847630272290682, 833106187556617464, 2031310896521954322, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17115115516972321026, 9265251570417433175, 16343713044075599831, 3003012580421078075, 1116280449848444285, 17288383771256214060, 18390005084876364234, 14148401294484512817, 3939988349760901151, 18441078654886601219, 14690990432528119604, 16067965450256037769, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 11377866377890790275, 9885671831159451104, 49905639292627904, 594790136239256278, 3558778201956820739, 1106728433230065324, 7399742180187746173, 8147499972447601337, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 40, 0, 0, 3, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1, 0, 1, 1, 10, 0, 0, 0, 1, 0, 1, 1, 0, 40, 0, 0, 12, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 9, 0, 4099276459869907627, 1, 10, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 7, 8, 9, 10, 2197, 4384, 6571, 8758, 10945, 13132, 15319, 17506, 19693, 21880, 24067, 26254, 28441, 30628, 32815, 35002, 37189, 39376, 41563, 43750, 45937, 48124, 50311, 52498, 54685, 56872, 59059, 61246, 63433, 64162, 64891, 65134, 65377, 65458, 65485, 65512, 65521, 65530, 65533, 65534, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(18) }, program_info: ProgramInfo { program_hash: Word([9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 19, range_trace_len: 49, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 2, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_23.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_23.snap index f743d6b60a..0f9c32d88a 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_23.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_23.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 1, 65, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5482243896119908732, 401642074298203, 3137828705454, 24514286761, 191517865, 1496233, 11689, 91, 0, 0, 0, 5482243896119908732, 3358534066525179769, 8, 0, 3358534066525179769, 13210061556570014836, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525], [17271741639510569126, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17271741639510569126, 9365253138981608257, 0, 65, 9365253138981608257, 16003296542960478536, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728], [10627125303494028926, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10627125303494028926, 4243893038989355703, 0, 0, 4243893038989355703, 6732564319544917702, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410], [12334791106787903660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12334791106787903660, 2372900269115514267, 0, 0, 2372900269115514267, 16687523027086140644, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683], [13210061556570014836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16003296542960478536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6732564319544917702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16687523027086140644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4, 3, 2, 2, 2, 2, 2, 2, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [3358534066525179769, 3358534066525179769, 3358534066525179769, 40, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [9365253138981608257, 9365253138981608257, 9365253138981608257, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4243893038989355703, 4243893038989355703, 4243893038989355703, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2372900269115514267, 2372900269115514267, 2372900269115514267, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 17, 16, 16, 16, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 2, 0, 0, 0, 0, 0, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 7, 8, 9, 2196, 4383, 6570, 8757, 10944, 13131, 15318, 17505, 19692, 21879, 24066, 26253, 28440, 30627, 32814, 35001, 37188, 39375, 41562, 43749, 45936, 48123, 50310, 52497, 54684, 56871, 59058, 61245, 63432, 64161, 64890, 65133, 65376, 65457, 65484, 65511, 65520, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5482243896119908732, 18015781855758016478, 4383606322674378669, 11282929110176162954, 17215248529293365853, 13193227772306657556, 11735240166769603875, 3717289286029653294, 5492874275384737590, 12486768927296380145, 7992161010257837902, 5965860733558915216, 13973209423992708161, 5139670008027876415, 6906630570311142812, 808538110186084468, 2187643142553675840, 11028121748345672612, 18181286167455191614, 15014367804365107227, 10866688391213961683, 16520440189869744108, 5493823407617825232, 501346961392724628, 18105097706170191265, 13534558354914049543, 3820689183586493894, 16784019981734849061, 2862138511955678409, 7758258992155315690, 17115115516972321026, 9874694795284567525, 401642074298203, 4016420742982670, 14280802901810915241, 7925919485060883878, 9094034340168608638, 6650811367268781560, 13344927435882217244, 15870694671012449597, 13091389828882674218, 168434371192049215, 13973668876111195937, 680445747454648704, 15441309962929722976, 15749770188837954531, 5233297770622824375, 3367253731665130938, 5066484463076591248, 9867160564810673994, 16707816004584596036, 6832899290197418961, 10263347723858682786, 6209209797490182000, 8678413656546712232, 9643915442530902318, 17208626611000903707, 11389822518212260982, 887493237489321299, 48736118273260452, 13483864438078018308, 8159241411748295729, 10385528691577928985, 5482243896119908732, 0, 616, 13342492399873323769, 1439796670523758837, 2591609871503882494, 5919456033500076693, 5232333079875635931, 12079101376381790329, 5687909194194711965, 13514584364960626778, 10501272396704173758, 7941686916236651549, 11501430483965911830, 10227424397178507773, 10471520652203868473, 14226149352545573719, 5877312072455938554, 4586059525590481046, 1601223390241498740, 2723805050156540964, 14314758709191331837, 15918659712373688555, 3030433806959200828, 16403500445172050158, 4533755278593082652, 10807446599885826609, 6981555831806437627, 13412972662619459764, 13711912288503888270, 7425430573821419685, 16752277069679715408, 13210061556570014836, 8, 80, 16253482711025978099, 16690839578921925157, 11755424915479552417, 17934377671577204140, 15509754874715907467, 6426721221030580337, 11049594146888643723, 14912334368661229147, 17657273147290084056, 9105126057127804171, 13430225876739607206, 3614830725909060912, 14569284676797348998, 4705513459362295944, 424917224365117418, 2835737623710330612, 1964100172858915134, 14896843043547784767, 15482419984058848245, 18437547705335910066, 3162257106529980441, 5297995970636059087, 9661978795293871188, 10128143329575104151, 770728251595531533, 9782965673735423214, 1347942901513492691, 12086966446141742548, 10239457018222882008, 3358534066525179769, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [17271741639510569126, 8154194758959345943, 13264028927506398677, 5896249534368220847, 11382862066285680273, 5436084715181539253, 3806787319072410229, 6511238228694043548, 9049442861863566881, 3576764171564075210, 450124369605914003, 3732227441816681926, 14029816209330408163, 8200782329890006994, 10416842793286403595, 6907512650407721813, 5351083897603196824, 9182929970775715030, 16141859999570517823, 9888871621811661249, 4078956937078417294, 5937931242192299623, 3211370055999743360, 12301747922262729865, 11292399879083020280, 5346237718208015471, 8535816953133153286, 9097410120098142273, 2554244438665697829, 6695383891040002341, 9265251570417433175, 11914585017133270728, 40, 3213136594386184, 1835177830541154044, 826263100281998566, 9612296353153372169, 2509054224639990472, 11363599377854067153, 5593295816013818122, 4611398810491526224, 17064807786960234347, 18427889571151062396, 10159688738464070440, 14427917509182297997, 6874689601963577621, 745298233749984501, 4960831845018172313, 1451394763904737446, 17942681985602265676, 17508193444101172646, 1672370857206926433, 10152063658776528390, 14576660961872281746, 13602838247655372264, 5274902253855511588, 3163862752932557920, 7292072545764012550, 6033538369482377655, 10941848106600998110, 3570589185097006252, 4587292818271677447, 16771298688176486904, 17271741639510569126, 0, 528, 4511615971967153504, 11189511375577512439, 14523290705070057408, 11602649596278030541, 15937333004537029302, 7414360896531864023, 7973996941547777109, 691576170553327010, 16392526795103433215, 3672880019205947738, 3018308815206440911, 15753827566219281917, 12969815742735761919, 16814873348334179176, 9850453545266944859, 10757916804785969985, 15838808218411872755, 4464803664915013475, 1326425913004665964, 12560438841096766551, 448453576971543277, 8998725782446855275, 14421875759181138198, 3100710952877190431, 3320646806195653797, 11565789183953445370, 502156843765695809, 13147348360138928114, 11903841834984596874, 16003296542960478536, 0, 64, 5751576643258238090, 7830268710878889486, 4868320831660690795, 7042762868047858013, 1028615964620729689, 12270587957620579653, 7267371538363991280, 16125626865182516658, 16950134439933558852, 13427183447069512151, 16117382505273595827, 2222792985740553749, 6517696895688418945, 15516128650333221731, 6357034143715229949, 12960707821770488929, 12451444460344609421, 8786747128188560390, 7634329044629047826, 7741107824034642016, 10975559322169081956, 6007758954686348362, 13971256108093330407, 16868860295450858142, 434120282701603474, 11571634562637977474, 5581285869985960561, 6581368197537384623, 17661012293298952642, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10627125303494028926, 14952889910786498171, 4766776471757604196, 12230245468863423579, 18104224094677170296, 15873409126341319274, 10073785188538358192, 9346697284679931865, 9007898958502691821, 18310381669862731969, 6720634958674998611, 4972858056675247397, 3284008361973965746, 14482858214234206831, 15154449156086880838, 5792220624700559072, 12843525862417693577, 642245012387336876, 14582627702688057517, 2964899186980974939, 8169860993617536308, 10855885493426519851, 1871971423867885122, 7909458165142256993, 3879457158905131550, 11439385698067115077, 12781603895645888322, 12658641528827989062, 9129723360543316479, 2424787611628537668, 16343713044075599831, 14619522228640933410, 40, 803284148597046, 10010111294767420802, 16943179644353820008, 8996122336997085030, 17350347680949584060, 13520911097528541892, 14769691589967587136, 81685142906752346, 7559897225353479520, 128512095027132822, 9792116363139842106, 4634576985104787587, 8679380235287294885, 1134592111928495305, 4684288247441474792, 15613043314698948257, 4841731940180862534, 5786518576333159075, 12666070374819933283, 2487841274273895537, 5690982477694717281, 5924572671969496500, 8629130978595053833, 18206699227813987098, 14234831161984809711, 16798226782780142546, 9330568307929665420, 9731250716956559616, 12286920896461242142, 1919835269886444210, 10627125303494028926, 0, 264, 9085863547783897978, 4029278259426396811, 16053154709446024998, 15730095788089532534, 1184856151594203190, 7658158244024203478, 7908104163460391198, 11768448888839053133, 15952542848401697239, 2236539493336923746, 12654027314481387133, 183479441840898968, 12829755263022627333, 14927722658095997307, 8579481663516436508, 2326984138263422166, 12584151503586926798, 5547037854005909933, 18320766430359725566, 16436941964924985549, 2398490839703252269, 15603212774947060210, 2697950444757558845, 7336230381913860230, 2577750295211676178, 16469775866150825791, 360850050916534143, 7183698983616787617, 9070535322622906244, 6732564319544917702, 0, 16, 7110029021941723513, 10115409991715085575, 11428668827299215140, 4015039023438705588, 3732466887400149035, 5870841944205588609, 8421627027326523148, 8231214549142439222, 10318470559229280016, 15171283498151438808, 12477430934852872037, 3853779543897991795, 14662750186533371679, 7423988381383082226, 13549468426633458145, 11079168775731474830, 12471207782095033761, 17595325414333663547, 7042468264080735391, 17650115337646869205, 14946074228061446423, 4655654314239637986, 11187552516160183253, 18115881480442018545, 899748567092010447, 14020868337400209874, 15417366235984526759, 3331301994171189600, 15814677761660135474, 4243893038989355703, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12334791106787903660, 10536106724359599792, 14660905060901389201, 17357985657180629743, 10490790376815116141, 8856174280738574418, 17564486157138470037, 2383050989032417578, 9423711593310475409, 4142017075081989212, 6217567350304044823, 15435624740876731287, 3215908606625999288, 11222238183310766613, 17187582840477322187, 11654551786904653634, 6201498867875513095, 9940061963065628902, 1432819846316931691, 5068010018173215582, 13903556343063122489, 8872060411343823556, 17720392065240548352, 17643816943101201258, 1449530809054027683, 17965277233811019017, 4895491920411997249, 10751559368097521724, 16513197729164811328, 4815287357290896051, 3003012580421078075, 6636010883309744683, 0, 803284148596806, 2549897079792572603, 5670682422759337153, 4249626004536644548, 9138873913574622404, 1343119293110958009, 15707367360995172765, 2149720931386886989, 12579497520806083785, 14990373923527496282, 7330871518527332444, 5790961380321049961, 5495469617420264118, 10789212522972025785, 4356961356341052500, 8032044444015716361, 5554647570062987979, 1022644107902166331, 6764324513849573852, 14002884382934858252, 14316154512513580139, 8331374540726760892, 13067519389098510351, 8671032013540344722, 13457978878695920483, 16399505509770566014, 10578307416004071064, 11950037765875050974, 12195903600484928258, 17694444981837938563, 12334791106787903660, 0, 88, 13728083094831419091, 5555139373262852832, 2905384006316447019, 12155959663009124293, 13187847930197094867, 15053688477158705110, 5239197399579256268, 18372875045424962848, 6782570937531856778, 5670979983981263850, 10968120781620208764, 2099848306821515114, 7984319522957739004, 14143871504578433969, 14093328990578646811, 5769086287272836702, 13010501651213663576, 16984828703781093727, 13803823311240773956, 17471084929704555662, 5508754216278517899, 14994098977964244257, 8220163139135834751, 17625713553185819225, 15041604777168753281, 17976701769209321205, 10958079103202840999, 17793074612839242130, 3601655880141993647, 16687523027086140644, 0, 16, 3208043314804619251, 6920597847411412414, 17985619796195836408, 11907191178709112742, 16377455862733420451, 15572876043608056600, 9466912758182965715, 17480763791598773801, 15029113851915312964, 1953587265841775225, 7175742902791404624, 6820764940134875350, 16069841829669607101, 15548451706938320654, 11760680638795846495, 1560700914733041660, 762367990279432470, 2603436428456411224, 6200990949184863170, 11673627333152839295, 7804486006334068097, 1006207264024395366, 11193609705356653459, 5704515878100803393, 14918729158665343812, 10658508130485449873, 380737719356524599, 12870561906904032245, 6984680585936259437, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13210061556570014836, 1599157050859759633, 12446750015896088802, 10353774239160274935, 11424271721157330669, 15057005486179715954, 8861044108273791962, 12243038632327996294, 6387235594535598756, 10620968503766467282, 10090957857949391364, 610949617653761740, 2641692952954235941, 16682338453560518377, 1667764180674112574, 3944406972826047531, 7937338373741897463, 677543792580138430, 16064632909904135712, 18144484844415291494, 7226453148331774623, 1179808805540104806, 2700524299164928450, 739842910379542056, 18551850792840682, 16856435263285305760, 6893839572721182305, 14666214556500183752, 10619536471246139015, 4063396021928247911, 1116280449848444285, 11377866377890790275, 0, 2008210371491335, 16850544756775285522, 652387120995254672, 4188956971131276775, 18389965100329173053, 852421464532798418, 17258729097516267384, 11347427093515448316, 13908538323250058716, 6558337355650114042, 4089976927111145333, 17816809041231283545, 12843997071522346840, 1655996231185402724, 11256141768734986569, 3019459069615110433, 16778373777892540383, 10175251160015024193, 11396702708789693017, 16481019216530994753, 5122353003150766192, 17913616556333538828, 6485826671956173957, 15738756542654855641, 12199621872357116369, 12077164016468113545, 8907315944885273345, 4878983963291132913, 1618531819557712390, 565132887411573955, 7288090792972058500, 0, 616, 4968648927826019469, 17195207199910519646, 6734621562241387182, 9715952180361858627, 2034771934048449998, 13730246563790151743, 15224252119305799711, 16575323315490024998, 9453153207794904511, 8194394828646838882, 1235308382947710635, 134218781076142871, 12444330148186854115, 16838588367568106248, 3274404606032631663, 8680261223649739505, 13512134067010568333, 15074317169196019601, 3919235389861209780, 14979187502739607198, 1116932806094012842, 12657319342943489784, 998626228777839492, 2347840117369842691, 15743276195226846510, 9881270424621082635, 2778123425092199841, 2613774562373586415, 1448060333031158668, 6190635258012880107, 0, 40, 18130890293586930078, 18252951749527557342, 4460903658820341507, 859505755654562117, 5961685480015386121, 12134776249586726543, 11174658189737631113, 18385152961050631924, 9881471501704199804, 9636744945302995714, 12323181865658998064, 14903454669611502952, 1490539036394497080, 11688514875590095153, 16093513520259190726, 7731471377060742735, 5247500963110975116, 5269361527156951110, 13733877647296302634, 11865469401112846356, 7643242142337524006, 15572658687280648106, 9345628789826937825, 3291248301730279223, 16808111015808513609, 16274730253017522022, 12243901590027926887, 6559275936659510680, 17224785255700525855, 1390310476158884261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16003296542960478536, 13466221688393768258, 12927954860087459534, 3759003303159369746, 1148549753827007441, 7129001791528740265, 5281592040827142238, 16203079979032760691, 7039074043166063940, 9054598259215599503, 2018397558465392243, 16413792935045431209, 12604373665766922919, 1493466405559625913, 11868526707386259660, 3043746450373199613, 8246328563832581273, 5887036391937389613, 2796053561793572028, 7645118395649289364, 12303475117195379639, 207358776078213315, 9218579057118601952, 14479451218433079532, 2031744097966400086, 2566041186493151514, 17259376159632543425, 10376116775360567681, 11289943669462175698, 10804772324353478999, 17288383771256214060, 9885671831159451104, 0, 1606568297193092, 1076973899277284702, 14086579741019377519, 3818478693739735842, 5593621083784091164, 11728670858811596587, 12625736484548160126, 968047239546776409, 15493380284459454506, 15542100289574010625, 15053368214221814937, 17388070103506970075, 4738318434573394804, 15389814481683087606, 14763812299525073807, 384493414835098150, 7660052382355122994, 7691788916209089905, 14721544157906502013, 737940994724202658, 3221762534387838371, 7517398897305596666, 13211005290810103003, 12141388589516060378, 13672030567886044471, 12296311093518063031, 6143526203440544581, 5554567664494429423, 12302163852964786956, 14310991091785572129, 7008881577152522467, 0, 528, 12828040835569540857, 15946070950510533025, 6868712626693654693, 16719465941571322506, 15929304398043808838, 7333330621525318559, 8574904634803746916, 11585949634519199591, 14215120915846294561, 15431555872184246136, 556415272972402332, 13729762303106745810, 1895854814022398925, 16120810718921859928, 14563556215553868244, 9584551737159741567, 1050656582218051719, 2849157683178260515, 4987801895818641338, 3252006976820452311, 4232022539410523688, 12145542090324719848, 13475056960068950678, 4212050629407893798, 18068871666013902057, 4214295938146797537, 13664544216029702565, 1391392205806749871, 3418909895274525076, 4840757955412667387, 0, 32, 10452764368937945515, 6969997263492352670, 15570786589164252178, 16136993048454358354, 16378352067056606124, 11747573379431147483, 12296464969648251345, 8155132212936940581, 2470200969414032680, 18126939303114916528, 16736276280592238734, 15549342782445497049, 9033882039108268313, 5121596298161079296, 14336897502470956191, 6301009824137139871, 16614860627935231068, 10383378433371415142, 10330363517752279308, 10937466001850040595, 16305844076412050396, 7189713532379018536, 7568236447715590536, 10805187342082326609, 7424874700566577356, 13861219118264849665, 7052270251739242825, 17586339544079318164, 14071176523136369481, 12282546735285148319, 3, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6732564319544917702, 11424946734513850952, 14751589151467562513, 3091073535594807983, 17274728363719186424, 6785780051417756764, 15374515033027594653, 12476673273305390844, 11491856728648046938, 889587581187765015, 1832729573374625479, 11964718430105317483, 10284914521902415429, 4989117988224154817, 7310308994414837120, 4896165117485439507, 781193619199190152, 4972018469228063343, 11237024791849123316, 8136517227202567877, 12980119595156137175, 5277784125198234251, 8730957263237386090, 6627357084936364627, 9579937749716133270, 13182791294901350976, 7788172704304532836, 1814160375547940386, 7818804555865981505, 11573391963135759227, 18390005084876364234, 49905639292627904, 0, 401642074298523, 16072847024087248681, 1047399340937520223, 13840617071834531990, 13835424809772757395, 12438858367585478828, 14080077230806112448, 11208516754282785707, 7691155727086178136, 17898846423848868766, 13990233438164144322, 14765296463244153634, 10144768301469359068, 16658833476738371029, 4674204014270448977, 12722211832796318871, 492549161703070590, 13986658207276323375, 14512155514173182920, 13983563295828088546, 2440687363152463730, 15931932209781173412, 11078906302351818677, 3584926465549602493, 6813538466449503008, 2334817027508375898, 12619526317209583817, 6515674137823977144, 393947096345211186, 1951192747307666741, 7526556702499462773, 0, 264, 14858685484860085108, 16638144790071955925, 14803289513390493682, 7947368985060100292, 8540021318758160201, 1005829865088874654, 2182109332887118586, 2709878912677862734, 8639678844062658411, 1087022739668739893, 10504771173378443613, 10062807734250201377, 7979854057356878352, 5264886220300798691, 17178601938487182393, 14209807647112141969, 364963036030481104, 6977342036970944167, 9475211165936098151, 2067156367555811068, 13444810812224497486, 17338503932931685384, 18075892757378330321, 5992364927925930356, 280994234174845985, 4192504288997153355, 10293012497513243194, 12632074680840502609, 12384471116364520725, 14304772746964984975, 0, 8, 9114363797835460134, 5446076396314160376, 12863008906537145423, 10008421878335836436, 9952321233871043669, 12872379155893703237, 7266552182027361169, 1266036355585216796, 2621902104176569009, 8791105532651972211, 6351975813451610601, 11821139808280113179, 11281913023757770338, 3277134497757048289, 13219080767636598429, 10181825490691565485, 2766637533497216499, 5527857141123489970, 8463471033597650592, 16863468430858262436, 4521466714741486225, 2112404415880305855, 6776665887355979100, 4283028800297139078, 17448147405455891940, 2672696094870261596, 654959311657763753, 15404879372302137522, 458610335793450516, 11708893791522292939, 3358534066525179769, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16687523027086140644, 9086882804838007993, 18208410790236506017, 3398985649909830369, 11870335859895317550, 1782594595734670280, 7950908231675299553, 11699755763721080867, 5559192297727634984, 15856483324254330201, 3827177513892222045, 8697421447132597636, 6525137006607571383, 9739016092723027913, 37096681180297292, 5998909423699657245, 1737478325904747641, 9603988472267868801, 14612309354257526062, 963817021754931361, 2954837086209820968, 11485058781500311480, 10011022503247302490, 6596157637386353039, 2185026052398200396, 8667196121129603577, 17444739644589522901, 17384087895468261804, 4673396992430997118, 5652365973964779246, 14148401294484512817, 594790136239256278, 0, 401642074298403, 6959791354043610236, 1843180796447728437, 9556362158826632350, 3220022195391792741, 6012411438022691140, 4309223969498591447, 7596903557041777533, 18393682838284953355, 3973832102121938954, 12190997158276486897, 15972235844585587264, 14899488070931524727, 17337514399056563302, 10500237188498665928, 18440452962210035879, 7481614450647261413, 65300580117832193, 14713590013611289205, 13086268929321267306, 17247769089209001713, 11421561962034654967, 4561010052951998759, 9562817622798343284, 3062054327467638127, 6016566887476098647, 5513989129644936969, 13097123292793361360, 17631302057213141907, 8382824402074565601, 16136160484984138575, 0, 88, 11332670461359993442, 14431967032738938661, 10393518078208184991, 2462224494429193628, 2381519205788696693, 5156397633515475273, 13071332837477200404, 6583788956280193302, 8309261923972302555, 7204946769828595498, 10143223184962015615, 2291749916011172217, 12651590612371699683, 1757329184049619756, 8575055855333374088, 10782010546727900871, 11693001677843026089, 13372591108841832182, 6745878472543166577, 17326074735792689056, 17178266551378060244, 9012900451066906030, 9513119903156534723, 14316793092410720577, 15850020848376370982, 5093266838540794296, 2953143545478827927, 9172592184988170325, 3259030218090439002, 13670896049781213124, 0, 8, 6104172690014223231, 3119855977255645286, 2700229040680838768, 4228220371303630837, 12976691418076017877, 15391527008624099592, 15522155400452634037, 17655908650961725957, 5157987610310047621, 13664486701019622043, 12908699189677656287, 14840926611057477527, 6092037682822283700, 15181448373122947619, 2083722204849270202, 1893419523737526751, 11329911669537538562, 12331432886354737271, 9636585409664050258, 5131588463040403759, 10248116973079783912, 2136665268102207704, 17448444978654544666, 11945433761064128885, 4462464721020457233, 17579935132869425842, 7098417589530391109, 15343623253038912080, 7762335122892638892, 10310226363807226654, 9365253138981608257, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 6538312968872592849, 8060897427763484267, 15694315280551902473, 15462035367190511759, 16783127636073026773, 10756964923802715923, 4768450986425500783, 586150029444692874, 14745636460228146879, 5204776334183399126, 7685703760533694936, 16111592919872596132, 6944599323919802145, 1254987403839644538, 9402574875622777470, 16210856058698621820, 6207690803740787708, 5909774410804808527, 11610503998702777421, 686805010274260483, 8419527378140004636, 6342702858222909287, 8706567413279745902, 8451985615096117101, 8796637399824800240, 15979424445015031332, 13704751155696621736, 18261872069356847559, 7568935938034555881, 3939988349760901151, 3558778201956820739, 0, 2008210371491335, 13098960849839742034, 9449621519891201049, 2814310786559014444, 5305842545683321494, 4969236906288915907, 1243780951433164967, 6167749875842285147, 9490220981060631819, 3665259354621890034, 7437125179920904126, 12655958476488865400, 17935537000594940941, 91614862745339577, 1869550524566103495, 17384150297165671545, 1154605885284628266, 8665046436862728398, 6741156569294553317, 9490927005547387767, 8947900188307771735, 13752550215202657538, 7714188412126691626, 12225947487197390724, 13509943592829854189, 7120740401378484294, 6789669275155346195, 2929601484581949152, 1077164174037184778, 7253613682453412944, 12957959164911169922, 0, 1232, 6031863247325663438, 674016650738724202, 9655491867310024790, 4753798685424869288, 10749041705000945043, 14520855376130294244, 1540176383869885892, 10236894625417199268, 9196614711423540610, 7978597004657283049, 6086008265617713639, 14043785705271347590, 10693788391520380705, 12309293813476849789, 12287432898048046644, 12476380710530844150, 2814554338965902349, 12370730861881949935, 13055692992345669402, 801564953257569940, 10614676804436196472, 7985393687855976209, 16788264280259941604, 4042445936043537075, 17844212763579117389, 14723420347046552696, 2456530167870834703, 7343890316269580191, 6483315548845037473, 9440211366785524370, 0, 40, 1560947813056021755, 6935064976442414148, 9999441144135002932, 10354700837586583171, 6040781227937012106, 4698117391978117444, 4735711626023545756, 11217844833019453026, 3130590714605394722, 2809204122464618686, 10935232469327759448, 18335893537613898174, 10868401885487323501, 15799177281014635734, 17187052562019754838, 4027411046406207040, 11879721967266924677, 3613659344771632047, 1846469577394958972, 14668357323201408029, 14939045883642543835, 2885718226990976376, 4969257074069595075, 10824274197210729467, 13212275138420405274, 10563919532671437398, 12234598862193668129, 14653607410806008848, 2498958194485300229, 3512215170452429648, 4243893038989355703, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 7206805482451038763, 10391043349415287037, 17044036436784806527, 13171139175044072684, 2094744771380247596, 13239410091625892436, 168039991714389118, 9272483157421678641, 9491323991579079848, 16844742792488708348, 9520544349855559315, 792788122696624862, 16163267682416611248, 7281147841738764349, 9382208451579624348, 15681622260194273891, 1390751769269680465, 8196141638178857464, 15172831853577650839, 12922697597526240324, 7829823799088278618, 1783927422614660621, 4975249353684987436, 13048186608776014077, 3034445649013398243, 6966167031354634355, 7794510095811729812, 8010670397007670803, 871847630272290682, 18441078654886601219, 1106728433230065324, 0, 1606568297193092, 17457628753812655267, 5096693283465186518, 12947605480618213072, 13490514080936595140, 16186587491946121120, 10245245868334896235, 6026705707665599719, 9827345407768028181, 2812471843237874845, 12940670116574659651, 2714930976118111710, 11931084046533097040, 5957825878304116293, 4815270995456833861, 3281433232253188744, 1527514044633931889, 3155608937877823823, 496495357063373704, 12643114535206930756, 2926290280590787897, 4481685646324082958, 2913086696180341350, 4929647997916999987, 9053067786296036128, 12860916533743270733, 13426707234447106813, 15934882759672330788, 2173747106952139997, 5260381980138555939, 9238536158694879401, 88, 1056, 10194964851803169917, 2476887483552371976, 9610004573075108621, 4964236593939309395, 10117579878001530331, 8588168632019162203, 7961669463441676499, 8688363314921128388, 7669238601546834041, 15117861700401653408, 7267798175629900560, 18420331634788000621, 2168204218347522931, 13774182815867438503, 11793649490935032382, 264326996749206681, 422815844549413164, 11144132125283193307, 16600930886850462534, 14741236577529096830, 7550071867985447349, 10163945784944658272, 8810849992229527370, 979169410947035438, 18181508983255172512, 10501853123801116024, 10292737970295456228, 632012914013142222, 9098012027422757538, 7698805642109006453, 0, 32, 9302012295643728416, 424328237663665361, 17748121622218558811, 6681769685034042719, 10907932526941371789, 14996603190997478665, 13982878080104642188, 3336783822228111865, 7403528606603453519, 7309352233404946366, 11509327586943808925, 6803943428138467537, 12870260590513220077, 3798257798625653324, 15652192157997003684, 8260391000410661595, 9099897743400681933, 16067207775248165408, 7640841583197908852, 16739199083410292994, 1998275509994500625, 10688417071827877337, 16160081185811655577, 2725954513011781037, 3040692668058239811, 15097072321276989567, 7813293313258815644, 15261763399945716285, 2258772319189190202, 6756061023037720295, 2372900269115514267, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2643697525295255282, 7848268271641614303, 1670964981039714496, 12506995107569119516, 16020980424362300069, 3910461774754452973, 14887150284650111993, 11430895388638705560, 15925982986489674986, 559122298435457095, 16369319727902045750, 5911900249842037740, 9993545485068101534, 16804807948024450931, 6109216944498588777, 6962786378900996817, 14779846517676698965, 14597810963258762343, 16333362039819991192, 2239891938742671995, 8902636803530046125, 12348911713752556021, 9576130314342554279, 9464686824958661262, 14724291818312841818, 5956660324772534609, 5179789141411429720, 14891365206755013222, 833106187556617464, 14690990432528119604, 7399742180187746173, 0, 401642074298523, 10076989882539553734, 13617634258944637452, 11664888937794835322, 6832371865971954132, 7435465380685145582, 8856983143236954540, 15647394574465449881, 5004639611979401749, 16333513927375132208, 11586223746088007538, 17258599442845821467, 10089347514894229223, 8927362828162004403, 1274761678102044944, 13987176689734561031, 968318691601385838, 17920302096119022338, 18172419653743826470, 5238866342343116613, 4715585282245523496, 6782917713521523376, 845034972551066538, 8264516316211712068, 4395820162956710988, 17367170950581948054, 11715439359473390301, 4924405821869545305, 1674381281184830519, 4077397353846458666, 16570851802495678006, 0, 528, 3020492374890726247, 15867024276402164724, 2691485309401819348, 10383311521670833729, 16323720466012865692, 12111425008963394821, 6863497050423701439, 4068736078963485223, 6871052579055075230, 11135759119963236724, 8026699645344521142, 4857505768584918289, 10792639723427933554, 15144263097518946995, 2672819086738268108, 9175748808845810742, 8523928999979138359, 5837654600063955860, 4020408003683484830, 6777545915715419993, 16222025381660955186, 14681340973312169871, 11211579677305883898, 8623233971250462580, 418056849863168392, 2919384330136358405, 2666974936005298869, 14966813495153624489, 13584072213050301608, 17057575786157171701, 0, 8, 7519454690376123692, 7627104070861575574, 17604686071836489236, 14277148259130460564, 8312218486680706135, 8395439642754559152, 17307771294890409643, 9298206908486537717, 3027629924013931359, 2933551330348935458, 1450485994192951386, 8585052201707081835, 10624425952582111111, 16773523322999621677, 13337622149287916761, 17874287708894504070, 14164897610403484003, 11216401648549709020, 911970190394256131, 3202853507803349037, 14616902435260689479, 14924823153427050614, 4881022900440414264, 9723366934152472594, 16335725686098559697, 8087897843744270993, 11437013713086863200, 7627258546495067733, 18044191572661655945, 16490279521751489469, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 392081819927674604, 13621084556403650323, 17078772340992927473, 862170971660204027, 5676881743340217488, 5517012370953012053, 3863387227510711423, 6521284656283570782, 17282496836457066698, 8668839984066399279, 10481218501610762636, 13268880552322298648, 9575112247205521418, 14191613402325013881, 17855143966403217682, 8464300128340058390, 4400313738036540825, 14739186344673284697, 1501891124109012983, 9798699259742823392, 8843421723884165135, 7746605484191389759, 8323169935435436763, 15323881858459172368, 8509325593168557185, 14233099751914870044, 12164983556041574509, 17356025534910089368, 2031310896521954322, 16067965450256037769, 8147499972447601337, 0, 401642074298403, 9851586117636382793, 7414079509745519565, 10414894202973226643, 11403399710197601656, 10230759118395809329, 4887466173119518776, 12376579030877442488, 15222686873173021915, 11343634646223977946, 15054143113295762432, 8578483304162845495, 8187399805941604842, 17460975957431844228, 12368453570037757143, 4715095521846408852, 10685847052710927197, 5160934306801665605, 12877482432527277885, 1026289052488784895, 12183816968946827507, 954239020314042893, 1899038343674936222, 3582199871763692750, 10141562795735590523, 5883730844910027408, 10313342961711791200, 10308552102917724507, 1101239144209002141, 16732112788727027442, 6132059608254040410, 0, 176, 14015299246960655077, 18240053740881435667, 9264051620447261114, 3770835013589498382, 14269426645353023865, 1064418857115644823, 9055361938666247589, 1923541152082479674, 7329032621716426413, 14147095007921770778, 12290092320014837503, 14167154425694482177, 2008826339817234435, 12727493810822145141, 13765995246049388004, 5723824967382588797, 11506863252089006870, 13547802874613831044, 2099106023167119258, 6345494554579617353, 13921991112058773762, 5885105447661412229, 8709961227558437878, 9751610933111772233, 13912537796384226859, 5691895930177454540, 2936046437280927758, 7163672760378086559, 12965649133168865250, 17131584050600476194, 0, 8, 17781582622500481192, 12847902632736061277, 12021499907877242591, 16751519355106661703, 9062087890172095618, 3834953580385337540, 2969703856153678454, 11604562295556139307, 10447912046373566534, 12987934619706800857, 12352596220492768030, 14816150974992525275, 2172600571554701126, 18086375044546604023, 16313093185369681775, 14997664071320688070, 347950016295486690, 9206182676441692601, 3566552483989599402, 4925983231752336365, 1728701557101400581, 7087476601458867917, 9759961360999781392, 12569092891286895547, 14206292953735333262, 16422952955631166803, 6294107725304445883, 9537940691512987143, 15535806100011306333, 7080716573279759555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4099276459869907627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(18) }, program_info: ProgramInfo { program_hash: Word([9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 19, range_trace_len: 47, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 2, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 0, 0, 0, 0, 0, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 3137828705454, 1, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 1, 1, 1, 0, 1, 0, 24514286761, 1, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 40, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 2, 1, 4, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 191517865, 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 1496233, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 11689, 1, 0, 0, 0, 0, 0, 0, 1, 2, 4, 0, 0, 0, 0, 0, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 91, 1, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 7, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 11, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 13, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 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, 16, 0, 0, 15, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 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, 16, 0, 0, 16, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 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, 16, 0, 0, 17, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 11377866377890790275, 9885671831159451104, 49905639292627904, 594790136239256278, 3558778201956820739, 1106728433230065324, 7399742180187746173, 8147499972447601337, 0, 0, 1, 0, 0, 1, 1, 0, 0, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 7288090792972058500, 7008881577152522467, 7526556702499462773, 16136160484984138575, 12957959164911169922, 9238536158694879401, 16570851802495678006, 6132059608254040410, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 6190635258012880107, 4840757955412667387, 14304772746964984975, 13670896049781213124, 9440211366785524370, 7698805642109006453, 17057575786157171701, 17131584050600476194, 0, 0, 1, 0, 0, 1, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 88, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13342492399873323769, 4511615971967153504, 9085863547783897978, 13728083094831419091, 4968648927826019469, 12828040835569540857, 14858685484860085108, 11332670461359993442, 6031863247325663438, 10194964851803169917, 3020492374890726247, 14015299246960655077, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1439796670523758837, 11189511375577512439, 4029278259426396811, 5555139373262852832, 17195207199910519646, 15946070950510533025, 16638144790071955925, 14431967032738938661, 674016650738724202, 2476887483552371976, 15867024276402164724, 18240053740881435667, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2591609871503882494, 14523290705070057408, 16053154709446024998, 2905384006316447019, 6734621562241387182, 6868712626693654693, 14803289513390493682, 10393518078208184991, 9655491867310024790, 9610004573075108621, 2691485309401819348, 9264051620447261114, 1, 0, 0, 0, 1, 0, 16310674867943291767, 6055575173485499620, 12415403453461233454, 5919456033500076693, 11602649596278030541, 15730095788089532534, 12155959663009124293, 9715952180361858627, 16719465941571322506, 7947368985060100292, 2462224494429193628, 4753798685424869288, 4964236593939309395, 10383311521670833729, 3770835013589498382, 1, 0, 0, 0, 1, 0, 18087077157995694324, 16330777485816030986, 10063042555031126160, 5687909194194711965, 7973996941547777109, 7908104163460391198, 5239197399579256268, 15224252119305799711, 8574904634803746916, 2182109332887118586, 13071332837477200404, 1540176383869885892, 7961669463441676499, 6863497050423701439, 9055361938666247589, 1, 0, 0, 0, 1, 0, 16967670111924614213, 17486841943826861107, 18307481886056309438, 7941686916236651549, 3672880019205947738, 2236539493336923746, 5670979983981263850, 8194394828646838882, 15431555872184246136, 1087022739668739893, 7204946769828595498, 7978597004657283049, 15117861700401653408, 11135759119963236724, 14147095007921770778, 1, 0, 0, 0, 1, 0, 15248998622285712496, 1816831098907864072, 1977941839824239836, 10471520652203868473, 12969815742735761919, 12829755263022627333, 7984319522957739004, 12444330148186854115, 1895854814022398925, 7979854057356878352, 12651590612371699683, 10693788391520380705, 2168204218347522931, 10792639723427933554, 2008826339817234435, 1, 0, 0, 0, 1, 0, 1949341260302477275, 10525442150725175322, 10268663784703415650, 4586059525590481046, 10757916804785969985, 2326984138263422166, 5769086287272836702, 8680261223649739505, 9584551737159741567, 14209807647112141969, 10782010546727900871, 12476380710530844150, 264326996749206681, 9175748808845810742, 5723824967382588797, 1, 0, 0, 0, 1, 0, 13440535156983805468, 12080935995323460100, 9067005830434678477, 14314758709191331837, 1326425913004665964, 18320766430359725566, 13803823311240773956, 3919235389861209780, 4987801895818641338, 9475211165936098151, 6745878472543166577, 13055692992345669402, 16600930886850462534, 4020408003683484830, 2099106023167119258, 1, 0, 0, 0, 1, 0, 5892436324803940896, 7017064751240904271, 10317850206740106337, 16403500445172050158, 8998725782446855275, 15603212774947060210, 14994098977964244257, 12657319342943489784, 12145542090324719848, 17338503932931685384, 9012900451066906030, 7985393687855976209, 10163945784944658272, 14681340973312169871, 5885105447661412229, 1, 0, 0, 0, 1, 0, 13935905759807022949, 0, 0, 6981555831806437627, 3320646806195653797, 2577750295211676178, 15041604777168753281, 15743276195226846510, 18068871666013902057, 280994234174845985, 15850020848376370982, 17844212763579117389, 18181508983255172512, 418056849863168392, 13912537796384226859, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13711912288503888270, 502156843765695809, 360850050916534143, 10958079103202840999, 2778123425092199841, 13664544216029702565, 10293012497513243194, 2953143545478827927, 2456530167870834703, 10292737970295456228, 2666974936005298869, 2936046437280927758, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7425430573821419685, 13147348360138928114, 7183698983616787617, 17793074612839242130, 2613774562373586415, 1391392205806749871, 12632074680840502609, 9172592184988170325, 7343890316269580191, 632012914013142222, 14966813495153624489, 7163672760378086559, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16752277069679715408, 11903841834984596874, 9070535322622906244, 3601655880141993647, 1448060333031158668, 3418909895274525076, 12384471116364520725, 3259030218090439002, 6483315548845037473, 9098012027422757538, 13584072213050301608, 12965649133168865250, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 6190635258012880107, 4840757955412667387, 14304772746964984975, 13670896049781213124, 9440211366785524370, 7698805642109006453, 17057575786157171701, 17131584050600476194, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16253482711025978099, 5751576643258238090, 7110029021941723513, 3208043314804619251, 18130890293586930078, 10452764368937945515, 9114363797835460134, 6104172690014223231, 1560947813056021755, 9302012295643728416, 7519454690376123692, 17781582622500481192, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16690839578921925157, 7830268710878889486, 10115409991715085575, 6920597847411412414, 18252951749527557342, 6969997263492352670, 5446076396314160376, 3119855977255645286, 6935064976442414148, 424328237663665361, 7627104070861575574, 12847902632736061277, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11755424915479552417, 4868320831660690795, 11428668827299215140, 17985619796195836408, 4460903658820341507, 15570786589164252178, 12863008906537145423, 2700229040680838768, 9999441144135002932, 17748121622218558811, 17604686071836489236, 12021499907877242591, 1, 0, 0, 0, 1, 0, 4447686994046778179, 11785000236654418865, 10679155400143926564, 17934377671577204140, 7042762868047858013, 4015039023438705588, 11907191178709112742, 859505755654562117, 16136993048454358354, 10008421878335836436, 4228220371303630837, 10354700837586583171, 6681769685034042719, 14277148259130460564, 16751519355106661703, 1, 0, 0, 0, 1, 0, 217106376514171653, 11707313943908545641, 15092932467239161061, 11049594146888643723, 7267371538363991280, 8421627027326523148, 9466912758182965715, 11174658189737631113, 12296464969648251345, 7266552182027361169, 15522155400452634037, 4735711626023545756, 13982878080104642188, 17307771294890409643, 2969703856153678454, 1, 0, 0, 0, 1, 0, 11044550050665632476, 8958367422149199561, 16497379967830959424, 9105126057127804171, 13427183447069512151, 15171283498151438808, 1953587265841775225, 9636744945302995714, 18126939303114916528, 8791105532651972211, 13664486701019622043, 2809204122464618686, 7309352233404946366, 2933551330348935458, 12987934619706800857, 1, 0, 0, 0, 1, 0, 1877907417051268915, 6151364593092129113, 13049072304454003157, 14569284676797348998, 6517696895688418945, 14662750186533371679, 16069841829669607101, 1490539036394497080, 9033882039108268313, 11281913023757770338, 6092037682822283700, 10868401885487323501, 12870260590513220077, 10624425952582111111, 2172600571554701126, 1, 0, 0, 0, 1, 0, 10197860193367132813, 18317591232122268101, 11864893253666570624, 2835737623710330612, 12960707821770488929, 11079168775731474830, 1560700914733041660, 7731471377060742735, 6301009824137139871, 10181825490691565485, 1893419523737526751, 4027411046406207040, 8260391000410661595, 17874287708894504070, 14997664071320688070, 1, 0, 0, 0, 1, 0, 7903888723576875237, 18382523577454102436, 13167437966520740716, 15482419984058848245, 7634329044629047826, 7042468264080735391, 6200990949184863170, 13733877647296302634, 10330363517752279308, 8463471033597650592, 9636585409664050258, 1846469577394958972, 7640841583197908852, 911970190394256131, 3566552483989599402, 1, 0, 0, 0, 1, 0, 2186301169863059887, 6122215293275160143, 16696916221087249943, 5297995970636059087, 6007758954686348362, 4655654314239637986, 1006207264024395366, 15572658687280648106, 7189713532379018536, 2112404415880305855, 2136665268102207704, 2885718226990976376, 10688417071827877337, 14924823153427050614, 7087476601458867917, 1, 0, 0, 0, 1, 0, 4350099661540135647, 0, 0, 770728251595531533, 434120282701603474, 899748567092010447, 14918729158665343812, 16808111015808513609, 7424874700566577356, 17448147405455891940, 4462464721020457233, 13212275138420405274, 3040692668058239811, 16335725686098559697, 14206292953735333262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1347942901513492691, 5581285869985960561, 15417366235984526759, 380737719356524599, 12243901590027926887, 7052270251739242825, 654959311657763753, 7098417589530391109, 12234598862193668129, 7813293313258815644, 11437013713086863200, 6294107725304445883, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12086966446141742548, 6581368197537384623, 3331301994171189600, 12870561906904032245, 6559275936659510680, 17586339544079318164, 15404879372302137522, 15343623253038912080, 14653607410806008848, 15261763399945716285, 7627258546495067733, 9537940691512987143, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10239457018222882008, 17661012293298952642, 15814677761660135474, 6984680585936259437, 17224785255700525855, 14071176523136369481, 458610335793450516, 7762335122892638892, 2498958194485300229, 2258772319189190202, 18044191572661655945, 15535806100011306333, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 1, 0, 0, 0, 1, 0, 0, 0, 0, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14280802901810915241, 1835177830541154044, 10010111294767420802, 2549897079792572603, 16850544756775285522, 1076973899277284702, 16072847024087248681, 6959791354043610236, 13098960849839742034, 17457628753812655267, 10076989882539553734, 9851586117636382793, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7925919485060883878, 826263100281998566, 16943179644353820008, 5670682422759337153, 652387120995254672, 14086579741019377519, 1047399340937520223, 1843180796447728437, 9449621519891201049, 5096693283465186518, 13617634258944637452, 7414079509745519565, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9094034340168608638, 9612296353153372169, 8996122336997085030, 4249626004536644548, 4188956971131276775, 3818478693739735842, 13840617071834531990, 9556362158826632350, 2814310786559014444, 12947605480618213072, 11664888937794835322, 10414894202973226643, 1, 0, 0, 0, 1, 0, 206637164063268726, 10092260866618400225, 13038545162971821924, 6650811367268781560, 2509054224639990472, 17350347680949584060, 9138873913574622404, 18389965100329173053, 5593621083784091164, 13835424809772757395, 3220022195391792741, 5305842545683321494, 13490514080936595140, 6832371865971954132, 11403399710197601656, 1, 0, 0, 0, 1, 0, 13042021488072180943, 17665366762968375743, 14514089290800305099, 13091389828882674218, 4611398810491526224, 81685142906752346, 2149720931386886989, 11347427093515448316, 968047239546776409, 11208516754282785707, 7596903557041777533, 6167749875842285147, 6026705707665599719, 15647394574465449881, 12376579030877442488, 1, 0, 0, 0, 1, 0, 7479226098762365380, 20647088475708265, 14234714302482719672, 680445747454648704, 10159688738464070440, 9792116363139842106, 7330871518527332444, 4089976927111145333, 15053368214221814937, 13990233438164144322, 12190997158276486897, 7437125179920904126, 12940670116574659651, 11586223746088007538, 15054143113295762432, 1, 0, 0, 0, 1, 0, 13347963917530181895, 10889708507292659338, 4175833649164370394, 5233297770622824375, 745298233749984501, 1134592111928495305, 10789212522972025785, 1655996231185402724, 15389814481683087606, 16658833476738371029, 17337514399056563302, 91614862745339577, 5957825878304116293, 8927362828162004403, 17460975957431844228, 1, 0, 0, 0, 1, 0, 6929809241430544204, 6641711964892684437, 12124997350307806549, 9867160564810673994, 17942681985602265676, 4841731940180862534, 5554647570062987979, 16778373777892540383, 7660052382355122994, 492549161703070590, 7481614450647261413, 1154605885284628266, 1527514044633931889, 968318691601385838, 10685847052710927197, 1, 0, 0, 0, 1, 0, 17634176407370476921, 7739526124990237795, 13838384228721941065, 10263347723858682786, 10152063658776528390, 2487841274273895537, 14002884382934858252, 16481019216530994753, 737940994724202658, 13983563295828088546, 13086268929321267306, 9490927005547387767, 12643114535206930756, 5238866342343116613, 1026289052488784895, 1, 0, 0, 0, 1, 0, 6697396169967230934, 18287805115840952516, 14443334479498508931, 9643915442530902318, 5274902253855511588, 8629130978595053833, 13067519389098510351, 6485826671956173957, 13211005290810103003, 11078906302351818677, 4561010052951998759, 7714188412126691626, 2913086696180341350, 845034972551066538, 1899038343674936222, 1, 0, 0, 0, 1, 0, 15116382065750335012, 0, 0, 887493237489321299, 6033538369482377655, 16798226782780142546, 16399505509770566014, 12077164016468113545, 12296311093518063031, 2334817027508375898, 6016566887476098647, 7120740401378484294, 12860916533743270733, 17367170950581948054, 5883730844910027408, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13483864438078018308, 3570589185097006252, 9731250716956559616, 11950037765875050974, 4878983963291132913, 5554567664494429423, 6515674137823977144, 13097123292793361360, 2929601484581949152, 15934882759672330788, 4924405821869545305, 10308552102917724507, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8159241411748295729, 4587292818271677447, 12286920896461242142, 12195903600484928258, 1618531819557712390, 12302163852964786956, 393947096345211186, 17631302057213141907, 1077164174037184778, 2173747106952139997, 1674381281184830519, 1101239144209002141, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10385528691577928985, 16771298688176486904, 1919835269886444210, 17694444981837938563, 565132887411573955, 14310991091785572129, 1951192747307666741, 8382824402074565601, 7253613682453412944, 5260381980138555939, 4077397353846458666, 16732112788727027442, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 7288090792972058500, 7008881577152522467, 7526556702499462773, 16136160484984138575, 12957959164911169922, 9238536158694879401, 16570851802495678006, 6132059608254040410, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4383606322674378669, 13264028927506398677, 4766776471757604196, 14660905060901389201, 12446750015896088802, 12927954860087459534, 14751589151467562513, 18208410790236506017, 8060897427763484267, 10391043349415287037, 7848268271641614303, 13621084556403650323, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11282929110176162954, 5896249534368220847, 12230245468863423579, 17357985657180629743, 10353774239160274935, 3759003303159369746, 3091073535594807983, 3398985649909830369, 15694315280551902473, 17044036436784806527, 1670964981039714496, 17078772340992927473, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17215248529293365853, 11382862066285680273, 18104224094677170296, 10490790376815116141, 11424271721157330669, 1148549753827007441, 17274728363719186424, 11870335859895317550, 15462035367190511759, 13171139175044072684, 12506995107569119516, 862170971660204027, 1, 0, 0, 0, 1, 0, 18208784611061899534, 11090107870009134382, 15816468029966600756, 13193227772306657556, 5436084715181539253, 15873409126341319274, 8856174280738574418, 15057005486179715954, 7129001791528740265, 6785780051417756764, 1782594595734670280, 16783127636073026773, 2094744771380247596, 16020980424362300069, 5676881743340217488, 1, 0, 0, 0, 1, 0, 3995660239591967986, 13991065272063476564, 4842320139602494012, 5492874275384737590, 9049442861863566881, 9007898958502691821, 9423711593310475409, 6387235594535598756, 7039074043166063940, 11491856728648046938, 5559192297727634984, 586150029444692874, 9272483157421678641, 11430895388638705560, 6521284656283570782, 1, 0, 0, 0, 1, 0, 10265417819422388610, 3230613796530740211, 8204482557338271208, 5965860733558915216, 3732227441816681926, 4972858056675247397, 15435624740876731287, 610949617653761740, 16413792935045431209, 11964718430105317483, 8697421447132597636, 7685703760533694936, 9520544349855559315, 16369319727902045750, 10481218501610762636, 1, 0, 0, 0, 1, 0, 4200148723083586126, 8898019494692638676, 9361391436000884061, 6906630570311142812, 10416842793286403595, 15154449156086880838, 17187582840477322187, 1667764180674112574, 11868526707386259660, 7310308994414837120, 37096681180297292, 1254987403839644538, 7281147841738764349, 16804807948024450931, 14191613402325013881, 1, 0, 0, 0, 1, 0, 6921512846940257894, 8083147322870350598, 7402338099048749868, 11028121748345672612, 9182929970775715030, 642245012387336876, 9940061963065628902, 677543792580138430, 5887036391937389613, 4972018469228063343, 9603988472267868801, 6207690803740787708, 1390751769269680465, 14779846517676698965, 4400313738036540825, 1, 0, 0, 0, 1, 0, 15720913686265040726, 11620345195770806393, 392865519522630483, 10866688391213961683, 4078956937078417294, 8169860993617536308, 13903556343063122489, 7226453148331774623, 12303475117195379639, 12980119595156137175, 2954837086209820968, 686805010274260483, 12922697597526240324, 2239891938742671995, 9798699259742823392, 1, 0, 0, 0, 1, 0, 1576291082626878936, 6836143998208741199, 5718769156293156294, 501346961392724628, 12301747922262729865, 7909458165142256993, 17643816943101201258, 739842910379542056, 14479451218433079532, 6627357084936364627, 6596157637386353039, 8706567413279745902, 4975249353684987436, 9576130314342554279, 8323169935435436763, 1, 0, 0, 0, 1, 0, 13015036049004182291, 0, 0, 3820689183586493894, 8535816953133153286, 12781603895645888322, 4895491920411997249, 6893839572721182305, 17259376159632543425, 7788172704304532836, 17444739644589522901, 15979424445015031332, 6966167031354634355, 5956660324772534609, 14233099751914870044, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2862138511955678409, 2554244438665697829, 9129723360543316479, 16513197729164811328, 10619536471246139015, 11289943669462175698, 7818804555865981505, 4673396992430997118, 18261872069356847559, 8010670397007670803, 14891365206755013222, 17356025534910089368, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7758258992155315690, 6695383891040002341, 2424787611628537668, 4815287357290896051, 4063396021928247911, 10804772324353478999, 11573391963135759227, 5652365973964779246, 7568935938034555881, 871847630272290682, 833106187556617464, 2031310896521954322, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17115115516972321026, 9265251570417433175, 16343713044075599831, 3003012580421078075, 1116280449848444285, 17288383771256214060, 18390005084876364234, 14148401294484512817, 3939988349760901151, 18441078654886601219, 14690990432528119604, 16067965450256037769, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 11377866377890790275, 9885671831159451104, 49905639292627904, 594790136239256278, 3558778201956820739, 1106728433230065324, 7399742180187746173, 8147499972447601337, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 40, 0, 0, 3, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1, 0, 1, 1, 10, 0, 0, 0, 1, 0, 1, 1, 0, 40, 0, 0, 12, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 9, 0, 4099276459869907627, 1, 10, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 7, 8, 9, 10, 2197, 4384, 6571, 8758, 10945, 13132, 15319, 17506, 19693, 21880, 24067, 26254, 28441, 30628, 32815, 35002, 37189, 39376, 41563, 43750, 45937, 48124, 50311, 52498, 54685, 56872, 59059, 61246, 63433, 64162, 64891, 65134, 65377, 65458, 65485, 65512, 65521, 65530, 65533, 65534, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(18) }, program_info: ProgramInfo { program_hash: Word([9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 19, range_trace_len: 49, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 2, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_24.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_24.snap index 2d5bc4bfe7..943e299594 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_24.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_24.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3358534066525179769, 3358534066525179769, 3358534066525179769, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9365253138981608257, 9365253138981608257, 9365253138981608257, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4243893038989355703, 4243893038989355703, 4243893038989355703, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2372900269115514267, 2372900269115514267, 2372900269115514267, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 1, 65, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5482243896119908732, 401642074298203, 3137828705454, 24514286761, 191517865, 1496233, 11689, 91, 0, 0, 0, 5482243896119908732, 3358534066525179769, 8, 0, 3358534066525179769, 14319792288905293245, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220], [17271741639510569126, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17271741639510569126, 9365253138981608257, 0, 65, 9365253138981608257, 11465345153771181037, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864], [10627125303494028926, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10627125303494028926, 4243893038989355703, 0, 0, 4243893038989355703, 16104169334207009019, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481], [12334791106787903660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12334791106787903660, 2372900269115514267, 0, 0, 2372900269115514267, 2750797734633655770, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240], [14319792288905293245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11465345153771181037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16104169334207009019, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2750797734633655770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4, 3, 2, 2, 2, 2, 2, 2, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [3358534066525179769, 3358534066525179769, 3358534066525179769, 40, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [9365253138981608257, 9365253138981608257, 9365253138981608257, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4243893038989355703, 4243893038989355703, 4243893038989355703, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2372900269115514267, 2372900269115514267, 2372900269115514267, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 17, 16, 16, 16, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 2, 0, 0, 0, 0, 0, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 7, 8, 9, 12, 13, 2200, 4387, 6574, 8761, 10948, 13135, 15322, 17509, 19696, 21883, 24070, 26257, 28444, 30631, 32818, 35005, 37192, 39379, 41566, 43753, 45940, 48127, 50314, 52501, 54688, 56875, 59062, 61249, 63436, 64165, 64894, 65137, 65380, 65461, 65488, 65515, 65524, 65533, 65534, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5482243896119908732, 14700437138657715688, 4194228403373198226, 4321424756204952178, 17106991433953495229, 480007043786623808, 9077933169163287651, 10301794879477559358, 7837641036032671415, 9957661348832415284, 3403527796290311921, 8465759122953264103, 9491055353357939181, 14342984469850983837, 9771451080159159411, 8537706246195014625, 11423410855123831518, 17765926817646991510, 8321792161956545451, 13783267673851502179, 4529776878769021619, 8116795789739369570, 3611313486028920718, 14057252888063062893, 13188102157225090063, 40859616366247747, 9776318485951152693, 14134961488520769281, 14580812564900766592, 6012095218278392893, 12583880807825187559, 4192437018821097220, 401642074298203, 4016420742982670, 14280802901810915241, 7925919485060883878, 9094034340168608638, 6650811367268781560, 13344927435882217244, 15870694671012449597, 13091389828882674218, 168434371192049215, 13973668876111195937, 680445747454648704, 15441309962929722976, 15749770188837954531, 5233297770622824375, 3367253731665130938, 5066484463076591248, 9867160564810673994, 16707816004584596036, 6832899290197418961, 10263347723858682786, 6209209797490182000, 8678413656546712232, 9643915442530902318, 17208626611000903707, 11389822518212260982, 887493237489321299, 48736118273260452, 13483864438078018308, 8159241411748295729, 10385528691577928985, 5482243896119908732, 0, 644, 13398731741387911383, 1702596310854469483, 5960531672215414966, 14152498107176274636, 12742762049153184106, 747050504586908561, 5800650255543088287, 16122619596578164144, 6772875084421984040, 288495594474105189, 8600976689152153054, 3411751581427101134, 10304697226126818963, 3398791421797336513, 4476944395780698788, 7796778119718125747, 5617773719451830708, 18153429098783777295, 11043847812690714922, 1719133760987188643, 10906522308373106683, 16409243384953073963, 916060433516903836, 6973907531599316043, 9109780042108713794, 17099296735351468833, 15306362721670767113, 2730832614768234730, 479016032615721743, 14319792288905293245, 8, 80, 16253482711025978099, 16690839578921925157, 11755424915479552417, 17934377671577204140, 15509754874715907467, 6426721221030580337, 11049594146888643723, 14912334368661229147, 17657273147290084056, 9105126057127804171, 13430225876739607206, 3614830725909060912, 14569284676797348998, 4705513459362295944, 424917224365117418, 2835737623710330612, 1964100172858915134, 14896843043547784767, 15482419984058848245, 18437547705335910066, 3162257106529980441, 5297995970636059087, 9661978795293871188, 10128143329575104151, 770728251595531533, 9782965673735423214, 1347942901513492691, 12086966446141742548, 10239457018222882008, 3358534066525179769, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [17271741639510569126, 17693777214203449670, 17446294671039685780, 12180657588796280274, 3901851127268644692, 15132938321031306327, 4529077938382910243, 1349343284414021678, 12010127700996563076, 3802141577517901644, 10153500743657060380, 1665683881724788425, 2536206416673670232, 6321132288631485459, 1484367395490874035, 9791226137836052251, 10111774824823842282, 16052656468702535281, 10276660848524574906, 11241218962943578830, 169695422976636841, 7241344066748902545, 3569311910587147072, 8215766650263520356, 2619309237284639419, 1962296512232188159, 12890305973496102809, 11438817727011493827, 15861640058126249653, 14517213901488835116, 6582109139928846076, 9480578168622006864, 40, 3213136594386184, 1835177830541154044, 826263100281998566, 9612296353153372169, 2509054224639990472, 11363599377854067153, 5593295816013818122, 4611398810491526224, 17064807786960234347, 18427889571151062396, 10159688738464070440, 14427917509182297997, 6874689601963577621, 745298233749984501, 4960831845018172313, 1451394763904737446, 17942681985602265676, 17508193444101172646, 1672370857206926433, 10152063658776528390, 14576660961872281746, 13602838247655372264, 5274902253855511588, 3163862752932557920, 7292072545764012550, 6033538369482377655, 10941848106600998110, 3570589185097006252, 4587292818271677447, 16771298688176486904, 17271741639510569126, 0, 552, 10446875550887438149, 7588826506897155585, 16730914921892092280, 12511176149634059683, 1758801585754904665, 5885085633120358478, 12242421290212925246, 17368642390815603411, 11245463457685625563, 2659747577123257435, 11347669259219881571, 15449337489158534519, 17510270622758876933, 18027674089872559881, 16436012900980393273, 17430549031516796763, 17674101567742383712, 4643493040432393957, 15750016999752216538, 5970778449527916441, 7406085958721442119, 8823739942223974350, 12296950126673436366, 8362221384115403494, 2025584296720659827, 17113734046007416651, 3678646409353890898, 10191942812097658700, 1453528547827258310, 11465345153771181037, 0, 64, 5751576643258238090, 7830268710878889486, 4868320831660690795, 7042762868047858013, 1028615964620729689, 12270587957620579653, 7267371538363991280, 16125626865182516658, 16950134439933558852, 13427183447069512151, 16117382505273595827, 2222792985740553749, 6517696895688418945, 15516128650333221731, 6357034143715229949, 12960707821770488929, 12451444460344609421, 8786747128188560390, 7634329044629047826, 7741107824034642016, 10975559322169081956, 6007758954686348362, 13971256108093330407, 16868860295450858142, 434120282701603474, 11571634562637977474, 5581285869985960561, 6581368197537384623, 17661012293298952642, 9365253138981608257, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10627125303494028926, 7089946709940699513, 16018419181163655201, 16144413208110066321, 12517012706582615280, 17466716576309862393, 18120522547066464513, 3133443529903863473, 15879773433331271008, 15058242802738637389, 16107648145131258558, 17940570471380392799, 4146898483110117869, 13355141649182107533, 4502835184975000914, 11529786935650512206, 6872828020563546843, 4179930870000296671, 14088376982248436722, 3284393269772901229, 9233870580127604406, 8040351000384949099, 2082747769118638584, 9037700404196650899, 17868569356942562984, 3031609089566191882, 15372246715962319753, 5259611931696930736, 14882250288085472215, 10288285656672707851, 11046557109431487119, 4891889892170146481, 40, 803284148597046, 10010111294767420802, 16943179644353820008, 8996122336997085030, 17350347680949584060, 13520911097528541892, 14769691589967587136, 81685142906752346, 7559897225353479520, 128512095027132822, 9792116363139842106, 4634576985104787587, 8679380235287294885, 1134592111928495305, 4684288247441474792, 15613043314698948257, 4841731940180862534, 5786518576333159075, 12666070374819933283, 2487841274273895537, 5690982477694717281, 5924572671969496500, 8629130978595053833, 18206699227813987098, 14234831161984809711, 16798226782780142546, 9330568307929665420, 9731250716956559616, 12286920896461242142, 1919835269886444210, 10627125303494028926, 0, 276, 5572533910279649175, 2665502751151845058, 3420041171743926975, 13105841064724313047, 10443718589068788975, 16410831941400613845, 8706919134091371207, 5424121700527660040, 12860111264033880808, 468662522013222574, 14746212538756510443, 1337341156189505070, 5208953037158023510, 6068232083162993748, 9678821925451981470, 17715598857116570054, 17221271024145736360, 1975930269787186400, 3526946062060894178, 12647721578094853267, 13858063547960126340, 1348240088196356067, 15972449905513110374, 2515565498382079126, 9279746140911612054, 3713543423691008796, 3233112695116768266, 1858231082388626584, 17742257866254572336, 16104169334207009019, 0, 16, 7110029021941723513, 10115409991715085575, 11428668827299215140, 4015039023438705588, 3732466887400149035, 5870841944205588609, 8421627027326523148, 8231214549142439222, 10318470559229280016, 15171283498151438808, 12477430934852872037, 3853779543897991795, 14662750186533371679, 7423988381383082226, 13549468426633458145, 11079168775731474830, 12471207782095033761, 17595325414333663547, 7042468264080735391, 17650115337646869205, 14946074228061446423, 4655654314239637986, 11187552516160183253, 18115881480442018545, 899748567092010447, 14020868337400209874, 15417366235984526759, 3331301994171189600, 15814677761660135474, 4243893038989355703, 40, 40, 4294967292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12334791106787903660, 16314186579682789689, 16046055491183908407, 6937908670684349781, 9428962583778419369, 12671344758477488595, 7729650243590863324, 11715634485135010533, 2133167353214657976, 4100349204869170028, 14110128220081934719, 3223264940814324611, 4013852846792290230, 3963283702543497203, 11663083613788432971, 7907953758158564716, 13628053756450739862, 11139084033219732849, 3452979822093558380, 14346711487449348492, 15207411620676648511, 501329811930827740, 7758369216397164239, 10815732145433955496, 4610905976152412334, 17935722133204612030, 4407166322243232537, 13210703243795283421, 2674423901749705077, 3504222453682520691, 2024557484059292221, 11712807151087072240, 0, 803284148596806, 2549897079792572603, 5670682422759337153, 4249626004536644548, 9138873913574622404, 1343119293110958009, 15707367360995172765, 2149720931386886989, 12579497520806083785, 14990373923527496282, 7330871518527332444, 5790961380321049961, 5495469617420264118, 10789212522972025785, 4356961356341052500, 8032044444015716361, 5554647570062987979, 1022644107902166331, 6764324513849573852, 14002884382934858252, 14316154512513580139, 8331374540726760892, 13067519389098510351, 8671032013540344722, 13457978878695920483, 16399505509770566014, 10578307416004071064, 11950037765875050974, 12195903600484928258, 17694444981837938563, 12334791106787903660, 0, 92, 13491880295779941671, 17558274388625518928, 2846824553470173952, 3523509076537079172, 9799038632780562513, 13535672937351711649, 9746772683078209435, 16106002567881560829, 8079784996354006751, 4777591649493566963, 1345156373992429389, 15297897479538231384, 13973483607215960244, 18340152543215802049, 5000946629530062426, 15890473733699877306, 14902294728590831204, 3011516360220729965, 17542926168179991242, 6657567861688973613, 8835168761010196729, 8826324103843911331, 9882179407362466285, 11897066781203331526, 3536220024494542760, 11424483570196748419, 294092485488322279, 12149225804903469645, 3036839951080750932, 2750797734633655770, 0, 16, 3208043314804619251, 6920597847411412414, 17985619796195836408, 11907191178709112742, 16377455862733420451, 15572876043608056600, 9466912758182965715, 17480763791598773801, 15029113851915312964, 1953587265841775225, 7175742902791404624, 6820764940134875350, 16069841829669607101, 15548451706938320654, 11760680638795846495, 1560700914733041660, 762367990279432470, 2603436428456411224, 6200990949184863170, 11673627333152839295, 7804486006334068097, 1006207264024395366, 11193609705356653459, 5704515878100803393, 14918729158665343812, 10658508130485449873, 380737719356524599, 12870561906904032245, 6984680585936259437, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [14319792288905293245, 13415211686073742374, 3149648302915651279, 2183945468601797792, 13296390406171247483, 1854573623301018325, 6584248684794021237, 16089856164543344516, 4773455775437745378, 8456999553910293319, 5311613736439167674, 332137947454970287, 18353623873984208545, 6936763828562118650, 7803450627715630286, 2809593074760044198, 17403350541234273237, 4739616627721376242, 12174946372048241570, 9146291209906782044, 16719606593630884665, 8010607335321228412, 8980769147119509995, 6575555704765488965, 5801827901371738935, 11455982787078836790, 8211250723004787137, 6151514289078604478, 17915715126849699543, 12433676256235881077, 7933147088254086263, 11509025001394472292, 0, 2008210371491335, 16850544756775285522, 652387120995254672, 4188956971131276775, 18389965100329173053, 852421464532798418, 17258729097516267384, 11347427093515448316, 13908538323250058716, 6558337355650114042, 4089976927111145333, 17816809041231283545, 12843997071522346840, 1655996231185402724, 11256141768734986569, 3019459069615110433, 16778373777892540383, 10175251160015024193, 11396702708789693017, 16481019216530994753, 5122353003150766192, 17913616556333538828, 6485826671956173957, 15738756542654855641, 12199621872357116369, 12077164016468113545, 8907315944885273345, 4878983963291132913, 1618531819557712390, 565132887411573955, 7288090792972058500, 0, 644, 8698112979694512183, 1484832724912073400, 17559905242927504135, 8301224421374966792, 9399236208058450174, 2669398055632380115, 11307131702448115253, 11217016437113601321, 5789099451732089955, 4549622233314763492, 1239065339957448367, 4175942380264380439, 14889292305938541714, 4531363562013687755, 5140869640511317393, 11140388332008156040, 9692465784954462068, 9297910418252147698, 13488989169427894096, 3552900044190654848, 6760710657831378657, 12121966587219528787, 15900962396386651595, 6608207234386334072, 8800758533265494982, 16201621108022440385, 6765154775891776468, 15354276103682076009, 7645122244202370271, 15666451408857108222, 0, 40, 18130890293586930078, 18252951749527557342, 4460903658820341507, 859505755654562117, 5961685480015386121, 12134776249586726543, 11174658189737631113, 18385152961050631924, 9881471501704199804, 9636744945302995714, 12323181865658998064, 14903454669611502952, 1490539036394497080, 11688514875590095153, 16093513520259190726, 7731471377060742735, 5247500963110975116, 5269361527156951110, 13733877647296302634, 11865469401112846356, 7643242142337524006, 15572658687280648106, 9345628789826937825, 3291248301730279223, 16808111015808513609, 16274730253017522022, 12243901590027926887, 6559275936659510680, 17224785255700525855, 1390310476158884261, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11465345153771181037, 14098642529467391391, 5535026374122183926, 15092496102668051355, 257473274985355223, 10260436313437728882, 6731908034259211771, 11264349046953665415, 10299240179448618610, 5126151224060117218, 14121035940755315114, 8209352310311089013, 14971697601659082585, 1100050914291650821, 5035373507226681389, 16042249687109751437, 8837503665608453676, 2504937998242193140, 16526648943653417718, 2452121396486117195, 11029884787275710886, 2085781890586074785, 13162154469730856465, 7946539915965721335, 17992914229117852310, 7142641763418660559, 16732929992769459335, 1127063970169475225, 7467959617957012266, 9462884495447906259, 17277989807306885144, 1657723241998675022, 0, 1606568297193092, 1076973899277284702, 14086579741019377519, 3818478693739735842, 5593621083784091164, 11728670858811596587, 12625736484548160126, 968047239546776409, 15493380284459454506, 15542100289574010625, 15053368214221814937, 17388070103506970075, 4738318434573394804, 15389814481683087606, 14763812299525073807, 384493414835098150, 7660052382355122994, 7691788916209089905, 14721544157906502013, 737940994724202658, 3221762534387838371, 7517398897305596666, 13211005290810103003, 12141388589516060378, 13672030567886044471, 12296311093518063031, 6143526203440544581, 5554567664494429423, 12302163852964786956, 14310991091785572129, 7008881577152522467, 0, 552, 126724644436205205, 10241199256484865800, 11710755472728257079, 9814439449693896294, 4184208894850372064, 13142997752644266770, 12969767250590673327, 16308338449341618327, 2857514379308674181, 3609195066294253037, 185228684080860642, 1613944213773308204, 17903436875856263069, 4515533500061955413, 12536726874363800554, 15437904745147545753, 7830085342542866777, 6536598727940018370, 1711823131760196898, 7709623033392346991, 8552967012655997274, 8947445239291587989, 4670000389326714804, 12010856128816592344, 13269571463782090254, 13867391969199306543, 17267661857179267882, 10036416896754782473, 18012966148946012188, 5229864730287063918, 0, 32, 10452764368937945515, 6969997263492352670, 15570786589164252178, 16136993048454358354, 16378352067056606124, 11747573379431147483, 12296464969648251345, 8155132212936940581, 2470200969414032680, 18126939303114916528, 16736276280592238734, 15549342782445497049, 9033882039108268313, 5121596298161079296, 14336897502470956191, 6301009824137139871, 16614860627935231068, 10383378433371415142, 10330363517752279308, 10937466001850040595, 16305844076412050396, 7189713532379018536, 7568236447715590536, 10805187342082326609, 7424874700566577356, 13861219118264849665, 7052270251739242825, 17586339544079318164, 14071176523136369481, 12282546735285148319, 3, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16104169334207009019, 14145804402236837957, 638510963943763558, 18152457079207292292, 13178378367745074892, 13292769663331639140, 2409570605742285812, 18386931186537975697, 6045651321104574873, 10576311525321301834, 6759560187812996269, 265277838027200178, 15857438057860901996, 1037029241838654580, 6225168341521517925, 6895514801579803384, 1550665420642344807, 3231597075356238257, 4166180297101468799, 3189361261612592850, 5442307944523583224, 12110265058053493581, 12478481205289622727, 17774723700903466966, 13236760767894900950, 1895278615969967832, 5078948249831860209, 3481261074349261153, 11754602214149170613, 1831143805055270726, 14579426980777214583, 7525141456947324339, 0, 401642074298523, 16072847024087248681, 1047399340937520223, 13840617071834531990, 13835424809772757395, 12438858367585478828, 14080077230806112448, 11208516754282785707, 7691155727086178136, 17898846423848868766, 13990233438164144322, 14765296463244153634, 10144768301469359068, 16658833476738371029, 4674204014270448977, 12722211832796318871, 492549161703070590, 13986658207276323375, 14512155514173182920, 13983563295828088546, 2440687363152463730, 15931932209781173412, 11078906302351818677, 3584926465549602493, 6813538466449503008, 2334817027508375898, 12619526317209583817, 6515674137823977144, 393947096345211186, 1951192747307666741, 7526556702499462773, 0, 276, 12147025678885387063, 1963067308825972547, 4225984201120753953, 1196744323913827820, 5548577578393956861, 12196421586952833282, 6686048917052134288, 13682276749649062124, 18305115060607268181, 15701263684091820063, 4379325401380154240, 12368723875816287010, 10456077510396891682, 15257688804823183049, 14739472440526637936, 9698983999555494854, 6114823860832404997, 17890984706651436184, 7279056890420718668, 14586346563305650786, 7193610841629628055, 794393058555157904, 8446464239566334422, 18360375401158087305, 12786208149678159110, 8127795658820139321, 10374412076721466090, 10797782388389379392, 14917361677919134410, 4435027266040030689, 0, 8, 9114363797835460134, 5446076396314160376, 12863008906537145423, 10008421878335836436, 9952321233871043669, 12872379155893703237, 7266552182027361169, 1266036355585216796, 2621902104176569009, 8791105532651972211, 6351975813451610601, 11821139808280113179, 11281913023757770338, 3277134497757048289, 13219080767636598429, 10181825490691565485, 2766637533497216499, 5527857141123489970, 8463471033597650592, 16863468430858262436, 4521466714741486225, 2112404415880305855, 6776665887355979100, 4283028800297139078, 17448147405455891940, 2672696094870261596, 654959311657763753, 15404879372302137522, 458610335793450516, 11708893791522292939, 3358534066525179769, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2750797734633655770, 2196298446069803466, 11838988982732965160, 8838579915162662604, 9645282237960382599, 1452793205233705375, 13043673489495767039, 6914761656747274754, 6462510494810546740, 11542677354694298953, 10084597289196425304, 6187212959913925984, 13253251914245887991, 13426752715944801915, 14540441677731288899, 1687158516877835494, 5237558114922547298, 17657306689192164966, 13600283758187380877, 498396070609474559, 2816716335908718574, 2201796413416910298, 9217066277303434638, 1438935019962455534, 18328852556584031255, 6915155572789963327, 10360494843504659614, 14112471018395370124, 4296220331020841697, 13555983847490106392, 10974207239020571710, 4762963524641036906, 0, 401642074298403, 6959791354043610236, 1843180796447728437, 9556362158826632350, 3220022195391792741, 6012411438022691140, 4309223969498591447, 7596903557041777533, 18393682838284953355, 3973832102121938954, 12190997158276486897, 15972235844585587264, 14899488070931524727, 17337514399056563302, 10500237188498665928, 18440452962210035879, 7481614450647261413, 65300580117832193, 14713590013611289205, 13086268929321267306, 17247769089209001713, 11421561962034654967, 4561010052951998759, 9562817622798343284, 3062054327467638127, 6016566887476098647, 5513989129644936969, 13097123292793361360, 17631302057213141907, 8382824402074565601, 16136160484984138575, 0, 92, 1552825087809033479, 9447273069996733529, 6419011263238967677, 6692866018192235946, 7156821319138712192, 979552938298149105, 16414416705576227412, 12277732972115645845, 16390940174922802980, 3487294253425873238, 6189899981788830548, 5202139200141296429, 10911204476854742317, 1721085402837891517, 8352902245765240122, 11853370831480580617, 12549880386282601398, 182861448076475833, 907162566851125145, 5998456693193037487, 2770786935363726809, 7400519332304830077, 359467329647437035, 1312252687673992186, 7328500979632536073, 8813774793495812162, 6984573596316331699, 14977076517134741377, 16254221298013000537, 5001523311460849924, 0, 8, 6104172690014223231, 3119855977255645286, 2700229040680838768, 4228220371303630837, 12976691418076017877, 15391527008624099592, 15522155400452634037, 17655908650961725957, 5157987610310047621, 13664486701019622043, 12908699189677656287, 14840926611057477527, 6092037682822283700, 15181448373122947619, 2083722204849270202, 1893419523737526751, 11329911669537538562, 12331432886354737271, 9636585409664050258, 5131588463040403759, 10248116973079783912, 2136665268102207704, 17448444978654544666, 11945433761064128885, 4462464721020457233, 17579935132869425842, 7098417589530391109, 15343623253038912080, 7762335122892638892, 10310226363807226654, 9365253138981608257, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 3222968251772292059, 4659330917232488313, 18368728739119945660, 6368972875636062959, 4707200061081251786, 7837376579209547587, 12248323053399392025, 13659284260102405271, 3268373156044973502, 1283746275992984836, 6075821593933813225, 16314284187241223265, 5494222736271176220, 13120146179040509426, 11410636383049345368, 825507757879255520, 10747531529265802304, 7673382754837099366, 15156055697659221375, 1718675228113159248, 4201859160733141037, 5300265117402310501, 7272994976566716580, 14871183427463612333, 3498894361287896100, 15218257307939313170, 1772539751900737248, 1975418926721182099, 12089371041955731221, 15888265955091463133, 16091581530351759692, 0, 2008210371491335, 13098960849839742034, 9449621519891201049, 2814310786559014444, 5305842545683321494, 4969236906288915907, 1243780951433164967, 6167749875842285147, 9490220981060631819, 3665259354621890034, 7437125179920904126, 12655958476488865400, 17935537000594940941, 91614862745339577, 1869550524566103495, 17384150297165671545, 1154605885284628266, 8665046436862728398, 6741156569294553317, 9490927005547387767, 8947900188307771735, 13752550215202657538, 7714188412126691626, 12225947487197390724, 13509943592829854189, 7120740401378484294, 6789669275155346195, 2929601484581949152, 1077164174037184778, 7253613682453412944, 12957959164911169922, 0, 1288, 2467314028170731200, 16601393295490334589, 410862426300963016, 6715125970066025284, 668903147624506142, 12095483928402104962, 1613631742115437617, 3060858350461432106, 14519578477424544472, 1246482959663576649, 10151539857350203993, 14524407161343324874, 10767371226180010877, 8883572370406050272, 7634465548311616828, 13778778399918900014, 17362186831679047435, 7577173806777510989, 14020627064222792913, 15976021831713665696, 7948772943735475729, 1437804116009572564, 6007143667192036573, 16589616747039104611, 12022435130037250391, 11127010123944496312, 433966021407007016, 17962467459011056432, 2310073430536633551, 16159283724457640221, 0, 40, 1560947813056021755, 6935064976442414148, 9999441144135002932, 10354700837586583171, 6040781227937012106, 4698117391978117444, 4735711626023545756, 11217844833019453026, 3130590714605394722, 2809204122464618686, 10935232469327759448, 18335893537613898174, 10868401885487323501, 15799177281014635734, 17187052562019754838, 4027411046406207040, 11879721967266924677, 3613659344771632047, 1846469577394958972, 14668357323201408029, 14939045883642543835, 2885718226990976376, 4969257074069595075, 10824274197210729467, 13212275138420405274, 10563919532671437398, 12234598862193668129, 14653607410806008848, 2498958194485300229, 3512215170452429648, 4243893038989355703, 4243893038989355703, 2147483648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 16746387937695142490, 9155393387906219784, 13386503743719781199, 2643395754600898300, 8948310776749535742, 8784880786966306238, 1110225852810378745, 17164574292834012429, 5226876132626050588, 13521863983694335346, 1499535172174489924, 16371752154949209907, 1465531721291669927, 16357468590797302295, 15603236927467279886, 750159427723404852, 2426484208226890587, 18279268404534332738, 4383807752256753313, 14980454155356662645, 5638763115145836005, 309850158776234346, 17414628586841602406, 4488055553392002721, 6099746236569370915, 9391735730020210762, 6993986830519314663, 2701106116508976741, 1898134322103701335, 12702609090402714686, 16079373865472459546, 0, 1606568297193092, 17457628753812655267, 5096693283465186518, 12947605480618213072, 13490514080936595140, 16186587491946121120, 10245245868334896235, 6026705707665599719, 9827345407768028181, 2812471843237874845, 12940670116574659651, 2714930976118111710, 11931084046533097040, 5957825878304116293, 4815270995456833861, 3281433232253188744, 1527514044633931889, 3155608937877823823, 496495357063373704, 12643114535206930756, 2926290280590787897, 4481685646324082958, 2913086696180341350, 4929647997916999987, 9053067786296036128, 12860916533743270733, 13426707234447106813, 15934882759672330788, 2173747106952139997, 5260381980138555939, 9238536158694879401, 92, 1104, 16216562119055243322, 9113898857319116772, 17132700957014282816, 16961354324299843537, 8958491673128745523, 6084177919166198949, 4492424574001173259, 2065688581293602436, 433616324011879356, 12151404659680738203, 3770309554737682698, 5300222935868897680, 2845921321939758123, 9028103117859423722, 9867617548439033893, 12400304789414303503, 14859150043279622231, 5014308339038672362, 6600097648382112815, 1659304607975522629, 1739219815660099577, 10359847956037447171, 11590294256574231363, 3647107356246152267, 15247865541233938330, 14069295620220509130, 2869001919576405519, 17417648807118850139, 14370760106653398402, 11118838785729522730, 0, 32, 9302012295643728416, 424328237663665361, 17748121622218558811, 6681769685034042719, 10907932526941371789, 14996603190997478665, 13982878080104642188, 3336783822228111865, 7403528606603453519, 7309352233404946366, 11509327586943808925, 6803943428138467537, 12870260590513220077, 3798257798625653324, 15652192157997003684, 8260391000410661595, 9099897743400681933, 16067207775248165408, 7640841583197908852, 16739199083410292994, 1998275509994500625, 10688417071827877337, 16160081185811655577, 2725954513011781037, 3040692668058239811, 15097072321276989567, 7813293313258815644, 15261763399945716285, 2258772319189190202, 6756061023037720295, 2372900269115514267, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 13227498393864040945, 3236590870033651606, 18316422071602565784, 15701603594857309722, 5947972608122843521, 13523535320233199342, 3753934081047057169, 10936885931162702722, 5866281172578018338, 5131575035018446451, 9418660414070260899, 17291665633130001335, 16478272933178360032, 12493684045311157256, 12080786119242190524, 9808426190668729634, 10916182427754190208, 7949752104566735434, 16437679885653014489, 2197742477585333602, 11623912681484131137, 4866858089907087491, 7615091160766850619, 6639738661085122604, 6056593816756490758, 18265959195035569409, 439634521044110926, 12264490131121739608, 16106017656155713552, 1042562102193278240, 16047641734485800692, 0, 401642074298523, 10076989882539553734, 13617634258944637452, 11664888937794835322, 6832371865971954132, 7435465380685145582, 8856983143236954540, 15647394574465449881, 5004639611979401749, 16333513927375132208, 11586223746088007538, 17258599442845821467, 10089347514894229223, 8927362828162004403, 1274761678102044944, 13987176689734561031, 968318691601385838, 17920302096119022338, 18172419653743826470, 5238866342343116613, 4715585282245523496, 6782917713521523376, 845034972551066538, 8264516316211712068, 4395820162956710988, 17367170950581948054, 11715439359473390301, 4924405821869545305, 1674381281184830519, 4077397353846458666, 16570851802495678006, 0, 552, 18364539353432252959, 1551875687645078236, 5908552039479525180, 13623916550628200923, 4699969004069575100, 11630278164657820063, 5891234840048028912, 654092830709235842, 2412613677542740798, 9533885383398026397, 3477862308755521454, 3931695716927095485, 10207454088372242899, 17803175762377303845, 11036943293777954420, 16245042535546460743, 17267071485922545111, 3154671719447430275, 2667361456561557318, 8203075576459419142, 12382743643920078317, 9185031367250188962, 2354486840330493509, 13031927341928448984, 6462695849105922235, 17450486765305121779, 4895010392763653973, 14926331475286732296, 13033597008762597331, 7576593531686797042, 0, 8, 7519454690376123692, 7627104070861575574, 17604686071836489236, 14277148259130460564, 8312218486680706135, 8395439642754559152, 17307771294890409643, 9298206908486537717, 3027629924013931359, 2933551330348935458, 1450485994192951386, 8585052201707081835, 10624425952582111111, 16773523322999621677, 13337622149287916761, 17874287708894504070, 14164897610403484003, 11216401648549709020, 911970190394256131, 3202853507803349037, 14616902435260689479, 14924823153427050614, 4881022900440414264, 9723366934152472594, 16335725686098559697, 8087897843744270993, 11437013713086863200, 7627258546495067733, 18044191572661655945, 16490279521751489469, 1, 9, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 6170161675250864501, 11961896515966597756, 4654018437841213862, 5272790938970678408, 4281766794113009188, 11245796702384795879, 4856060583384283422, 17886680608631893125, 9261060821859854748, 14424996735749284440, 13746660795296557163, 4823043606851802454, 14938663460886908360, 7270036416424823086, 9523212457335079367, 9139548031431133148, 208295785334160234, 15753650123272304050, 10546365909049493247, 13322595239551652280, 13989288587795691202, 3906006690782976298, 17297950766482640011, 13938287014198326904, 16696817761315412012, 13953265341705633702, 4268569962168779654, 14232230927042798671, 6488214721912194407, 10956084748384074170, 17343413733132688543, 0, 401642074298403, 9851586117636382793, 7414079509745519565, 10414894202973226643, 11403399710197601656, 10230759118395809329, 4887466173119518776, 12376579030877442488, 15222686873173021915, 11343634646223977946, 15054143113295762432, 8578483304162845495, 8187399805941604842, 17460975957431844228, 12368453570037757143, 4715095521846408852, 10685847052710927197, 5160934306801665605, 12877482432527277885, 1026289052488784895, 12183816968946827507, 954239020314042893, 1899038343674936222, 3582199871763692750, 10141562795735590523, 5883730844910027408, 10313342961711791200, 10308552102917724507, 1101239144209002141, 16732112788727027442, 6132059608254040410, 0, 184, 9694623828077467233, 3675008886325466594, 9937899669773170043, 7849591422987652597, 15287367360056796639, 1702914822524674176, 10568464651116235631, 18376268405209394446, 17468515571505079540, 13349382737895871506, 10773310703441442177, 77415128127038826, 10067581411407423596, 2132439228676468850, 16446262234583425617, 15913203609357376990, 4328537832216989268, 14309894248163942626, 17219034350459931223, 16386215198201980227, 7529941270179488242, 3713349402354236945, 13565147716704204129, 3968526144162291548, 10616453538138359448, 16438784497837992964, 3058320693955246873, 4965950384458944745, 16872816814243270280, 6712929990112816841, 0, 8, 17781582622500481192, 12847902632736061277, 12021499907877242591, 16751519355106661703, 9062087890172095618, 3834953580385337540, 2969703856153678454, 11604562295556139307, 10447912046373566534, 12987934619706800857, 12352596220492768030, 14816150974992525275, 2172600571554701126, 18086375044546604023, 16313093185369681775, 14997664071320688070, 347950016295486690, 9206182676441692601, 3566552483989599402, 4925983231752336365, 1728701557101400581, 7087476601458867917, 9759961360999781392, 12569092891286895547, 14206292953735333262, 16422952955631166803, 6294107725304445883, 9537940691512987143, 15535806100011306333, 7080716573279759555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4099276459869907627, 11351842504255128813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(18) }, program_info: ProgramInfo { program_hash: Word([4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 19, range_trace_len: 49, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 3, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 0, 0, 0, 0, 0, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 3137828705454, 1, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 1, 1, 1, 0, 1, 0, 24514286761, 1, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 40, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 2, 1, 4, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 191517865, 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 1496233, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 11689, 1, 0, 0, 0, 0, 0, 0, 1, 2, 4, 0, 0, 0, 0, 0, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 91, 1, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 7, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 11, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 12, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 13, 13, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 5, 0, 1, 1, 0, 1, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 13, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 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, 16, 0, 0, 15, 13, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 7, 0, 0, 0, 0, 1, 1, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 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, 16, 0, 0, 16, 13, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 5, 0, 0, 0, 0, 1, 1, 1, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 0, 0, 1, 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, 16, 0, 0, 17, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 11509025001394472292, 1657723241998675022, 7525141456947324339, 4762963524641036906, 16091581530351759692, 16079373865472459546, 16047641734485800692, 17343413733132688543, 0, 0, 1, 0, 0, 1, 1, 0, 0, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 7288090792972058500, 7008881577152522467, 7526556702499462773, 16136160484984138575, 12957959164911169922, 9238536158694879401, 16570851802495678006, 6132059608254040410, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 15666451408857108222, 5229864730287063918, 4435027266040030689, 5001523311460849924, 16159283724457640221, 11118838785729522730, 7576593531686797042, 6712929990112816841, 0, 0, 1, 0, 0, 1, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 92, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13398731741387911383, 10446875550887438149, 5572533910279649175, 13491880295779941671, 8698112979694512183, 126724644436205205, 12147025678885387063, 1552825087809033479, 2467314028170731200, 16216562119055243322, 18364539353432252959, 9694623828077467233, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1702596310854469483, 7588826506897155585, 2665502751151845058, 17558274388625518928, 1484832724912073400, 10241199256484865800, 1963067308825972547, 9447273069996733529, 16601393295490334589, 9113898857319116772, 1551875687645078236, 3675008886325466594, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5960531672215414966, 16730914921892092280, 3420041171743926975, 2846824553470173952, 17559905242927504135, 11710755472728257079, 4225984201120753953, 6419011263238967677, 410862426300963016, 17132700957014282816, 5908552039479525180, 9937899669773170043, 1, 0, 0, 0, 1, 0, 2018420705353333259, 9229172344109022227, 14345475894589655224, 14152498107176274636, 12511176149634059683, 13105841064724313047, 3523509076537079172, 8301224421374966792, 9814439449693896294, 1196744323913827820, 6692866018192235946, 6715125970066025284, 16961354324299843537, 13623916550628200923, 7849591422987652597, 1, 0, 0, 0, 1, 0, 15554140634930940730, 12149993956067977962, 12691178410278042977, 5800650255543088287, 12242421290212925246, 8706919134091371207, 9746772683078209435, 11307131702448115253, 12969767250590673327, 6686048917052134288, 16414416705576227412, 1613631742115437617, 4492424574001173259, 5891234840048028912, 10568464651116235631, 1, 0, 0, 0, 1, 0, 13619523926946942997, 13932701015699199040, 16282203144892365836, 288495594474105189, 2659747577123257435, 468662522013222574, 4777591649493566963, 4549622233314763492, 3609195066294253037, 15701263684091820063, 3487294253425873238, 1246482959663576649, 12151404659680738203, 9533885383398026397, 13349382737895871506, 1, 0, 0, 0, 1, 0, 15226961741359169238, 9668238623772378075, 18406869698288958124, 10304697226126818963, 17510270622758876933, 5208953037158023510, 13973483607215960244, 14889292305938541714, 17903436875856263069, 10456077510396891682, 10911204476854742317, 10767371226180010877, 2845921321939758123, 10207454088372242899, 10067581411407423596, 1, 0, 0, 0, 1, 0, 11007944782899320208, 9688656475445036579, 11072586067494939844, 7796778119718125747, 17430549031516796763, 17715598857116570054, 15890473733699877306, 11140388332008156040, 15437904745147545753, 9698983999555494854, 11853370831480580617, 13778778399918900014, 12400304789414303503, 16245042535546460743, 15913203609357376990, 1, 0, 0, 0, 1, 0, 15735266059006798772, 3801815209619718647, 4149362138393037094, 11043847812690714922, 15750016999752216538, 3526946062060894178, 17542926168179991242, 13488989169427894096, 1711823131760196898, 7279056890420718668, 907162566851125145, 14020627064222792913, 6600097648382112815, 2667361456561557318, 17219034350459931223, 1, 0, 0, 0, 1, 0, 2879545791821313481, 1259493953867425253, 11021794342469225424, 16409243384953073963, 8823739942223974350, 1348240088196356067, 8826324103843911331, 12121966587219528787, 8947445239291587989, 794393058555157904, 7400519332304830077, 1437804116009572564, 10359847956037447171, 9185031367250188962, 3713349402354236945, 1, 0, 0, 0, 1, 0, 11365853094296287088, 0, 0, 9109780042108713794, 2025584296720659827, 9279746140911612054, 3536220024494542760, 8800758533265494982, 13269571463782090254, 12786208149678159110, 7328500979632536073, 12022435130037250391, 15247865541233938330, 6462695849105922235, 10616453538138359448, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15306362721670767113, 3678646409353890898, 3233112695116768266, 294092485488322279, 6765154775891776468, 17267661857179267882, 10374412076721466090, 6984573596316331699, 433966021407007016, 2869001919576405519, 4895010392763653973, 3058320693955246873, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2730832614768234730, 10191942812097658700, 1858231082388626584, 12149225804903469645, 15354276103682076009, 10036416896754782473, 10797782388389379392, 14977076517134741377, 17962467459011056432, 17417648807118850139, 14926331475286732296, 4965950384458944745, 1, 0, 0, 0, 1, 0, 0, 0, 0, 479016032615721743, 1453528547827258310, 17742257866254572336, 3036839951080750932, 7645122244202370271, 18012966148946012188, 14917361677919134410, 16254221298013000537, 2310073430536633551, 14370760106653398402, 13033597008762597331, 16872816814243270280, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 15666451408857108222, 5229864730287063918, 4435027266040030689, 5001523311460849924, 16159283724457640221, 11118838785729522730, 7576593531686797042, 6712929990112816841, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16253482711025978099, 5751576643258238090, 7110029021941723513, 3208043314804619251, 18130890293586930078, 10452764368937945515, 9114363797835460134, 6104172690014223231, 1560947813056021755, 9302012295643728416, 7519454690376123692, 17781582622500481192, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16690839578921925157, 7830268710878889486, 10115409991715085575, 6920597847411412414, 18252951749527557342, 6969997263492352670, 5446076396314160376, 3119855977255645286, 6935064976442414148, 424328237663665361, 7627104070861575574, 12847902632736061277, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11755424915479552417, 4868320831660690795, 11428668827299215140, 17985619796195836408, 4460903658820341507, 15570786589164252178, 12863008906537145423, 2700229040680838768, 9999441144135002932, 17748121622218558811, 17604686071836489236, 12021499907877242591, 1, 0, 0, 0, 1, 0, 4447686994046778179, 11785000236654418865, 10679155400143926564, 17934377671577204140, 7042762868047858013, 4015039023438705588, 11907191178709112742, 859505755654562117, 16136993048454358354, 10008421878335836436, 4228220371303630837, 10354700837586583171, 6681769685034042719, 14277148259130460564, 16751519355106661703, 1, 0, 0, 0, 1, 0, 217106376514171653, 11707313943908545641, 15092932467239161061, 11049594146888643723, 7267371538363991280, 8421627027326523148, 9466912758182965715, 11174658189737631113, 12296464969648251345, 7266552182027361169, 15522155400452634037, 4735711626023545756, 13982878080104642188, 17307771294890409643, 2969703856153678454, 1, 0, 0, 0, 1, 0, 11044550050665632476, 8958367422149199561, 16497379967830959424, 9105126057127804171, 13427183447069512151, 15171283498151438808, 1953587265841775225, 9636744945302995714, 18126939303114916528, 8791105532651972211, 13664486701019622043, 2809204122464618686, 7309352233404946366, 2933551330348935458, 12987934619706800857, 1, 0, 0, 0, 1, 0, 1877907417051268915, 6151364593092129113, 13049072304454003157, 14569284676797348998, 6517696895688418945, 14662750186533371679, 16069841829669607101, 1490539036394497080, 9033882039108268313, 11281913023757770338, 6092037682822283700, 10868401885487323501, 12870260590513220077, 10624425952582111111, 2172600571554701126, 1, 0, 0, 0, 1, 0, 10197860193367132813, 18317591232122268101, 11864893253666570624, 2835737623710330612, 12960707821770488929, 11079168775731474830, 1560700914733041660, 7731471377060742735, 6301009824137139871, 10181825490691565485, 1893419523737526751, 4027411046406207040, 8260391000410661595, 17874287708894504070, 14997664071320688070, 1, 0, 0, 0, 1, 0, 7903888723576875237, 18382523577454102436, 13167437966520740716, 15482419984058848245, 7634329044629047826, 7042468264080735391, 6200990949184863170, 13733877647296302634, 10330363517752279308, 8463471033597650592, 9636585409664050258, 1846469577394958972, 7640841583197908852, 911970190394256131, 3566552483989599402, 1, 0, 0, 0, 1, 0, 2186301169863059887, 6122215293275160143, 16696916221087249943, 5297995970636059087, 6007758954686348362, 4655654314239637986, 1006207264024395366, 15572658687280648106, 7189713532379018536, 2112404415880305855, 2136665268102207704, 2885718226990976376, 10688417071827877337, 14924823153427050614, 7087476601458867917, 1, 0, 0, 0, 1, 0, 4350099661540135647, 0, 0, 770728251595531533, 434120282701603474, 899748567092010447, 14918729158665343812, 16808111015808513609, 7424874700566577356, 17448147405455891940, 4462464721020457233, 13212275138420405274, 3040692668058239811, 16335725686098559697, 14206292953735333262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1347942901513492691, 5581285869985960561, 15417366235984526759, 380737719356524599, 12243901590027926887, 7052270251739242825, 654959311657763753, 7098417589530391109, 12234598862193668129, 7813293313258815644, 11437013713086863200, 6294107725304445883, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12086966446141742548, 6581368197537384623, 3331301994171189600, 12870561906904032245, 6559275936659510680, 17586339544079318164, 15404879372302137522, 15343623253038912080, 14653607410806008848, 15261763399945716285, 7627258546495067733, 9537940691512987143, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10239457018222882008, 17661012293298952642, 15814677761660135474, 6984680585936259437, 17224785255700525855, 14071176523136369481, 458610335793450516, 7762335122892638892, 2498958194485300229, 2258772319189190202, 18044191572661655945, 15535806100011306333, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 1, 0, 0, 0, 1, 0, 0, 0, 0, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14280802901810915241, 1835177830541154044, 10010111294767420802, 2549897079792572603, 16850544756775285522, 1076973899277284702, 16072847024087248681, 6959791354043610236, 13098960849839742034, 17457628753812655267, 10076989882539553734, 9851586117636382793, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7925919485060883878, 826263100281998566, 16943179644353820008, 5670682422759337153, 652387120995254672, 14086579741019377519, 1047399340937520223, 1843180796447728437, 9449621519891201049, 5096693283465186518, 13617634258944637452, 7414079509745519565, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9094034340168608638, 9612296353153372169, 8996122336997085030, 4249626004536644548, 4188956971131276775, 3818478693739735842, 13840617071834531990, 9556362158826632350, 2814310786559014444, 12947605480618213072, 11664888937794835322, 10414894202973226643, 1, 0, 0, 0, 1, 0, 206637164063268726, 10092260866618400225, 13038545162971821924, 6650811367268781560, 2509054224639990472, 17350347680949584060, 9138873913574622404, 18389965100329173053, 5593621083784091164, 13835424809772757395, 3220022195391792741, 5305842545683321494, 13490514080936595140, 6832371865971954132, 11403399710197601656, 1, 0, 0, 0, 1, 0, 13042021488072180943, 17665366762968375743, 14514089290800305099, 13091389828882674218, 4611398810491526224, 81685142906752346, 2149720931386886989, 11347427093515448316, 968047239546776409, 11208516754282785707, 7596903557041777533, 6167749875842285147, 6026705707665599719, 15647394574465449881, 12376579030877442488, 1, 0, 0, 0, 1, 0, 7479226098762365380, 20647088475708265, 14234714302482719672, 680445747454648704, 10159688738464070440, 9792116363139842106, 7330871518527332444, 4089976927111145333, 15053368214221814937, 13990233438164144322, 12190997158276486897, 7437125179920904126, 12940670116574659651, 11586223746088007538, 15054143113295762432, 1, 0, 0, 0, 1, 0, 13347963917530181895, 10889708507292659338, 4175833649164370394, 5233297770622824375, 745298233749984501, 1134592111928495305, 10789212522972025785, 1655996231185402724, 15389814481683087606, 16658833476738371029, 17337514399056563302, 91614862745339577, 5957825878304116293, 8927362828162004403, 17460975957431844228, 1, 0, 0, 0, 1, 0, 6929809241430544204, 6641711964892684437, 12124997350307806549, 9867160564810673994, 17942681985602265676, 4841731940180862534, 5554647570062987979, 16778373777892540383, 7660052382355122994, 492549161703070590, 7481614450647261413, 1154605885284628266, 1527514044633931889, 968318691601385838, 10685847052710927197, 1, 0, 0, 0, 1, 0, 17634176407370476921, 7739526124990237795, 13838384228721941065, 10263347723858682786, 10152063658776528390, 2487841274273895537, 14002884382934858252, 16481019216530994753, 737940994724202658, 13983563295828088546, 13086268929321267306, 9490927005547387767, 12643114535206930756, 5238866342343116613, 1026289052488784895, 1, 0, 0, 0, 1, 0, 6697396169967230934, 18287805115840952516, 14443334479498508931, 9643915442530902318, 5274902253855511588, 8629130978595053833, 13067519389098510351, 6485826671956173957, 13211005290810103003, 11078906302351818677, 4561010052951998759, 7714188412126691626, 2913086696180341350, 845034972551066538, 1899038343674936222, 1, 0, 0, 0, 1, 0, 15116382065750335012, 0, 0, 887493237489321299, 6033538369482377655, 16798226782780142546, 16399505509770566014, 12077164016468113545, 12296311093518063031, 2334817027508375898, 6016566887476098647, 7120740401378484294, 12860916533743270733, 17367170950581948054, 5883730844910027408, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13483864438078018308, 3570589185097006252, 9731250716956559616, 11950037765875050974, 4878983963291132913, 5554567664494429423, 6515674137823977144, 13097123292793361360, 2929601484581949152, 15934882759672330788, 4924405821869545305, 10308552102917724507, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8159241411748295729, 4587292818271677447, 12286920896461242142, 12195903600484928258, 1618531819557712390, 12302163852964786956, 393947096345211186, 17631302057213141907, 1077164174037184778, 2173747106952139997, 1674381281184830519, 1101239144209002141, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10385528691577928985, 16771298688176486904, 1919835269886444210, 17694444981837938563, 565132887411573955, 14310991091785572129, 1951192747307666741, 8382824402074565601, 7253613682453412944, 5260381980138555939, 4077397353846458666, 16732112788727027442, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 7288090792972058500, 7008881577152522467, 7526556702499462773, 16136160484984138575, 12957959164911169922, 9238536158694879401, 16570851802495678006, 6132059608254040410, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4194228403373198226, 17446294671039685780, 16018419181163655201, 16046055491183908407, 3149648302915651279, 5535026374122183926, 638510963943763558, 11838988982732965160, 4659330917232488313, 9155393387906219784, 3236590870033651606, 11961896515966597756, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4321424756204952178, 12180657588796280274, 16144413208110066321, 6937908670684349781, 2183945468601797792, 15092496102668051355, 18152457079207292292, 8838579915162662604, 18368728739119945660, 13386503743719781199, 18316422071602565784, 4654018437841213862, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17106991433953495229, 3901851127268644692, 12517012706582615280, 9428962583778419369, 13296390406171247483, 257473274985355223, 13178378367745074892, 9645282237960382599, 6368972875636062959, 2643395754600898300, 15701603594857309722, 5272790938970678408, 1, 0, 0, 0, 1, 0, 8354096936197882314, 12164220337553977958, 17378238272422563267, 480007043786623808, 15132938321031306327, 17466716576309862393, 12671344758477488595, 1854573623301018325, 10260436313437728882, 13292769663331639140, 1452793205233705375, 4707200061081251786, 8948310776749535742, 5947972608122843521, 4281766794113009188, 1, 0, 0, 0, 1, 0, 6138730842224758627, 11686086623819538808, 14590719856456710457, 7837641036032671415, 12010127700996563076, 15879773433331271008, 2133167353214657976, 4773455775437745378, 10299240179448618610, 6045651321104574873, 6462510494810546740, 13659284260102405271, 17164574292834012429, 10936885931162702722, 17886680608631893125, 1, 0, 0, 0, 1, 0, 3162794119795435989, 4562834728889875846, 6107962147992612292, 8465759122953264103, 1665683881724788425, 17940570471380392799, 3223264940814324611, 332137947454970287, 8209352310311089013, 265277838027200178, 6187212959913925984, 6075821593933813225, 1499535172174489924, 9418660414070260899, 13746660795296557163, 1, 0, 0, 0, 1, 0, 12162889168802937247, 15401019179307093351, 9535864432215440062, 9771451080159159411, 1484367395490874035, 4502835184975000914, 11663083613788432971, 7803450627715630286, 5035373507226681389, 6225168341521517925, 14540441677731288899, 13120146179040509426, 16357468590797302295, 12493684045311157256, 7270036416424823086, 1, 0, 0, 0, 1, 0, 11474756587763645750, 12425880873394014153, 6096335841451385157, 17765926817646991510, 16052656468702535281, 4179930870000296671, 11139084033219732849, 4739616627721376242, 2504937998242193140, 3231597075356238257, 17657306689192164966, 10747531529265802304, 2426484208226890587, 10916182427754190208, 208295785334160234, 1, 0, 0, 0, 1, 0, 16765618494244376401, 5081092756681378539, 13872457506768069988, 4529776878769021619, 169695422976636841, 9233870580127604406, 15207411620676648511, 16719606593630884665, 11029884787275710886, 5442307944523583224, 2816716335908718574, 1718675228113159248, 14980454155356662645, 2197742477585333602, 13322595239551652280, 1, 0, 0, 0, 1, 0, 13714635581333797590, 1976182429811709209, 5257242985435580561, 14057252888063062893, 8215766650263520356, 9037700404196650899, 10815732145433955496, 6575555704765488965, 7946539915965721335, 17774723700903466966, 1438935019962455534, 7272994976566716580, 17414628586841602406, 7615091160766850619, 17297950766482640011, 1, 0, 0, 0, 1, 0, 5178157714855210142, 0, 0, 9776318485951152693, 12890305973496102809, 15372246715962319753, 4407166322243232537, 8211250723004787137, 16732929992769459335, 5078948249831860209, 10360494843504659614, 15218257307939313170, 9391735730020210762, 18265959195035569409, 13953265341705633702, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14580812564900766592, 15861640058126249653, 14882250288085472215, 2674423901749705077, 17915715126849699543, 7467959617957012266, 11754602214149170613, 4296220331020841697, 1975418926721182099, 2701106116508976741, 12264490131121739608, 14232230927042798671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6012095218278392893, 14517213901488835116, 10288285656672707851, 3504222453682520691, 12433676256235881077, 9462884495447906259, 1831143805055270726, 13555983847490106392, 12089371041955731221, 1898134322103701335, 16106017656155713552, 6488214721912194407, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12583880807825187559, 6582109139928846076, 11046557109431487119, 2024557484059292221, 7933147088254086263, 17277989807306885144, 14579426980777214583, 10974207239020571710, 15888265955091463133, 12702609090402714686, 1042562102193278240, 10956084748384074170, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 11509025001394472292, 1657723241998675022, 7525141456947324339, 4762963524641036906, 16091581530351759692, 16079373865472459546, 16047641734485800692, 17343413733132688543, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 40, 0, 0, 3, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1, 0, 1, 1, 10, 0, 0, 0, 1, 0, 1, 1, 0, 40, 0, 0, 12, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 9, 0, 4099276459869907627, 1, 10, 0, 0, 0, 1, 0, 0, 0, 13, 4294967292, 0, 1, 12, 0, 0, 2147483648, 0, 13, 0, 11351842504255128813, 0, 65535, 16383, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 1, 2, 1, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 7, 8, 9, 10, 13, 2200, 4387, 6574, 8761, 10948, 13135, 15322, 16051, 16294, 16375, 16378, 16381, 16382, 16383, 18570, 20757, 22944, 25131, 27318, 29505, 31692, 33879, 36066, 38253, 40440, 42627, 44814, 47001, 49188, 51375, 53562, 55749, 57936, 60123, 62310, 64497, 65226, 65469, 65496, 65523, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(18) }, program_info: ProgramInfo { program_hash: Word([4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 19, range_trace_len: 51, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 3, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_25.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_25.snap index 2d5bc4bfe7..943e299594 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_25.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_25.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3358534066525179769, 3358534066525179769, 3358534066525179769, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9365253138981608257, 9365253138981608257, 9365253138981608257, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4243893038989355703, 4243893038989355703, 4243893038989355703, 4243893038989355703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2372900269115514267, 2372900269115514267, 2372900269115514267, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 1, 65, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5482243896119908732, 401642074298203, 3137828705454, 24514286761, 191517865, 1496233, 11689, 91, 0, 0, 0, 5482243896119908732, 3358534066525179769, 8, 0, 3358534066525179769, 14319792288905293245, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220, 4192437018821097220], [17271741639510569126, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17271741639510569126, 9365253138981608257, 0, 65, 9365253138981608257, 11465345153771181037, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864, 9480578168622006864], [10627125303494028926, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10627125303494028926, 4243893038989355703, 0, 0, 4243893038989355703, 16104169334207009019, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481, 4891889892170146481], [12334791106787903660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12334791106787903660, 2372900269115514267, 0, 0, 2372900269115514267, 2750797734633655770, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240, 11712807151087072240], [14319792288905293245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11465345153771181037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16104169334207009019, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2750797734633655770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4, 3, 2, 2, 2, 2, 2, 2, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [3358534066525179769, 3358534066525179769, 3358534066525179769, 40, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [9365253138981608257, 9365253138981608257, 9365253138981608257, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4243893038989355703, 4243893038989355703, 4243893038989355703, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2372900269115514267, 2372900269115514267, 2372900269115514267, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 17, 16, 16, 16, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 2, 0, 0, 0, 0, 0, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 7, 8, 9, 12, 13, 2200, 4387, 6574, 8761, 10948, 13135, 15322, 17509, 19696, 21883, 24070, 26257, 28444, 30631, 32818, 35005, 37192, 39379, 41566, 43753, 45940, 48127, 50314, 52501, 54688, 56875, 59062, 61249, 63436, 64165, 64894, 65137, 65380, 65461, 65488, 65515, 65524, 65533, 65534, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5482243896119908732, 14700437138657715688, 4194228403373198226, 4321424756204952178, 17106991433953495229, 480007043786623808, 9077933169163287651, 10301794879477559358, 7837641036032671415, 9957661348832415284, 3403527796290311921, 8465759122953264103, 9491055353357939181, 14342984469850983837, 9771451080159159411, 8537706246195014625, 11423410855123831518, 17765926817646991510, 8321792161956545451, 13783267673851502179, 4529776878769021619, 8116795789739369570, 3611313486028920718, 14057252888063062893, 13188102157225090063, 40859616366247747, 9776318485951152693, 14134961488520769281, 14580812564900766592, 6012095218278392893, 12583880807825187559, 4192437018821097220, 401642074298203, 4016420742982670, 14280802901810915241, 7925919485060883878, 9094034340168608638, 6650811367268781560, 13344927435882217244, 15870694671012449597, 13091389828882674218, 168434371192049215, 13973668876111195937, 680445747454648704, 15441309962929722976, 15749770188837954531, 5233297770622824375, 3367253731665130938, 5066484463076591248, 9867160564810673994, 16707816004584596036, 6832899290197418961, 10263347723858682786, 6209209797490182000, 8678413656546712232, 9643915442530902318, 17208626611000903707, 11389822518212260982, 887493237489321299, 48736118273260452, 13483864438078018308, 8159241411748295729, 10385528691577928985, 5482243896119908732, 0, 644, 13398731741387911383, 1702596310854469483, 5960531672215414966, 14152498107176274636, 12742762049153184106, 747050504586908561, 5800650255543088287, 16122619596578164144, 6772875084421984040, 288495594474105189, 8600976689152153054, 3411751581427101134, 10304697226126818963, 3398791421797336513, 4476944395780698788, 7796778119718125747, 5617773719451830708, 18153429098783777295, 11043847812690714922, 1719133760987188643, 10906522308373106683, 16409243384953073963, 916060433516903836, 6973907531599316043, 9109780042108713794, 17099296735351468833, 15306362721670767113, 2730832614768234730, 479016032615721743, 14319792288905293245, 8, 80, 16253482711025978099, 16690839578921925157, 11755424915479552417, 17934377671577204140, 15509754874715907467, 6426721221030580337, 11049594146888643723, 14912334368661229147, 17657273147290084056, 9105126057127804171, 13430225876739607206, 3614830725909060912, 14569284676797348998, 4705513459362295944, 424917224365117418, 2835737623710330612, 1964100172858915134, 14896843043547784767, 15482419984058848245, 18437547705335910066, 3162257106529980441, 5297995970636059087, 9661978795293871188, 10128143329575104151, 770728251595531533, 9782965673735423214, 1347942901513492691, 12086966446141742548, 10239457018222882008, 3358534066525179769, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [17271741639510569126, 17693777214203449670, 17446294671039685780, 12180657588796280274, 3901851127268644692, 15132938321031306327, 4529077938382910243, 1349343284414021678, 12010127700996563076, 3802141577517901644, 10153500743657060380, 1665683881724788425, 2536206416673670232, 6321132288631485459, 1484367395490874035, 9791226137836052251, 10111774824823842282, 16052656468702535281, 10276660848524574906, 11241218962943578830, 169695422976636841, 7241344066748902545, 3569311910587147072, 8215766650263520356, 2619309237284639419, 1962296512232188159, 12890305973496102809, 11438817727011493827, 15861640058126249653, 14517213901488835116, 6582109139928846076, 9480578168622006864, 40, 3213136594386184, 1835177830541154044, 826263100281998566, 9612296353153372169, 2509054224639990472, 11363599377854067153, 5593295816013818122, 4611398810491526224, 17064807786960234347, 18427889571151062396, 10159688738464070440, 14427917509182297997, 6874689601963577621, 745298233749984501, 4960831845018172313, 1451394763904737446, 17942681985602265676, 17508193444101172646, 1672370857206926433, 10152063658776528390, 14576660961872281746, 13602838247655372264, 5274902253855511588, 3163862752932557920, 7292072545764012550, 6033538369482377655, 10941848106600998110, 3570589185097006252, 4587292818271677447, 16771298688176486904, 17271741639510569126, 0, 552, 10446875550887438149, 7588826506897155585, 16730914921892092280, 12511176149634059683, 1758801585754904665, 5885085633120358478, 12242421290212925246, 17368642390815603411, 11245463457685625563, 2659747577123257435, 11347669259219881571, 15449337489158534519, 17510270622758876933, 18027674089872559881, 16436012900980393273, 17430549031516796763, 17674101567742383712, 4643493040432393957, 15750016999752216538, 5970778449527916441, 7406085958721442119, 8823739942223974350, 12296950126673436366, 8362221384115403494, 2025584296720659827, 17113734046007416651, 3678646409353890898, 10191942812097658700, 1453528547827258310, 11465345153771181037, 0, 64, 5751576643258238090, 7830268710878889486, 4868320831660690795, 7042762868047858013, 1028615964620729689, 12270587957620579653, 7267371538363991280, 16125626865182516658, 16950134439933558852, 13427183447069512151, 16117382505273595827, 2222792985740553749, 6517696895688418945, 15516128650333221731, 6357034143715229949, 12960707821770488929, 12451444460344609421, 8786747128188560390, 7634329044629047826, 7741107824034642016, 10975559322169081956, 6007758954686348362, 13971256108093330407, 16868860295450858142, 434120282701603474, 11571634562637977474, 5581285869985960561, 6581368197537384623, 17661012293298952642, 9365253138981608257, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10627125303494028926, 7089946709940699513, 16018419181163655201, 16144413208110066321, 12517012706582615280, 17466716576309862393, 18120522547066464513, 3133443529903863473, 15879773433331271008, 15058242802738637389, 16107648145131258558, 17940570471380392799, 4146898483110117869, 13355141649182107533, 4502835184975000914, 11529786935650512206, 6872828020563546843, 4179930870000296671, 14088376982248436722, 3284393269772901229, 9233870580127604406, 8040351000384949099, 2082747769118638584, 9037700404196650899, 17868569356942562984, 3031609089566191882, 15372246715962319753, 5259611931696930736, 14882250288085472215, 10288285656672707851, 11046557109431487119, 4891889892170146481, 40, 803284148597046, 10010111294767420802, 16943179644353820008, 8996122336997085030, 17350347680949584060, 13520911097528541892, 14769691589967587136, 81685142906752346, 7559897225353479520, 128512095027132822, 9792116363139842106, 4634576985104787587, 8679380235287294885, 1134592111928495305, 4684288247441474792, 15613043314698948257, 4841731940180862534, 5786518576333159075, 12666070374819933283, 2487841274273895537, 5690982477694717281, 5924572671969496500, 8629130978595053833, 18206699227813987098, 14234831161984809711, 16798226782780142546, 9330568307929665420, 9731250716956559616, 12286920896461242142, 1919835269886444210, 10627125303494028926, 0, 276, 5572533910279649175, 2665502751151845058, 3420041171743926975, 13105841064724313047, 10443718589068788975, 16410831941400613845, 8706919134091371207, 5424121700527660040, 12860111264033880808, 468662522013222574, 14746212538756510443, 1337341156189505070, 5208953037158023510, 6068232083162993748, 9678821925451981470, 17715598857116570054, 17221271024145736360, 1975930269787186400, 3526946062060894178, 12647721578094853267, 13858063547960126340, 1348240088196356067, 15972449905513110374, 2515565498382079126, 9279746140911612054, 3713543423691008796, 3233112695116768266, 1858231082388626584, 17742257866254572336, 16104169334207009019, 0, 16, 7110029021941723513, 10115409991715085575, 11428668827299215140, 4015039023438705588, 3732466887400149035, 5870841944205588609, 8421627027326523148, 8231214549142439222, 10318470559229280016, 15171283498151438808, 12477430934852872037, 3853779543897991795, 14662750186533371679, 7423988381383082226, 13549468426633458145, 11079168775731474830, 12471207782095033761, 17595325414333663547, 7042468264080735391, 17650115337646869205, 14946074228061446423, 4655654314239637986, 11187552516160183253, 18115881480442018545, 899748567092010447, 14020868337400209874, 15417366235984526759, 3331301994171189600, 15814677761660135474, 4243893038989355703, 40, 40, 4294967292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12334791106787903660, 16314186579682789689, 16046055491183908407, 6937908670684349781, 9428962583778419369, 12671344758477488595, 7729650243590863324, 11715634485135010533, 2133167353214657976, 4100349204869170028, 14110128220081934719, 3223264940814324611, 4013852846792290230, 3963283702543497203, 11663083613788432971, 7907953758158564716, 13628053756450739862, 11139084033219732849, 3452979822093558380, 14346711487449348492, 15207411620676648511, 501329811930827740, 7758369216397164239, 10815732145433955496, 4610905976152412334, 17935722133204612030, 4407166322243232537, 13210703243795283421, 2674423901749705077, 3504222453682520691, 2024557484059292221, 11712807151087072240, 0, 803284148596806, 2549897079792572603, 5670682422759337153, 4249626004536644548, 9138873913574622404, 1343119293110958009, 15707367360995172765, 2149720931386886989, 12579497520806083785, 14990373923527496282, 7330871518527332444, 5790961380321049961, 5495469617420264118, 10789212522972025785, 4356961356341052500, 8032044444015716361, 5554647570062987979, 1022644107902166331, 6764324513849573852, 14002884382934858252, 14316154512513580139, 8331374540726760892, 13067519389098510351, 8671032013540344722, 13457978878695920483, 16399505509770566014, 10578307416004071064, 11950037765875050974, 12195903600484928258, 17694444981837938563, 12334791106787903660, 0, 92, 13491880295779941671, 17558274388625518928, 2846824553470173952, 3523509076537079172, 9799038632780562513, 13535672937351711649, 9746772683078209435, 16106002567881560829, 8079784996354006751, 4777591649493566963, 1345156373992429389, 15297897479538231384, 13973483607215960244, 18340152543215802049, 5000946629530062426, 15890473733699877306, 14902294728590831204, 3011516360220729965, 17542926168179991242, 6657567861688973613, 8835168761010196729, 8826324103843911331, 9882179407362466285, 11897066781203331526, 3536220024494542760, 11424483570196748419, 294092485488322279, 12149225804903469645, 3036839951080750932, 2750797734633655770, 0, 16, 3208043314804619251, 6920597847411412414, 17985619796195836408, 11907191178709112742, 16377455862733420451, 15572876043608056600, 9466912758182965715, 17480763791598773801, 15029113851915312964, 1953587265841775225, 7175742902791404624, 6820764940134875350, 16069841829669607101, 15548451706938320654, 11760680638795846495, 1560700914733041660, 762367990279432470, 2603436428456411224, 6200990949184863170, 11673627333152839295, 7804486006334068097, 1006207264024395366, 11193609705356653459, 5704515878100803393, 14918729158665343812, 10658508130485449873, 380737719356524599, 12870561906904032245, 6984680585936259437, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [14319792288905293245, 13415211686073742374, 3149648302915651279, 2183945468601797792, 13296390406171247483, 1854573623301018325, 6584248684794021237, 16089856164543344516, 4773455775437745378, 8456999553910293319, 5311613736439167674, 332137947454970287, 18353623873984208545, 6936763828562118650, 7803450627715630286, 2809593074760044198, 17403350541234273237, 4739616627721376242, 12174946372048241570, 9146291209906782044, 16719606593630884665, 8010607335321228412, 8980769147119509995, 6575555704765488965, 5801827901371738935, 11455982787078836790, 8211250723004787137, 6151514289078604478, 17915715126849699543, 12433676256235881077, 7933147088254086263, 11509025001394472292, 0, 2008210371491335, 16850544756775285522, 652387120995254672, 4188956971131276775, 18389965100329173053, 852421464532798418, 17258729097516267384, 11347427093515448316, 13908538323250058716, 6558337355650114042, 4089976927111145333, 17816809041231283545, 12843997071522346840, 1655996231185402724, 11256141768734986569, 3019459069615110433, 16778373777892540383, 10175251160015024193, 11396702708789693017, 16481019216530994753, 5122353003150766192, 17913616556333538828, 6485826671956173957, 15738756542654855641, 12199621872357116369, 12077164016468113545, 8907315944885273345, 4878983963291132913, 1618531819557712390, 565132887411573955, 7288090792972058500, 0, 644, 8698112979694512183, 1484832724912073400, 17559905242927504135, 8301224421374966792, 9399236208058450174, 2669398055632380115, 11307131702448115253, 11217016437113601321, 5789099451732089955, 4549622233314763492, 1239065339957448367, 4175942380264380439, 14889292305938541714, 4531363562013687755, 5140869640511317393, 11140388332008156040, 9692465784954462068, 9297910418252147698, 13488989169427894096, 3552900044190654848, 6760710657831378657, 12121966587219528787, 15900962396386651595, 6608207234386334072, 8800758533265494982, 16201621108022440385, 6765154775891776468, 15354276103682076009, 7645122244202370271, 15666451408857108222, 0, 40, 18130890293586930078, 18252951749527557342, 4460903658820341507, 859505755654562117, 5961685480015386121, 12134776249586726543, 11174658189737631113, 18385152961050631924, 9881471501704199804, 9636744945302995714, 12323181865658998064, 14903454669611502952, 1490539036394497080, 11688514875590095153, 16093513520259190726, 7731471377060742735, 5247500963110975116, 5269361527156951110, 13733877647296302634, 11865469401112846356, 7643242142337524006, 15572658687280648106, 9345628789826937825, 3291248301730279223, 16808111015808513609, 16274730253017522022, 12243901590027926887, 6559275936659510680, 17224785255700525855, 1390310476158884261, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [11465345153771181037, 14098642529467391391, 5535026374122183926, 15092496102668051355, 257473274985355223, 10260436313437728882, 6731908034259211771, 11264349046953665415, 10299240179448618610, 5126151224060117218, 14121035940755315114, 8209352310311089013, 14971697601659082585, 1100050914291650821, 5035373507226681389, 16042249687109751437, 8837503665608453676, 2504937998242193140, 16526648943653417718, 2452121396486117195, 11029884787275710886, 2085781890586074785, 13162154469730856465, 7946539915965721335, 17992914229117852310, 7142641763418660559, 16732929992769459335, 1127063970169475225, 7467959617957012266, 9462884495447906259, 17277989807306885144, 1657723241998675022, 0, 1606568297193092, 1076973899277284702, 14086579741019377519, 3818478693739735842, 5593621083784091164, 11728670858811596587, 12625736484548160126, 968047239546776409, 15493380284459454506, 15542100289574010625, 15053368214221814937, 17388070103506970075, 4738318434573394804, 15389814481683087606, 14763812299525073807, 384493414835098150, 7660052382355122994, 7691788916209089905, 14721544157906502013, 737940994724202658, 3221762534387838371, 7517398897305596666, 13211005290810103003, 12141388589516060378, 13672030567886044471, 12296311093518063031, 6143526203440544581, 5554567664494429423, 12302163852964786956, 14310991091785572129, 7008881577152522467, 0, 552, 126724644436205205, 10241199256484865800, 11710755472728257079, 9814439449693896294, 4184208894850372064, 13142997752644266770, 12969767250590673327, 16308338449341618327, 2857514379308674181, 3609195066294253037, 185228684080860642, 1613944213773308204, 17903436875856263069, 4515533500061955413, 12536726874363800554, 15437904745147545753, 7830085342542866777, 6536598727940018370, 1711823131760196898, 7709623033392346991, 8552967012655997274, 8947445239291587989, 4670000389326714804, 12010856128816592344, 13269571463782090254, 13867391969199306543, 17267661857179267882, 10036416896754782473, 18012966148946012188, 5229864730287063918, 0, 32, 10452764368937945515, 6969997263492352670, 15570786589164252178, 16136993048454358354, 16378352067056606124, 11747573379431147483, 12296464969648251345, 8155132212936940581, 2470200969414032680, 18126939303114916528, 16736276280592238734, 15549342782445497049, 9033882039108268313, 5121596298161079296, 14336897502470956191, 6301009824137139871, 16614860627935231068, 10383378433371415142, 10330363517752279308, 10937466001850040595, 16305844076412050396, 7189713532379018536, 7568236447715590536, 10805187342082326609, 7424874700566577356, 13861219118264849665, 7052270251739242825, 17586339544079318164, 14071176523136369481, 12282546735285148319, 3, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16104169334207009019, 14145804402236837957, 638510963943763558, 18152457079207292292, 13178378367745074892, 13292769663331639140, 2409570605742285812, 18386931186537975697, 6045651321104574873, 10576311525321301834, 6759560187812996269, 265277838027200178, 15857438057860901996, 1037029241838654580, 6225168341521517925, 6895514801579803384, 1550665420642344807, 3231597075356238257, 4166180297101468799, 3189361261612592850, 5442307944523583224, 12110265058053493581, 12478481205289622727, 17774723700903466966, 13236760767894900950, 1895278615969967832, 5078948249831860209, 3481261074349261153, 11754602214149170613, 1831143805055270726, 14579426980777214583, 7525141456947324339, 0, 401642074298523, 16072847024087248681, 1047399340937520223, 13840617071834531990, 13835424809772757395, 12438858367585478828, 14080077230806112448, 11208516754282785707, 7691155727086178136, 17898846423848868766, 13990233438164144322, 14765296463244153634, 10144768301469359068, 16658833476738371029, 4674204014270448977, 12722211832796318871, 492549161703070590, 13986658207276323375, 14512155514173182920, 13983563295828088546, 2440687363152463730, 15931932209781173412, 11078906302351818677, 3584926465549602493, 6813538466449503008, 2334817027508375898, 12619526317209583817, 6515674137823977144, 393947096345211186, 1951192747307666741, 7526556702499462773, 0, 276, 12147025678885387063, 1963067308825972547, 4225984201120753953, 1196744323913827820, 5548577578393956861, 12196421586952833282, 6686048917052134288, 13682276749649062124, 18305115060607268181, 15701263684091820063, 4379325401380154240, 12368723875816287010, 10456077510396891682, 15257688804823183049, 14739472440526637936, 9698983999555494854, 6114823860832404997, 17890984706651436184, 7279056890420718668, 14586346563305650786, 7193610841629628055, 794393058555157904, 8446464239566334422, 18360375401158087305, 12786208149678159110, 8127795658820139321, 10374412076721466090, 10797782388389379392, 14917361677919134410, 4435027266040030689, 0, 8, 9114363797835460134, 5446076396314160376, 12863008906537145423, 10008421878335836436, 9952321233871043669, 12872379155893703237, 7266552182027361169, 1266036355585216796, 2621902104176569009, 8791105532651972211, 6351975813451610601, 11821139808280113179, 11281913023757770338, 3277134497757048289, 13219080767636598429, 10181825490691565485, 2766637533497216499, 5527857141123489970, 8463471033597650592, 16863468430858262436, 4521466714741486225, 2112404415880305855, 6776665887355979100, 4283028800297139078, 17448147405455891940, 2672696094870261596, 654959311657763753, 15404879372302137522, 458610335793450516, 11708893791522292939, 3358534066525179769, 3358534066525179769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2750797734633655770, 2196298446069803466, 11838988982732965160, 8838579915162662604, 9645282237960382599, 1452793205233705375, 13043673489495767039, 6914761656747274754, 6462510494810546740, 11542677354694298953, 10084597289196425304, 6187212959913925984, 13253251914245887991, 13426752715944801915, 14540441677731288899, 1687158516877835494, 5237558114922547298, 17657306689192164966, 13600283758187380877, 498396070609474559, 2816716335908718574, 2201796413416910298, 9217066277303434638, 1438935019962455534, 18328852556584031255, 6915155572789963327, 10360494843504659614, 14112471018395370124, 4296220331020841697, 13555983847490106392, 10974207239020571710, 4762963524641036906, 0, 401642074298403, 6959791354043610236, 1843180796447728437, 9556362158826632350, 3220022195391792741, 6012411438022691140, 4309223969498591447, 7596903557041777533, 18393682838284953355, 3973832102121938954, 12190997158276486897, 15972235844585587264, 14899488070931524727, 17337514399056563302, 10500237188498665928, 18440452962210035879, 7481614450647261413, 65300580117832193, 14713590013611289205, 13086268929321267306, 17247769089209001713, 11421561962034654967, 4561010052951998759, 9562817622798343284, 3062054327467638127, 6016566887476098647, 5513989129644936969, 13097123292793361360, 17631302057213141907, 8382824402074565601, 16136160484984138575, 0, 92, 1552825087809033479, 9447273069996733529, 6419011263238967677, 6692866018192235946, 7156821319138712192, 979552938298149105, 16414416705576227412, 12277732972115645845, 16390940174922802980, 3487294253425873238, 6189899981788830548, 5202139200141296429, 10911204476854742317, 1721085402837891517, 8352902245765240122, 11853370831480580617, 12549880386282601398, 182861448076475833, 907162566851125145, 5998456693193037487, 2770786935363726809, 7400519332304830077, 359467329647437035, 1312252687673992186, 7328500979632536073, 8813774793495812162, 6984573596316331699, 14977076517134741377, 16254221298013000537, 5001523311460849924, 0, 8, 6104172690014223231, 3119855977255645286, 2700229040680838768, 4228220371303630837, 12976691418076017877, 15391527008624099592, 15522155400452634037, 17655908650961725957, 5157987610310047621, 13664486701019622043, 12908699189677656287, 14840926611057477527, 6092037682822283700, 15181448373122947619, 2083722204849270202, 1893419523737526751, 11329911669537538562, 12331432886354737271, 9636585409664050258, 5131588463040403759, 10248116973079783912, 2136665268102207704, 17448444978654544666, 11945433761064128885, 4462464721020457233, 17579935132869425842, 7098417589530391109, 15343623253038912080, 7762335122892638892, 10310226363807226654, 9365253138981608257, 9365253138981608257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 3222968251772292059, 4659330917232488313, 18368728739119945660, 6368972875636062959, 4707200061081251786, 7837376579209547587, 12248323053399392025, 13659284260102405271, 3268373156044973502, 1283746275992984836, 6075821593933813225, 16314284187241223265, 5494222736271176220, 13120146179040509426, 11410636383049345368, 825507757879255520, 10747531529265802304, 7673382754837099366, 15156055697659221375, 1718675228113159248, 4201859160733141037, 5300265117402310501, 7272994976566716580, 14871183427463612333, 3498894361287896100, 15218257307939313170, 1772539751900737248, 1975418926721182099, 12089371041955731221, 15888265955091463133, 16091581530351759692, 0, 2008210371491335, 13098960849839742034, 9449621519891201049, 2814310786559014444, 5305842545683321494, 4969236906288915907, 1243780951433164967, 6167749875842285147, 9490220981060631819, 3665259354621890034, 7437125179920904126, 12655958476488865400, 17935537000594940941, 91614862745339577, 1869550524566103495, 17384150297165671545, 1154605885284628266, 8665046436862728398, 6741156569294553317, 9490927005547387767, 8947900188307771735, 13752550215202657538, 7714188412126691626, 12225947487197390724, 13509943592829854189, 7120740401378484294, 6789669275155346195, 2929601484581949152, 1077164174037184778, 7253613682453412944, 12957959164911169922, 0, 1288, 2467314028170731200, 16601393295490334589, 410862426300963016, 6715125970066025284, 668903147624506142, 12095483928402104962, 1613631742115437617, 3060858350461432106, 14519578477424544472, 1246482959663576649, 10151539857350203993, 14524407161343324874, 10767371226180010877, 8883572370406050272, 7634465548311616828, 13778778399918900014, 17362186831679047435, 7577173806777510989, 14020627064222792913, 15976021831713665696, 7948772943735475729, 1437804116009572564, 6007143667192036573, 16589616747039104611, 12022435130037250391, 11127010123944496312, 433966021407007016, 17962467459011056432, 2310073430536633551, 16159283724457640221, 0, 40, 1560947813056021755, 6935064976442414148, 9999441144135002932, 10354700837586583171, 6040781227937012106, 4698117391978117444, 4735711626023545756, 11217844833019453026, 3130590714605394722, 2809204122464618686, 10935232469327759448, 18335893537613898174, 10868401885487323501, 15799177281014635734, 17187052562019754838, 4027411046406207040, 11879721967266924677, 3613659344771632047, 1846469577394958972, 14668357323201408029, 14939045883642543835, 2885718226990976376, 4969257074069595075, 10824274197210729467, 13212275138420405274, 10563919532671437398, 12234598862193668129, 14653607410806008848, 2498958194485300229, 3512215170452429648, 4243893038989355703, 4243893038989355703, 2147483648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 16746387937695142490, 9155393387906219784, 13386503743719781199, 2643395754600898300, 8948310776749535742, 8784880786966306238, 1110225852810378745, 17164574292834012429, 5226876132626050588, 13521863983694335346, 1499535172174489924, 16371752154949209907, 1465531721291669927, 16357468590797302295, 15603236927467279886, 750159427723404852, 2426484208226890587, 18279268404534332738, 4383807752256753313, 14980454155356662645, 5638763115145836005, 309850158776234346, 17414628586841602406, 4488055553392002721, 6099746236569370915, 9391735730020210762, 6993986830519314663, 2701106116508976741, 1898134322103701335, 12702609090402714686, 16079373865472459546, 0, 1606568297193092, 17457628753812655267, 5096693283465186518, 12947605480618213072, 13490514080936595140, 16186587491946121120, 10245245868334896235, 6026705707665599719, 9827345407768028181, 2812471843237874845, 12940670116574659651, 2714930976118111710, 11931084046533097040, 5957825878304116293, 4815270995456833861, 3281433232253188744, 1527514044633931889, 3155608937877823823, 496495357063373704, 12643114535206930756, 2926290280590787897, 4481685646324082958, 2913086696180341350, 4929647997916999987, 9053067786296036128, 12860916533743270733, 13426707234447106813, 15934882759672330788, 2173747106952139997, 5260381980138555939, 9238536158694879401, 92, 1104, 16216562119055243322, 9113898857319116772, 17132700957014282816, 16961354324299843537, 8958491673128745523, 6084177919166198949, 4492424574001173259, 2065688581293602436, 433616324011879356, 12151404659680738203, 3770309554737682698, 5300222935868897680, 2845921321939758123, 9028103117859423722, 9867617548439033893, 12400304789414303503, 14859150043279622231, 5014308339038672362, 6600097648382112815, 1659304607975522629, 1739219815660099577, 10359847956037447171, 11590294256574231363, 3647107356246152267, 15247865541233938330, 14069295620220509130, 2869001919576405519, 17417648807118850139, 14370760106653398402, 11118838785729522730, 0, 32, 9302012295643728416, 424328237663665361, 17748121622218558811, 6681769685034042719, 10907932526941371789, 14996603190997478665, 13982878080104642188, 3336783822228111865, 7403528606603453519, 7309352233404946366, 11509327586943808925, 6803943428138467537, 12870260590513220077, 3798257798625653324, 15652192157997003684, 8260391000410661595, 9099897743400681933, 16067207775248165408, 7640841583197908852, 16739199083410292994, 1998275509994500625, 10688417071827877337, 16160081185811655577, 2725954513011781037, 3040692668058239811, 15097072321276989567, 7813293313258815644, 15261763399945716285, 2258772319189190202, 6756061023037720295, 2372900269115514267, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 13227498393864040945, 3236590870033651606, 18316422071602565784, 15701603594857309722, 5947972608122843521, 13523535320233199342, 3753934081047057169, 10936885931162702722, 5866281172578018338, 5131575035018446451, 9418660414070260899, 17291665633130001335, 16478272933178360032, 12493684045311157256, 12080786119242190524, 9808426190668729634, 10916182427754190208, 7949752104566735434, 16437679885653014489, 2197742477585333602, 11623912681484131137, 4866858089907087491, 7615091160766850619, 6639738661085122604, 6056593816756490758, 18265959195035569409, 439634521044110926, 12264490131121739608, 16106017656155713552, 1042562102193278240, 16047641734485800692, 0, 401642074298523, 10076989882539553734, 13617634258944637452, 11664888937794835322, 6832371865971954132, 7435465380685145582, 8856983143236954540, 15647394574465449881, 5004639611979401749, 16333513927375132208, 11586223746088007538, 17258599442845821467, 10089347514894229223, 8927362828162004403, 1274761678102044944, 13987176689734561031, 968318691601385838, 17920302096119022338, 18172419653743826470, 5238866342343116613, 4715585282245523496, 6782917713521523376, 845034972551066538, 8264516316211712068, 4395820162956710988, 17367170950581948054, 11715439359473390301, 4924405821869545305, 1674381281184830519, 4077397353846458666, 16570851802495678006, 0, 552, 18364539353432252959, 1551875687645078236, 5908552039479525180, 13623916550628200923, 4699969004069575100, 11630278164657820063, 5891234840048028912, 654092830709235842, 2412613677542740798, 9533885383398026397, 3477862308755521454, 3931695716927095485, 10207454088372242899, 17803175762377303845, 11036943293777954420, 16245042535546460743, 17267071485922545111, 3154671719447430275, 2667361456561557318, 8203075576459419142, 12382743643920078317, 9185031367250188962, 2354486840330493509, 13031927341928448984, 6462695849105922235, 17450486765305121779, 4895010392763653973, 14926331475286732296, 13033597008762597331, 7576593531686797042, 0, 8, 7519454690376123692, 7627104070861575574, 17604686071836489236, 14277148259130460564, 8312218486680706135, 8395439642754559152, 17307771294890409643, 9298206908486537717, 3027629924013931359, 2933551330348935458, 1450485994192951386, 8585052201707081835, 10624425952582111111, 16773523322999621677, 13337622149287916761, 17874287708894504070, 14164897610403484003, 11216401648549709020, 911970190394256131, 3202853507803349037, 14616902435260689479, 14924823153427050614, 4881022900440414264, 9723366934152472594, 16335725686098559697, 8087897843744270993, 11437013713086863200, 7627258546495067733, 18044191572661655945, 16490279521751489469, 1, 9, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 6170161675250864501, 11961896515966597756, 4654018437841213862, 5272790938970678408, 4281766794113009188, 11245796702384795879, 4856060583384283422, 17886680608631893125, 9261060821859854748, 14424996735749284440, 13746660795296557163, 4823043606851802454, 14938663460886908360, 7270036416424823086, 9523212457335079367, 9139548031431133148, 208295785334160234, 15753650123272304050, 10546365909049493247, 13322595239551652280, 13989288587795691202, 3906006690782976298, 17297950766482640011, 13938287014198326904, 16696817761315412012, 13953265341705633702, 4268569962168779654, 14232230927042798671, 6488214721912194407, 10956084748384074170, 17343413733132688543, 0, 401642074298403, 9851586117636382793, 7414079509745519565, 10414894202973226643, 11403399710197601656, 10230759118395809329, 4887466173119518776, 12376579030877442488, 15222686873173021915, 11343634646223977946, 15054143113295762432, 8578483304162845495, 8187399805941604842, 17460975957431844228, 12368453570037757143, 4715095521846408852, 10685847052710927197, 5160934306801665605, 12877482432527277885, 1026289052488784895, 12183816968946827507, 954239020314042893, 1899038343674936222, 3582199871763692750, 10141562795735590523, 5883730844910027408, 10313342961711791200, 10308552102917724507, 1101239144209002141, 16732112788727027442, 6132059608254040410, 0, 184, 9694623828077467233, 3675008886325466594, 9937899669773170043, 7849591422987652597, 15287367360056796639, 1702914822524674176, 10568464651116235631, 18376268405209394446, 17468515571505079540, 13349382737895871506, 10773310703441442177, 77415128127038826, 10067581411407423596, 2132439228676468850, 16446262234583425617, 15913203609357376990, 4328537832216989268, 14309894248163942626, 17219034350459931223, 16386215198201980227, 7529941270179488242, 3713349402354236945, 13565147716704204129, 3968526144162291548, 10616453538138359448, 16438784497837992964, 3058320693955246873, 4965950384458944745, 16872816814243270280, 6712929990112816841, 0, 8, 17781582622500481192, 12847902632736061277, 12021499907877242591, 16751519355106661703, 9062087890172095618, 3834953580385337540, 2969703856153678454, 11604562295556139307, 10447912046373566534, 12987934619706800857, 12352596220492768030, 14816150974992525275, 2172600571554701126, 18086375044546604023, 16313093185369681775, 14997664071320688070, 347950016295486690, 9206182676441692601, 3566552483989599402, 4925983231752336365, 1728701557101400581, 7087476601458867917, 9759961360999781392, 12569092891286895547, 14206292953735333262, 16422952955631166803, 6294107725304445883, 9537940691512987143, 15535806100011306333, 7080716573279759555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4099276459869907627, 11351842504255128813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(18) }, program_info: ProgramInfo { program_hash: Word([4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 19, range_trace_len: 49, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 3, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 0, 0, 0, 0, 0, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 3137828705454, 1, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 1, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 1, 1, 1, 0, 1, 0, 24514286761, 1, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 40, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 2, 1, 4, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 191517865, 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 1496233, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 9365253138981608257, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 11689, 1, 0, 0, 0, 0, 0, 0, 1, 2, 4, 0, 0, 0, 0, 0, 4243893038989355703, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 91, 1, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 2372900269115514267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 7, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 11, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 12, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 13, 13, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 5, 0, 1, 1, 0, 1, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 13, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 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, 16, 0, 0, 15, 13, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 7, 0, 0, 0, 0, 1, 1, 1, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 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, 16, 0, 0, 16, 13, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 5, 0, 0, 0, 0, 1, 1, 1, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 0, 0, 1, 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, 16, 0, 0, 17, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 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, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 11509025001394472292, 1657723241998675022, 7525141456947324339, 4762963524641036906, 16091581530351759692, 16079373865472459546, 16047641734485800692, 17343413733132688543, 0, 0, 1, 0, 0, 1, 1, 0, 0, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 7288090792972058500, 7008881577152522467, 7526556702499462773, 16136160484984138575, 12957959164911169922, 9238536158694879401, 16570851802495678006, 6132059608254040410, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 15666451408857108222, 5229864730287063918, 4435027266040030689, 5001523311460849924, 16159283724457640221, 11118838785729522730, 7576593531686797042, 6712929990112816841, 0, 0, 1, 0, 0, 1, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 92, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13398731741387911383, 10446875550887438149, 5572533910279649175, 13491880295779941671, 8698112979694512183, 126724644436205205, 12147025678885387063, 1552825087809033479, 2467314028170731200, 16216562119055243322, 18364539353432252959, 9694623828077467233, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1702596310854469483, 7588826506897155585, 2665502751151845058, 17558274388625518928, 1484832724912073400, 10241199256484865800, 1963067308825972547, 9447273069996733529, 16601393295490334589, 9113898857319116772, 1551875687645078236, 3675008886325466594, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5960531672215414966, 16730914921892092280, 3420041171743926975, 2846824553470173952, 17559905242927504135, 11710755472728257079, 4225984201120753953, 6419011263238967677, 410862426300963016, 17132700957014282816, 5908552039479525180, 9937899669773170043, 1, 0, 0, 0, 1, 0, 2018420705353333259, 9229172344109022227, 14345475894589655224, 14152498107176274636, 12511176149634059683, 13105841064724313047, 3523509076537079172, 8301224421374966792, 9814439449693896294, 1196744323913827820, 6692866018192235946, 6715125970066025284, 16961354324299843537, 13623916550628200923, 7849591422987652597, 1, 0, 0, 0, 1, 0, 15554140634930940730, 12149993956067977962, 12691178410278042977, 5800650255543088287, 12242421290212925246, 8706919134091371207, 9746772683078209435, 11307131702448115253, 12969767250590673327, 6686048917052134288, 16414416705576227412, 1613631742115437617, 4492424574001173259, 5891234840048028912, 10568464651116235631, 1, 0, 0, 0, 1, 0, 13619523926946942997, 13932701015699199040, 16282203144892365836, 288495594474105189, 2659747577123257435, 468662522013222574, 4777591649493566963, 4549622233314763492, 3609195066294253037, 15701263684091820063, 3487294253425873238, 1246482959663576649, 12151404659680738203, 9533885383398026397, 13349382737895871506, 1, 0, 0, 0, 1, 0, 15226961741359169238, 9668238623772378075, 18406869698288958124, 10304697226126818963, 17510270622758876933, 5208953037158023510, 13973483607215960244, 14889292305938541714, 17903436875856263069, 10456077510396891682, 10911204476854742317, 10767371226180010877, 2845921321939758123, 10207454088372242899, 10067581411407423596, 1, 0, 0, 0, 1, 0, 11007944782899320208, 9688656475445036579, 11072586067494939844, 7796778119718125747, 17430549031516796763, 17715598857116570054, 15890473733699877306, 11140388332008156040, 15437904745147545753, 9698983999555494854, 11853370831480580617, 13778778399918900014, 12400304789414303503, 16245042535546460743, 15913203609357376990, 1, 0, 0, 0, 1, 0, 15735266059006798772, 3801815209619718647, 4149362138393037094, 11043847812690714922, 15750016999752216538, 3526946062060894178, 17542926168179991242, 13488989169427894096, 1711823131760196898, 7279056890420718668, 907162566851125145, 14020627064222792913, 6600097648382112815, 2667361456561557318, 17219034350459931223, 1, 0, 0, 0, 1, 0, 2879545791821313481, 1259493953867425253, 11021794342469225424, 16409243384953073963, 8823739942223974350, 1348240088196356067, 8826324103843911331, 12121966587219528787, 8947445239291587989, 794393058555157904, 7400519332304830077, 1437804116009572564, 10359847956037447171, 9185031367250188962, 3713349402354236945, 1, 0, 0, 0, 1, 0, 11365853094296287088, 0, 0, 9109780042108713794, 2025584296720659827, 9279746140911612054, 3536220024494542760, 8800758533265494982, 13269571463782090254, 12786208149678159110, 7328500979632536073, 12022435130037250391, 15247865541233938330, 6462695849105922235, 10616453538138359448, 1, 0, 0, 0, 1, 0, 0, 0, 0, 15306362721670767113, 3678646409353890898, 3233112695116768266, 294092485488322279, 6765154775891776468, 17267661857179267882, 10374412076721466090, 6984573596316331699, 433966021407007016, 2869001919576405519, 4895010392763653973, 3058320693955246873, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2730832614768234730, 10191942812097658700, 1858231082388626584, 12149225804903469645, 15354276103682076009, 10036416896754782473, 10797782388389379392, 14977076517134741377, 17962467459011056432, 17417648807118850139, 14926331475286732296, 4965950384458944745, 1, 0, 0, 0, 1, 0, 0, 0, 0, 479016032615721743, 1453528547827258310, 17742257866254572336, 3036839951080750932, 7645122244202370271, 18012966148946012188, 14917361677919134410, 16254221298013000537, 2310073430536633551, 14370760106653398402, 13033597008762597331, 16872816814243270280, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 15666451408857108222, 5229864730287063918, 4435027266040030689, 5001523311460849924, 16159283724457640221, 11118838785729522730, 7576593531686797042, 6712929990112816841, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16253482711025978099, 5751576643258238090, 7110029021941723513, 3208043314804619251, 18130890293586930078, 10452764368937945515, 9114363797835460134, 6104172690014223231, 1560947813056021755, 9302012295643728416, 7519454690376123692, 17781582622500481192, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16690839578921925157, 7830268710878889486, 10115409991715085575, 6920597847411412414, 18252951749527557342, 6969997263492352670, 5446076396314160376, 3119855977255645286, 6935064976442414148, 424328237663665361, 7627104070861575574, 12847902632736061277, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11755424915479552417, 4868320831660690795, 11428668827299215140, 17985619796195836408, 4460903658820341507, 15570786589164252178, 12863008906537145423, 2700229040680838768, 9999441144135002932, 17748121622218558811, 17604686071836489236, 12021499907877242591, 1, 0, 0, 0, 1, 0, 4447686994046778179, 11785000236654418865, 10679155400143926564, 17934377671577204140, 7042762868047858013, 4015039023438705588, 11907191178709112742, 859505755654562117, 16136993048454358354, 10008421878335836436, 4228220371303630837, 10354700837586583171, 6681769685034042719, 14277148259130460564, 16751519355106661703, 1, 0, 0, 0, 1, 0, 217106376514171653, 11707313943908545641, 15092932467239161061, 11049594146888643723, 7267371538363991280, 8421627027326523148, 9466912758182965715, 11174658189737631113, 12296464969648251345, 7266552182027361169, 15522155400452634037, 4735711626023545756, 13982878080104642188, 17307771294890409643, 2969703856153678454, 1, 0, 0, 0, 1, 0, 11044550050665632476, 8958367422149199561, 16497379967830959424, 9105126057127804171, 13427183447069512151, 15171283498151438808, 1953587265841775225, 9636744945302995714, 18126939303114916528, 8791105532651972211, 13664486701019622043, 2809204122464618686, 7309352233404946366, 2933551330348935458, 12987934619706800857, 1, 0, 0, 0, 1, 0, 1877907417051268915, 6151364593092129113, 13049072304454003157, 14569284676797348998, 6517696895688418945, 14662750186533371679, 16069841829669607101, 1490539036394497080, 9033882039108268313, 11281913023757770338, 6092037682822283700, 10868401885487323501, 12870260590513220077, 10624425952582111111, 2172600571554701126, 1, 0, 0, 0, 1, 0, 10197860193367132813, 18317591232122268101, 11864893253666570624, 2835737623710330612, 12960707821770488929, 11079168775731474830, 1560700914733041660, 7731471377060742735, 6301009824137139871, 10181825490691565485, 1893419523737526751, 4027411046406207040, 8260391000410661595, 17874287708894504070, 14997664071320688070, 1, 0, 0, 0, 1, 0, 7903888723576875237, 18382523577454102436, 13167437966520740716, 15482419984058848245, 7634329044629047826, 7042468264080735391, 6200990949184863170, 13733877647296302634, 10330363517752279308, 8463471033597650592, 9636585409664050258, 1846469577394958972, 7640841583197908852, 911970190394256131, 3566552483989599402, 1, 0, 0, 0, 1, 0, 2186301169863059887, 6122215293275160143, 16696916221087249943, 5297995970636059087, 6007758954686348362, 4655654314239637986, 1006207264024395366, 15572658687280648106, 7189713532379018536, 2112404415880305855, 2136665268102207704, 2885718226990976376, 10688417071827877337, 14924823153427050614, 7087476601458867917, 1, 0, 0, 0, 1, 0, 4350099661540135647, 0, 0, 770728251595531533, 434120282701603474, 899748567092010447, 14918729158665343812, 16808111015808513609, 7424874700566577356, 17448147405455891940, 4462464721020457233, 13212275138420405274, 3040692668058239811, 16335725686098559697, 14206292953735333262, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1347942901513492691, 5581285869985960561, 15417366235984526759, 380737719356524599, 12243901590027926887, 7052270251739242825, 654959311657763753, 7098417589530391109, 12234598862193668129, 7813293313258815644, 11437013713086863200, 6294107725304445883, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12086966446141742548, 6581368197537384623, 3331301994171189600, 12870561906904032245, 6559275936659510680, 17586339544079318164, 15404879372302137522, 15343623253038912080, 14653607410806008848, 15261763399945716285, 7627258546495067733, 9537940691512987143, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10239457018222882008, 17661012293298952642, 15814677761660135474, 6984680585936259437, 17224785255700525855, 14071176523136369481, 458610335793450516, 7762335122892638892, 2498958194485300229, 2258772319189190202, 18044191572661655945, 15535806100011306333, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1390310476158884261, 12282546735285148319, 11708893791522292939, 10310226363807226654, 3512215170452429648, 6756061023037720295, 16490279521751489469, 7080716573279759555, 1, 0, 0, 0, 1, 0, 0, 0, 0, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14280802901810915241, 1835177830541154044, 10010111294767420802, 2549897079792572603, 16850544756775285522, 1076973899277284702, 16072847024087248681, 6959791354043610236, 13098960849839742034, 17457628753812655267, 10076989882539553734, 9851586117636382793, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7925919485060883878, 826263100281998566, 16943179644353820008, 5670682422759337153, 652387120995254672, 14086579741019377519, 1047399340937520223, 1843180796447728437, 9449621519891201049, 5096693283465186518, 13617634258944637452, 7414079509745519565, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9094034340168608638, 9612296353153372169, 8996122336997085030, 4249626004536644548, 4188956971131276775, 3818478693739735842, 13840617071834531990, 9556362158826632350, 2814310786559014444, 12947605480618213072, 11664888937794835322, 10414894202973226643, 1, 0, 0, 0, 1, 0, 206637164063268726, 10092260866618400225, 13038545162971821924, 6650811367268781560, 2509054224639990472, 17350347680949584060, 9138873913574622404, 18389965100329173053, 5593621083784091164, 13835424809772757395, 3220022195391792741, 5305842545683321494, 13490514080936595140, 6832371865971954132, 11403399710197601656, 1, 0, 0, 0, 1, 0, 13042021488072180943, 17665366762968375743, 14514089290800305099, 13091389828882674218, 4611398810491526224, 81685142906752346, 2149720931386886989, 11347427093515448316, 968047239546776409, 11208516754282785707, 7596903557041777533, 6167749875842285147, 6026705707665599719, 15647394574465449881, 12376579030877442488, 1, 0, 0, 0, 1, 0, 7479226098762365380, 20647088475708265, 14234714302482719672, 680445747454648704, 10159688738464070440, 9792116363139842106, 7330871518527332444, 4089976927111145333, 15053368214221814937, 13990233438164144322, 12190997158276486897, 7437125179920904126, 12940670116574659651, 11586223746088007538, 15054143113295762432, 1, 0, 0, 0, 1, 0, 13347963917530181895, 10889708507292659338, 4175833649164370394, 5233297770622824375, 745298233749984501, 1134592111928495305, 10789212522972025785, 1655996231185402724, 15389814481683087606, 16658833476738371029, 17337514399056563302, 91614862745339577, 5957825878304116293, 8927362828162004403, 17460975957431844228, 1, 0, 0, 0, 1, 0, 6929809241430544204, 6641711964892684437, 12124997350307806549, 9867160564810673994, 17942681985602265676, 4841731940180862534, 5554647570062987979, 16778373777892540383, 7660052382355122994, 492549161703070590, 7481614450647261413, 1154605885284628266, 1527514044633931889, 968318691601385838, 10685847052710927197, 1, 0, 0, 0, 1, 0, 17634176407370476921, 7739526124990237795, 13838384228721941065, 10263347723858682786, 10152063658776528390, 2487841274273895537, 14002884382934858252, 16481019216530994753, 737940994724202658, 13983563295828088546, 13086268929321267306, 9490927005547387767, 12643114535206930756, 5238866342343116613, 1026289052488784895, 1, 0, 0, 0, 1, 0, 6697396169967230934, 18287805115840952516, 14443334479498508931, 9643915442530902318, 5274902253855511588, 8629130978595053833, 13067519389098510351, 6485826671956173957, 13211005290810103003, 11078906302351818677, 4561010052951998759, 7714188412126691626, 2913086696180341350, 845034972551066538, 1899038343674936222, 1, 0, 0, 0, 1, 0, 15116382065750335012, 0, 0, 887493237489321299, 6033538369482377655, 16798226782780142546, 16399505509770566014, 12077164016468113545, 12296311093518063031, 2334817027508375898, 6016566887476098647, 7120740401378484294, 12860916533743270733, 17367170950581948054, 5883730844910027408, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13483864438078018308, 3570589185097006252, 9731250716956559616, 11950037765875050974, 4878983963291132913, 5554567664494429423, 6515674137823977144, 13097123292793361360, 2929601484581949152, 15934882759672330788, 4924405821869545305, 10308552102917724507, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8159241411748295729, 4587292818271677447, 12286920896461242142, 12195903600484928258, 1618531819557712390, 12302163852964786956, 393947096345211186, 17631302057213141907, 1077164174037184778, 2173747106952139997, 1674381281184830519, 1101239144209002141, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10385528691577928985, 16771298688176486904, 1919835269886444210, 17694444981837938563, 565132887411573955, 14310991091785572129, 1951192747307666741, 8382824402074565601, 7253613682453412944, 5260381980138555939, 4077397353846458666, 16732112788727027442, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 7288090792972058500, 7008881577152522467, 7526556702499462773, 16136160484984138575, 12957959164911169922, 9238536158694879401, 16570851802495678006, 6132059608254040410, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 14319792288905293245, 11465345153771181037, 16104169334207009019, 2750797734633655770, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4194228403373198226, 17446294671039685780, 16018419181163655201, 16046055491183908407, 3149648302915651279, 5535026374122183926, 638510963943763558, 11838988982732965160, 4659330917232488313, 9155393387906219784, 3236590870033651606, 11961896515966597756, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4321424756204952178, 12180657588796280274, 16144413208110066321, 6937908670684349781, 2183945468601797792, 15092496102668051355, 18152457079207292292, 8838579915162662604, 18368728739119945660, 13386503743719781199, 18316422071602565784, 4654018437841213862, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17106991433953495229, 3901851127268644692, 12517012706582615280, 9428962583778419369, 13296390406171247483, 257473274985355223, 13178378367745074892, 9645282237960382599, 6368972875636062959, 2643395754600898300, 15701603594857309722, 5272790938970678408, 1, 0, 0, 0, 1, 0, 8354096936197882314, 12164220337553977958, 17378238272422563267, 480007043786623808, 15132938321031306327, 17466716576309862393, 12671344758477488595, 1854573623301018325, 10260436313437728882, 13292769663331639140, 1452793205233705375, 4707200061081251786, 8948310776749535742, 5947972608122843521, 4281766794113009188, 1, 0, 0, 0, 1, 0, 6138730842224758627, 11686086623819538808, 14590719856456710457, 7837641036032671415, 12010127700996563076, 15879773433331271008, 2133167353214657976, 4773455775437745378, 10299240179448618610, 6045651321104574873, 6462510494810546740, 13659284260102405271, 17164574292834012429, 10936885931162702722, 17886680608631893125, 1, 0, 0, 0, 1, 0, 3162794119795435989, 4562834728889875846, 6107962147992612292, 8465759122953264103, 1665683881724788425, 17940570471380392799, 3223264940814324611, 332137947454970287, 8209352310311089013, 265277838027200178, 6187212959913925984, 6075821593933813225, 1499535172174489924, 9418660414070260899, 13746660795296557163, 1, 0, 0, 0, 1, 0, 12162889168802937247, 15401019179307093351, 9535864432215440062, 9771451080159159411, 1484367395490874035, 4502835184975000914, 11663083613788432971, 7803450627715630286, 5035373507226681389, 6225168341521517925, 14540441677731288899, 13120146179040509426, 16357468590797302295, 12493684045311157256, 7270036416424823086, 1, 0, 0, 0, 1, 0, 11474756587763645750, 12425880873394014153, 6096335841451385157, 17765926817646991510, 16052656468702535281, 4179930870000296671, 11139084033219732849, 4739616627721376242, 2504937998242193140, 3231597075356238257, 17657306689192164966, 10747531529265802304, 2426484208226890587, 10916182427754190208, 208295785334160234, 1, 0, 0, 0, 1, 0, 16765618494244376401, 5081092756681378539, 13872457506768069988, 4529776878769021619, 169695422976636841, 9233870580127604406, 15207411620676648511, 16719606593630884665, 11029884787275710886, 5442307944523583224, 2816716335908718574, 1718675228113159248, 14980454155356662645, 2197742477585333602, 13322595239551652280, 1, 0, 0, 0, 1, 0, 13714635581333797590, 1976182429811709209, 5257242985435580561, 14057252888063062893, 8215766650263520356, 9037700404196650899, 10815732145433955496, 6575555704765488965, 7946539915965721335, 17774723700903466966, 1438935019962455534, 7272994976566716580, 17414628586841602406, 7615091160766850619, 17297950766482640011, 1, 0, 0, 0, 1, 0, 5178157714855210142, 0, 0, 9776318485951152693, 12890305973496102809, 15372246715962319753, 4407166322243232537, 8211250723004787137, 16732929992769459335, 5078948249831860209, 10360494843504659614, 15218257307939313170, 9391735730020210762, 18265959195035569409, 13953265341705633702, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14580812564900766592, 15861640058126249653, 14882250288085472215, 2674423901749705077, 17915715126849699543, 7467959617957012266, 11754602214149170613, 4296220331020841697, 1975418926721182099, 2701106116508976741, 12264490131121739608, 14232230927042798671, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6012095218278392893, 14517213901488835116, 10288285656672707851, 3504222453682520691, 12433676256235881077, 9462884495447906259, 1831143805055270726, 13555983847490106392, 12089371041955731221, 1898134322103701335, 16106017656155713552, 6488214721912194407, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12583880807825187559, 6582109139928846076, 11046557109431487119, 2024557484059292221, 7933147088254086263, 17277989807306885144, 14579426980777214583, 10974207239020571710, 15888265955091463133, 12702609090402714686, 1042562102193278240, 10956084748384074170, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240, 11509025001394472292, 1657723241998675022, 7525141456947324339, 4762963524641036906, 16091581530351759692, 16079373865472459546, 16047641734485800692, 17343413733132688543, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 40, 0, 0, 3, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 1, 0, 1, 1, 10, 0, 0, 0, 1, 0, 1, 1, 0, 40, 0, 0, 12, 3358534066525179769, 9365253138981608257, 4243893038989355703, 2372900269115514267, 9, 0, 4099276459869907627, 1, 10, 0, 0, 0, 1, 0, 0, 0, 13, 4294967292, 0, 1, 12, 0, 0, 2147483648, 0, 13, 0, 11351842504255128813, 0, 65535, 16383, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 1, 2, 1, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 7, 8, 9, 10, 13, 2200, 4387, 6574, 8761, 10948, 13135, 15322, 16051, 16294, 16375, 16378, 16381, 16382, 16383, 18570, 20757, 22944, 25131, 27318, 29505, 31692, 33879, 36066, 38253, 40440, 42627, 44814, 47001, 49188, 51375, 53562, 55749, 57936, 60123, 62310, 64497, 65226, 65469, 65496, 65523, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(18) }, program_info: ProgramInfo { program_hash: Word([4192437018821097220, 9480578168622006864, 4891889892170146481, 11712807151087072240]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 19, range_trace_len: 51, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 3, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_26.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_26.snap index 96623ed227..9ef050bba1 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_26.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_26.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 1, 65, 65, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [665741763369239996, 5296, 41, 0, 665741763369239996, 1032, 8, 0, 7458506668679174706, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676, 7894050562420362676], [5831108162926480783, 0, 1, 1, 5831108162926480783, 0, 1, 1, 18375473735916206629, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271, 4416250439475247271], [7330889791923421278, 0, 0, 0, 7330889791923421278, 0, 0, 0, 2105717247508690050, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565, 2326332951934988565], [13218130135561237014, 0, 0, 0, 13218130135561237014, 0, 0, 0, 1679902783560062568, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905, 9381983878411686905], [7458506668679174706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [18375473735916206629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [665741763369239996, 4841630085998491759, 6465560042516376876, 16331008790693949850, 6970683036804102439, 8497009269728596384, 1748714548692072347, 13048694814734168842, 2851620155234231146, 12440189078605506740, 7150883378538807680, 15495282497840653987, 17768685484250522227, 2793475893411298471, 14225437221510868328, 2199342294693565806, 6757917767565409963, 8625575291436195558, 9995878327716902758, 13201046879819468564, 585466765571734889, 137907905271081689, 6716945316985023829, 15397869777828729446, 8165247034144091221, 14277934820647399743, 14219322642025824233, 17615631325693698036, 2441238758278104147, 2775370016004740491, 14369612123276038546, 7894050562420362676, 5296, 52960, 6811813611500970866, 12330218901740233931, 16287800225917557614, 2390658038828763199, 4670881323897574211, 15935136064817789611, 2699367049541735206, 5505690989019187676, 4740977976888162022, 5734803687955113279, 14716704723144357988, 4469212567425053522, 15617193812494172197, 4848896952878415343, 18385001813020718595, 3406927099241203725, 6500845817907766790, 14130590127555482700, 10343975768128176185, 15693873175844605389, 2059720903132940981, 3757345954094976880, 3089069334759629752, 18141223932492835937, 11387279664761561894, 5402048984901238600, 12664138717389652380, 8299034149894841811, 4141583402420192864, 665741763369239996, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5831108162926480783, 2015344066519517192, 10751299519219102331, 3856188963254020539, 4769583868215503893, 244163607749525539, 2275307600658358093, 14687360957082158138, 1446211823843582468, 9065094748168193518, 13172417511285944435, 6283226934869114102, 17912900233620106299, 8537437460267509495, 14429029577374864048, 12296947853479463704, 782626069616211185, 8418933870535928003, 8486366749806429302, 5183416470700366595, 8007220776657207831, 17387803153141845177, 11798268456173906310, 2039526413662718418, 1969662736637306049, 3736305836880398319, 16894861457913198121, 7547361473669724663, 553494724036872290, 13690090054816609773, 10710009389473682712, 4416250439475247271, 0, 42368, 9860311344216082483, 4356844177334189800, 8724150062868049447, 3846911055059526201, 16861225296757755735, 16925961143355054643, 7763338432894318220, 7504506723642096670, 11045006668578082721, 15092595329879644577, 4298948569114582870, 17810272068739440989, 13969944955380272714, 12356982018953263244, 16520418754635432271, 4689628285093180625, 7190852124445770478, 13072354659666011192, 1524422576558323017, 4274963317195893198, 12684756825761097033, 3511571172448102031, 823386573204270152, 9615020079928624381, 16119779393022010645, 17295023900181003317, 16373019178487693626, 13423474518210064130, 10379152206886126257, 5831108162926480783, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7330889791923421278, 10618804531988892326, 6829597264991376521, 7276367259939934310, 4372128272177755375, 13867864482574853380, 11515384977073734030, 2326647313830366386, 13816377619801393141, 12980893881100963179, 10932000450943930101, 8130570750653425723, 5357774255557548944, 7155850970105010704, 14398424816766135464, 17567990292669453433, 3968215852282073691, 14805102781885121051, 4151289254235444823, 18353166840871736216, 10039237550878760371, 13168620354442609447, 6577939425615831706, 9059653401043810135, 6948526767387800120, 8497839100864599482, 7049306369106895867, 17755292521806365866, 11522074935679212862, 12318001418161393796, 4090852078585609018, 2326332951934988565, 0, 10592, 279816225750213135, 3650402777016745376, 1781472746866786234, 10113987313323159199, 9398274187564883752, 16748408482785331310, 30358156203896034, 3074595635178688035, 6205342630873024293, 1697370376582801763, 8815094577559083340, 449557436115663881, 2151092097708635255, 7636620675010033430, 2307825524015342399, 8991051645303444091, 2473911126910605027, 2375720167990024221, 10037026397378548640, 14834683004264726058, 6907102329277961715, 18213897356329070177, 5667698909130756383, 4686287875705541143, 12476469095199609689, 17702654136961983716, 5311930945536331644, 7223353560134237057, 13509433978352760019, 7330889791923421278, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13218130135561237014, 16340228938899992486, 10079854000224610696, 5386106271938997570, 13529324029352761767, 1658368978401400644, 5806843431688025252, 731555729686954734, 16408636790989999614, 1194390383615742435, 1479991350936063621, 12665328444727065725, 16508621306808630414, 4524096300448710209, 3702021734644395951, 99320064886013740, 5380967634808025409, 4525525454001958153, 6245097092663538640, 15391685819936748296, 4523823347492887021, 7935485252853114521, 15349701448315707717, 6654503633133174944, 7791852406585602976, 16388618934142889960, 5021320952913191057, 13823616735181633506, 14978021216926555772, 7066479221415084403, 6595027110114265051, 9381983878411686905, 0, 10592, 1439899159397533405, 14727094498238943916, 10746359213734270257, 1223812058834541930, 1848521703701691504, 1128334504960281357, 6743090978755405998, 7738088049886519458, 17939832698319978092, 13966013418513317366, 2011070876654233589, 12183169551034808723, 9308934663460035993, 3987409101004068842, 6640678206253988218, 15420175838347825984, 2447243913023891846, 16080138638164650345, 11821902144147060712, 5951909302827919869, 138258931412597884, 10064659859509677191, 6862491015452895794, 10574916399821725047, 3278355048806054125, 6884933911815373710, 4616652429570306671, 3777113587480581710, 7620976189553973499, 13218130135561237014, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7458506668679174706, 12989182745399654381, 6424017883760389900, 6741329107631246959, 2996250744135171229, 11762321965912593392, 17214407784785549766, 4826665026771379242, 9455401689567173595, 17742880368513082962, 7202242154518776273, 14002540095489523576, 3368748681496606930, 2793317503187347986, 16090845688839933396, 12134490130702476802, 15025977060468605061, 761594659039248271, 8180292319292192183, 14097353951522347141, 13117220339118972087, 384261509201784382, 16218010128879575176, 18344680919635320495, 5612935174283274627, 13280794019151693778, 2181822407068201872, 16366192073566944614, 16350540043631590898, 1702177008576096978, 9457579135023296174, 3261819110951294965, 0, 26480, 4254579990847524851, 17114576923598071233, 14501968992007296006, 7693932549469059792, 10678009787450266287, 2595890940213877342, 12027612752909244618, 11942792976788752435, 8893673039996221512, 15212529265532680398, 977526836722797909, 3774006073579156026, 17701622526704384546, 15389797735547254619, 13767602282518466067, 10581163748471525208, 4912900994653972152, 1666712169140912317, 11001907572334629439, 18179452850399895424, 1689425248988491264, 724394552750888620, 13424695554257597947, 17992577679858152184, 11468668142758644503, 12524389240992679275, 2671393322368710032, 1059544940949021637, 18127894597596272634, 16116071169182046485, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [18375473735916206629, 13902220951623368150, 9495085361050600704, 3391853806089667516, 13729765936120520417, 141485484147552889, 8243287694337026956, 17175627109346761312, 1439539174789061366, 6607136348572801106, 14086551303627540921, 309044684967905465, 5340645128846635068, 15553295046773556517, 5353983225038020876, 12076475202363433555, 17294466125434314538, 584139155794109734, 17915920879523460833, 12949450161627397881, 14451576196834978134, 16264914328198243389, 11711541659758389228, 2740918710541851833, 6686302351373959991, 2544440258979831472, 414394141903116109, 10279567131504627079, 17390992297262099104, 2087983965311367455, 746869062219182741, 2044213372194154011, 0, 21184, 13079805966919738688, 12218492589526939611, 1562069618543971026, 952986602744509450, 16155494143085714581, 13684626716727802900, 2303575863276843576, 10596243276715621734, 17646165020998189117, 11814345067449767109, 11825442891411236224, 17347702280974326762, 10643130636190759117, 10594562435231095624, 4601317543004968907, 2494640429618639710, 7283529819405604014, 12179021258304518015, 15808731023964574299, 17252671119722267451, 2994890735774817444, 1595171953489970254, 11834064729547782130, 3702466161428093475, 4997071000317359325, 9247736708382385184, 7020445890779083806, 13774982404484476980, 17184349270149775183, 13243492223453509904, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 3491444178429880275, 3654621520649551024, 7030657201005151820, 7637363889880507326, 315282984146600331, 17353109826910914993, 692048541551218492, 13156326072595205886, 10194990537923928883, 2922061505936462403, 15996466154888710009, 17732870380491710842, 14251791589102075671, 15172043069041220075, 12169787591194237693, 9553321287361189913, 8794979035614942225, 6361471239272081213, 405831690173848179, 16422680862829694082, 13049156127751943768, 2281938208880998131, 7298980622174255274, 14817998461955857919, 1488746864367869490, 3792000010759110764, 3437974088341498298, 12846460123869708560, 7614720757886491626, 15097645659347780347, 10091523089564062088, 0, 5296, 6743125803107521679, 1867163304908812007, 1669000574108639518, 3582028644269610893, 16317815132307200966, 7118493626667445787, 13566879202183211144, 12402898926771175303, 11408064245891139905, 12248403740758614702, 1261452888691293041, 7470708275017896296, 10608583573536775206, 12594414503848564818, 13990563506880433299, 5287408014276309700, 1194675807210157848, 13081677376179713163, 9790979724735385269, 3429994162335743101, 18282263504341243063, 11073532118063625032, 18241092167097720365, 17490629239865315061, 17451936898459652544, 3705015252668379511, 15646972017585065174, 8948369964312160088, 12421841574297279117, 11600144893983875756, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 887537335777434417, 7914176922452123947, 1643778320524415517, 1728436561347785451, 1408159065058053807, 9042106580667294809, 16801941014204681951, 6030138189777334274, 3444215190125446364, 13983691239825442902, 9510849878170612681, 18029733377150662644, 10959053172580000061, 18079653246948800863, 9194190146189639040, 11454548593893846798, 4069919206893812430, 12335254121418857667, 10779545165064436731, 15302642370914668430, 16699578041838378317, 15354185361540738340, 8102419126297897135, 10266466507324112160, 154956368015439874, 11229756891578734264, 16853723936443190227, 2384358946534123926, 8422791455791464432, 4547363727573445852, 12303199265142910504, 0, 5296, 4681956701739972184, 3297507518564977562, 10978317254779656082, 18354142145846877062, 18082471245109184632, 5915586390509665684, 14991347734816807516, 10215583712512422817, 10329936247150774828, 13253613960908137010, 9477407930706312020, 3959435681151189208, 2924854172257996410, 2653599560818129230, 3882603508690502535, 12153757963762118208, 5905443084652099463, 3326804770534376335, 15700324760341857643, 4711113127161390688, 14532162435088690923, 9731412496448089833, 9087293637868970990, 16672855635472301531, 16157291854026127596, 6164067506556190095, 16340142805513243131, 13982894413446367987, 16491357058269217705, 8055423479702674738, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 5943604277132716192, 4729837691331628860, 1674634776332752145, 7613188931468803736, 645295908479301016, 4819615722506419001, 11336624181859957416, 6689083876929965918, 781516977059517682, 15888367593609586862, 2073776435788654133, 5783336608935715666, 3444732223180695300, 14606979696091412365, 10168871336598875304, 6394891966766051956, 9365831893597231271, 1329427291838800772, 11227549061287359722, 13960461272960093645, 12505943444250480563, 12975117899269678548, 10167800255227906082, 13066384169754273383, 4112955199466075909, 1998678292085591025, 10054365883864272595, 12102928269928850518, 2245777887379330575, 9356606797863555676, 3073184512654327322, 0, 26480, 7418486580310857761, 17019749743168160467, 4937487787523099272, 9870317658000082520, 9027489043629892579, 4927345804956144414, 15545533182903182788, 3907169825113221089, 2896862965383757523, 13069247508460875244, 6257437454212159648, 3775904100227399669, 16966215805924461950, 5206554086085975117, 10673185398346121565, 8235209133198882488, 9483230364913556480, 10561284120293439668, 17774065041915838082, 8696583885468400324, 9686516267351636652, 5891290976833577870, 6133144642314902299, 4372983987509841442, 2945651218563202825, 17570690068387731452, 2481092360881257830, 10656699665804756215, 2380753665748314674, 14226887805014239710, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 17603684385657352024, 13366748441350673725, 18052526731898170651, 16785850119445204235, 17347247651058160235, 9846117923911981021, 2707934329111401539, 10990776668153918653, 16235726062564973401, 11998830268732907127, 16193884857588698661, 5666920201535196850, 9215652902428934246, 13583314662851581779, 14184614926440663892, 14812424854330405309, 11904135334311579620, 17190421092224736398, 9627221069906324225, 14645975772268327665, 16511930999984330317, 15441967984164967023, 7049611109336029555, 13611843094121287226, 4797816591436698393, 5758188707877290663, 9330189747696559974, 3650051887228749294, 2591620200177413535, 6408924248829769611, 1041809921369720709, 0, 21184, 7994119771983090684, 1155757367334915164, 14020255521522346779, 17824815497741664585, 5614135143986453745, 7146977362179517856, 3824341730458112374, 16894770516791760289, 2879202081945061688, 5646668393535724753, 1923820538236998308, 5244112822855800046, 11523838157115606042, 654162111745526915, 17566215582742419332, 16153951788992043302, 7571027843561021323, 15400774862911119623, 10370417002357863310, 16053800817166961724, 10524854462256237020, 11096622266210541923, 15395378671807683368, 6912701393383240626, 11746170412650491065, 12730613771714545378, 6535987403990440638, 10122156746538229970, 3728282910211741030, 5183721621480304370, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 10852330926611119322, 12717828147245365778, 16006362017165978748, 16947261939602052576, 16534966660444334749, 6673071514994095144, 7939954455500268845, 804393087582707009, 1175191158969387310, 15407569589042353610, 6796181761165706510, 11169721396876266709, 3977957405235486697, 4025150260536840913, 10372769747575091868, 15860691988012150726, 14452440347418879120, 17083043265128501593, 15702979623219592866, 5958131302596194806, 11397091736337506145, 16755714190267385647, 2571437932894054501, 699303239030048473, 7036852882168517142, 8014024215551803682, 10588441110882001134, 8114639632202749987, 1351582854755852759, 17425991862702377038, 16698144525752928383, 0, 5296, 13498446627995378981, 6649809143130705797, 9522654220689816851, 7559480440412863769, 14249558742787467865, 4471817386074892784, 8930056613191782368, 9155852006764527165, 18377192855492301434, 12836057040498431452, 12282989683528533601, 3467617432525765103, 13766601347831535388, 2925667013227878460, 12822094630311757386, 6738693051085880966, 15661549307393278485, 7649583626848747165, 14069036937855587505, 9495341522376803417, 534616849927909964, 1899062451757954377, 6407581375465580420, 16442451038823818694, 7698809547406684914, 18232885173941026794, 3104393142368480565, 7738728989754721313, 4802195899845329288, 14925669435061449558, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 11891503448030670524, 3287860802649270664, 7152349585903556000, 3064107934796899020, 7381693478918306831, 11160134190138055922, 2311418288317025877, 705831048107886313, 3376931428262517395, 203181368331322397, 16774441650532541635, 13029333743753090049, 956539518201203404, 1805352044388884357, 2938636165292363575, 18444922890945363700, 2754923086646275489, 15332178805421692353, 10165745949485028775, 12341254189464639727, 4006244815271418796, 16087284806139179563, 5794920505966185319, 16096174561007826751, 13536289693580317045, 10216538963378596370, 17446785267706793614, 16624551875599356960, 4389250045279167249, 1839559312650246696, 3566999122524049164, 0, 5296, 12442366360197298238, 6098667720777990098, 15014871424912942550, 15008680935203256586, 5625270093505773824, 14457467770650559296, 10887298179723462085, 16706947956141547836, 13310039786220231748, 6132850845308416918, 12403357056402201263, 1240140770639885705, 15461729627686219061, 6574742069523544220, 3131690396120496930, 17758791276367026584, 10046968584624867256, 16910374147545432071, 12405462687145854473, 9006078559482542456, 13476220060215365999, 8384214154009398478, 10365404322190410833, 6851505899182549268, 18261819862243438027, 2823760450959191582, 17079185842171546000, 2573099324947734045, 9396372422985936818, 6899349384621454800, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 96, bitwise_chiplet_len: 0, memory_chiplet_len: 0, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 0, 41, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 2, 1, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 3261819110951294965, 2044213372194154011, 10091523089564062088, 12303199265142910504, 3073184512654327322, 1041809921369720709, 16698144525752928383, 3566999122524049164, 0, 0, 1, 0, 0, 1, 1, 0, 0, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 16116071169182046485, 13243492223453509904, 11600144893983875756, 8055423479702674738, 14226887805014239710, 5183721621480304370, 14925669435061449558, 6899349384621454800, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 1, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 1, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 1, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 1, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 1, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 1, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 1, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 1, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 1, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6811813611500970866, 9860311344216082483, 279816225750213135, 1439899159397533405, 4254579990847524851, 13079805966919738688, 6743125803107521679, 4681956701739972184, 7418486580310857761, 7994119771983090684, 13498446627995378981, 12442366360197298238, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12330218901740233931, 4356844177334189800, 3650402777016745376, 14727094498238943916, 17114576923598071233, 12218492589526939611, 1867163304908812007, 3297507518564977562, 17019749743168160467, 1155757367334915164, 6649809143130705797, 6098667720777990098, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16287800225917557614, 8724150062868049447, 1781472746866786234, 10746359213734270257, 14501968992007296006, 1562069618543971026, 1669000574108639518, 10978317254779656082, 4937487787523099272, 14020255521522346779, 9522654220689816851, 15014871424912942550, 1, 0, 0, 0, 1, 0, 14877174880820946473, 17456558212836048017, 17739158337269775126, 2390658038828763199, 3846911055059526201, 10113987313323159199, 1223812058834541930, 7693932549469059792, 952986602744509450, 3582028644269610893, 18354142145846877062, 9870317658000082520, 17824815497741664585, 7559480440412863769, 15008680935203256586, 1, 0, 0, 0, 1, 0, 13977067499243959482, 11395256034671298845, 7327799218104320227, 2699367049541735206, 7763338432894318220, 30358156203896034, 6743090978755405998, 12027612752909244618, 2303575863276843576, 13566879202183211144, 14991347734816807516, 15545533182903182788, 3824341730458112374, 8930056613191782368, 10887298179723462085, 1, 0, 0, 0, 1, 0, 8858901812137030682, 13558987077266275339, 15564429589094530081, 5734803687955113279, 15092595329879644577, 1697370376582801763, 13966013418513317366, 15212529265532680398, 11814345067449767109, 12248403740758614702, 13253613960908137010, 13069247508460875244, 5646668393535724753, 12836057040498431452, 6132850845308416918, 1, 0, 0, 0, 1, 0, 3289076678693837113, 3306415136959427537, 4595381067892187327, 15617193812494172197, 13969944955380272714, 2151092097708635255, 9308934663460035993, 17701622526704384546, 10643130636190759117, 10608583573536775206, 2924854172257996410, 16966215805924461950, 11523838157115606042, 13766601347831535388, 15461729627686219061, 1, 0, 0, 0, 1, 0, 2861046167966645052, 10889239779607274128, 17320053671944779813, 3406927099241203725, 4689628285093180625, 8991051645303444091, 15420175838347825984, 10581163748471525208, 2494640429618639710, 5287408014276309700, 12153757963762118208, 8235209133198882488, 16153951788992043302, 6738693051085880966, 17758791276367026584, 1, 0, 0, 0, 1, 0, 10308255496352503262, 18121871418048845228, 15889419620549458343, 10343975768128176185, 1524422576558323017, 10037026397378548640, 11821902144147060712, 11001907572334629439, 15808731023964574299, 9790979724735385269, 15700324760341857643, 17774065041915838082, 10370417002357863310, 14069036937855587505, 12405462687145854473, 1, 0, 0, 0, 1, 0, 11515575222719100082, 3607722074361327345, 10538200152279946362, 3757345954094976880, 3511571172448102031, 18213897356329070177, 10064659859509677191, 724394552750888620, 1595171953489970254, 11073532118063625032, 9731412496448089833, 5891290976833577870, 11096622266210541923, 1899062451757954377, 8384214154009398478, 1, 0, 0, 0, 1, 0, 5623476244212125463, 0, 0, 11387279664761561894, 16119779393022010645, 12476469095199609689, 3278355048806054125, 11468668142758644503, 4997071000317359325, 17451936898459652544, 16157291854026127596, 2945651218563202825, 11746170412650491065, 7698809547406684914, 18261819862243438027, 1, 0, 0, 0, 1, 0, 0, 0, 0, 12664138717389652380, 16373019178487693626, 5311930945536331644, 4616652429570306671, 2671393322368710032, 7020445890779083806, 15646972017585065174, 16340142805513243131, 2481092360881257830, 6535987403990440638, 3104393142368480565, 17079185842171546000, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8299034149894841811, 13423474518210064130, 7223353560134237057, 3777113587480581710, 1059544940949021637, 13774982404484476980, 8948369964312160088, 13982894413446367987, 10656699665804756215, 10122156746538229970, 7738728989754721313, 2573099324947734045, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4141583402420192864, 10379152206886126257, 13509433978352760019, 7620976189553973499, 18127894597596272634, 17184349270149775183, 12421841574297279117, 16491357058269217705, 2380753665748314674, 3728282910211741030, 4802195899845329288, 9396372422985936818, 1, 0, 0, 0, 1, 0, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 16116071169182046485, 13243492223453509904, 11600144893983875756, 8055423479702674738, 14226887805014239710, 5183721621480304370, 14925669435061449558, 6899349384621454800, 1, 0, 0, 0, 1, 0, 0, 0, 0, 665741763369239996, 5831108162926480783, 7330889791923421278, 13218130135561237014, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6465560042516376876, 10751299519219102331, 6829597264991376521, 10079854000224610696, 6424017883760389900, 9495085361050600704, 3654621520649551024, 7914176922452123947, 4729837691331628860, 13366748441350673725, 12717828147245365778, 3287860802649270664, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16331008790693949850, 3856188963254020539, 7276367259939934310, 5386106271938997570, 6741329107631246959, 3391853806089667516, 7030657201005151820, 1643778320524415517, 1674634776332752145, 18052526731898170651, 16006362017165978748, 7152349585903556000, 1, 0, 0, 0, 1, 0, 0, 0, 0, 6970683036804102439, 4769583868215503893, 4372128272177755375, 13529324029352761767, 2996250744135171229, 13729765936120520417, 7637363889880507326, 1728436561347785451, 7613188931468803736, 16785850119445204235, 16947261939602052576, 3064107934796899020, 1, 0, 0, 0, 1, 0, 12484506945223374059, 13798899377595454603, 15630174643971648065, 8497009269728596384, 244163607749525539, 13867864482574853380, 1658368978401400644, 11762321965912593392, 141485484147552889, 315282984146600331, 1408159065058053807, 645295908479301016, 17347247651058160235, 16534966660444334749, 7381693478918306831, 1, 0, 0, 0, 1, 0, 16880783619726628794, 4072438451438385394, 16451846751784462158, 2851620155234231146, 1446211823843582468, 13816377619801393141, 16408636790989999614, 9455401689567173595, 1439539174789061366, 13156326072595205886, 6030138189777334274, 6689083876929965918, 10990776668153918653, 804393087582707009, 705831048107886313, 1, 0, 0, 0, 1, 0, 16422957004609039675, 8426497859765948943, 11608582623132668527, 15495282497840653987, 6283226934869114102, 8130570750653425723, 12665328444727065725, 14002540095489523576, 309044684967905465, 15996466154888710009, 9510849878170612681, 2073776435788654133, 16193884857588698661, 6796181761165706510, 16774441650532541635, 1, 0, 0, 0, 1, 0, 13469000803554410638, 16240303874937126514, 8576418966068956289, 14225437221510868328, 14429029577374864048, 14398424816766135464, 3702021734644395951, 16090845688839933396, 5353983225038020876, 15172043069041220075, 18079653246948800863, 14606979696091412365, 13583314662851581779, 4025150260536840913, 1805352044388884357, 1, 0, 0, 0, 1, 0, 5818515005300781607, 14956639713668542674, 13632325391818316617, 8625575291436195558, 8418933870535928003, 14805102781885121051, 4525525454001958153, 761594659039248271, 584139155794109734, 8794979035614942225, 4069919206893812430, 9365831893597231271, 11904135334311579620, 14452440347418879120, 2754923086646275489, 1, 0, 0, 0, 1, 0, 14229374278813002744, 9131839128802060332, 6833211359926822669, 585466765571734889, 8007220776657207831, 10039237550878760371, 4523823347492887021, 13117220339118972087, 14451576196834978134, 16422680862829694082, 15302642370914668430, 13960461272960093645, 14645975772268327665, 5958131302596194806, 12341254189464639727, 1, 0, 0, 0, 1, 0, 11789502593543293339, 9376057554008896475, 4023925612208030114, 15397869777828729446, 2039526413662718418, 9059653401043810135, 6654503633133174944, 18344680919635320495, 2740918710541851833, 7298980622174255274, 8102419126297897135, 10167800255227906082, 7049611109336029555, 2571437932894054501, 5794920505966185319, 1, 0, 0, 0, 1, 0, 4023894446217307196, 0, 0, 14219322642025824233, 16894861457913198121, 7049306369106895867, 5021320952913191057, 2181822407068201872, 414394141903116109, 3792000010759110764, 11229756891578734264, 1998678292085591025, 5758188707877290663, 8014024215551803682, 10216538963378596370, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2441238758278104147, 553494724036872290, 11522074935679212862, 14978021216926555772, 16350540043631590898, 17390992297262099104, 12846460123869708560, 2384358946534123926, 12102928269928850518, 3650051887228749294, 8114639632202749987, 16624551875599356960, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2775370016004740491, 13690090054816609773, 12318001418161393796, 7066479221415084403, 1702177008576096978, 2087983965311367455, 7614720757886491626, 8422791455791464432, 2245777887379330575, 2591620200177413535, 1351582854755852759, 4389250045279167249, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14369612123276038546, 10710009389473682712, 4090852078585609018, 6595027110114265051, 9457579135023296174, 746869062219182741, 15097645659347780347, 4547363727573445852, 9356606797863555676, 6408924248829769611, 17425991862702377038, 1839559312650246696, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905, 3261819110951294965, 2044213372194154011, 10091523089564062088, 12303199265142910504, 3073184512654327322, 1041809921369720709, 16698144525752928383, 3566999122524049164, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2187, 4374, 6561, 8748, 10935, 13122, 15309, 17496, 19683, 21870, 24057, 26244, 28431, 30618, 32805, 34992, 37179, 39366, 41553, 43740, 45927, 48114, 50301, 52488, 54675, 56862, 59049, 61236, 63423, 64152, 64881, 65124, 65367, 65448, 65529, 65532, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(10) }, program_info: ProgramInfo { program_hash: Word([7894050562420362676, 4416250439475247271, 2326332951934988565, 9381983878411686905]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 11, range_trace_len: 39, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 64, bitwise_chiplet_len: 0, memory_chiplet_len: 0, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_27.snap b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_27.snap index c983811d07..a2ba1b8ee6 100644 --- a/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_27.snap +++ b/processor/src/trace/parallel/snapshots/miden_processor__trace__parallel__tests__trace__parallel__tests__test_trace_generation_at_fragment_boundaries__case_27.snap @@ -2,4 +2,4 @@ source: processor/src/trace/parallel/tests.rs expression: DeterministicTrace(&trace_from_fragments) --- -ExecutionTrace { main_trace: MainTrace { columns: ColMatrix { columns: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 1, 65, 97, 97, 97, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5482243896119908732, 401642074298203, 3137828705454, 24514286761, 191517865, 1496233, 11689, 91, 0, 0, 0, 5482243896119908732, 7458506668679174706, 1032, 8, 0, 7458506668679174706, 13210061556570014836, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525, 9874694795284567525], [17271741639510569126, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17271741639510569126, 18375473735916206629, 0, 65, 65, 18375473735916206629, 16003296542960478536, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728, 11914585017133270728], [10627125303494028926, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10627125303494028926, 2105717247508690050, 0, 0, 0, 2105717247508690050, 6732564319544917702, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410, 14619522228640933410], [12334791106787903660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12334791106787903660, 1679902783560062568, 0, 0, 0, 1679902783560062568, 16687523027086140644, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683, 6636010883309744683], [13210061556570014836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16003296542960478536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6732564319544917702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16687523027086140644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4, 3, 2, 2, 2, 2, 2, 2, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 4, 5, 6, 7, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [7458506668679174706, 7458506668679174706, 7458506668679174706, 40, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [18375473735916206629, 18375473735916206629, 18375473735916206629, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2105717247508690050, 2105717247508690050, 2105717247508690050, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1679902783560062568, 1679902783560062568, 1679902783560062568, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16, 16, 16, 17, 16, 16, 16, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], [0, 0, 0, 2, 0, 0, 0, 0, 0, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 7, 8, 9, 2196, 4383, 6570, 8757, 10944, 13131, 15318, 17505, 19692, 21879, 24066, 26253, 28440, 30627, 32814, 35001, 37188, 39375, 41562, 43749, 45936, 48123, 50310, 52497, 54684, 56871, 59058, 61245, 63432, 64161, 64890, 65133, 65376, 65457, 65484, 65511, 65520, 65529, 65532, 65535, 65535], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [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, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [5482243896119908732, 18015781855758016478, 4383606322674378669, 11282929110176162954, 17215248529293365853, 13193227772306657556, 11735240166769603875, 3717289286029653294, 5492874275384737590, 12486768927296380145, 7992161010257837902, 5965860733558915216, 13973209423992708161, 5139670008027876415, 6906630570311142812, 808538110186084468, 2187643142553675840, 11028121748345672612, 18181286167455191614, 15014367804365107227, 10866688391213961683, 16520440189869744108, 5493823407617825232, 501346961392724628, 18105097706170191265, 13534558354914049543, 3820689183586493894, 16784019981734849061, 2862138511955678409, 7758258992155315690, 17115115516972321026, 9874694795284567525, 401642074298203, 4016420742982670, 14280802901810915241, 7925919485060883878, 9094034340168608638, 6650811367268781560, 13344927435882217244, 15870694671012449597, 13091389828882674218, 168434371192049215, 13973668876111195937, 680445747454648704, 15441309962929722976, 15749770188837954531, 5233297770622824375, 3367253731665130938, 5066484463076591248, 9867160564810673994, 16707816004584596036, 6832899290197418961, 10263347723858682786, 6209209797490182000, 8678413656546712232, 9643915442530902318, 17208626611000903707, 11389822518212260982, 887493237489321299, 48736118273260452, 13483864438078018308, 8159241411748295729, 10385528691577928985, 5482243896119908732, 0, 616, 13342492399873323769, 1439796670523758837, 2591609871503882494, 5919456033500076693, 5232333079875635931, 12079101376381790329, 5687909194194711965, 13514584364960626778, 10501272396704173758, 7941686916236651549, 11501430483965911830, 10227424397178507773, 10471520652203868473, 14226149352545573719, 5877312072455938554, 4586059525590481046, 1601223390241498740, 2723805050156540964, 14314758709191331837, 15918659712373688555, 3030433806959200828, 16403500445172050158, 4533755278593082652, 10807446599885826609, 6981555831806437627, 13412972662619459764, 13711912288503888270, 7425430573821419685, 16752277069679715408, 13210061556570014836, 1032, 10320, 13024110921086730221, 3587442816163675215, 512402747638547729, 9217956011885162917, 3925750957223009950, 8674177413178223320, 12846799727083908462, 9116601283268739756, 2958792353189815054, 1720195204565087693, 7696852080146622077, 2890877729556257606, 16676527939404087356, 223754558788184593, 4767414622778376421, 14072300156908432530, 16856861612825314654, 11910434229443384600, 15658716527747040980, 14322127566252286435, 4770460127206402609, 10805338145914832851, 1391598300875421210, 18211456042978337510, 11866022853402812888, 6438324596032750504, 13328288515202849800, 17331158106613184460, 18344276842462151560, 7458506668679174706, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [17271741639510569126, 8154194758959345943, 13264028927506398677, 5896249534368220847, 11382862066285680273, 5436084715181539253, 3806787319072410229, 6511238228694043548, 9049442861863566881, 3576764171564075210, 450124369605914003, 3732227441816681926, 14029816209330408163, 8200782329890006994, 10416842793286403595, 6907512650407721813, 5351083897603196824, 9182929970775715030, 16141859999570517823, 9888871621811661249, 4078956937078417294, 5937931242192299623, 3211370055999743360, 12301747922262729865, 11292399879083020280, 5346237718208015471, 8535816953133153286, 9097410120098142273, 2554244438665697829, 6695383891040002341, 9265251570417433175, 11914585017133270728, 40, 3213136594386184, 1835177830541154044, 826263100281998566, 9612296353153372169, 2509054224639990472, 11363599377854067153, 5593295816013818122, 4611398810491526224, 17064807786960234347, 18427889571151062396, 10159688738464070440, 14427917509182297997, 6874689601963577621, 745298233749984501, 4960831845018172313, 1451394763904737446, 17942681985602265676, 17508193444101172646, 1672370857206926433, 10152063658776528390, 14576660961872281746, 13602838247655372264, 5274902253855511588, 3163862752932557920, 7292072545764012550, 6033538369482377655, 10941848106600998110, 3570589185097006252, 4587292818271677447, 16771298688176486904, 17271741639510569126, 0, 528, 4511615971967153504, 11189511375577512439, 14523290705070057408, 11602649596278030541, 15937333004537029302, 7414360896531864023, 7973996941547777109, 691576170553327010, 16392526795103433215, 3672880019205947738, 3018308815206440911, 15753827566219281917, 12969815742735761919, 16814873348334179176, 9850453545266944859, 10757916804785969985, 15838808218411872755, 4464803664915013475, 1326425913004665964, 12560438841096766551, 448453576971543277, 8998725782446855275, 14421875759181138198, 3100710952877190431, 3320646806195653797, 11565789183953445370, 502156843765695809, 13147348360138928114, 11903841834984596874, 16003296542960478536, 0, 8256, 1131208899036558480, 1667157010810320250, 2053960715201569301, 1526213270499333709, 69813565043892453, 14925652377538846871, 1380252317064967448, 9902934070223067140, 3786794161520721521, 664031068804619792, 8470323998416702977, 4965297830526000942, 9404280000999464502, 8244737495337250711, 4784363486033662704, 4680481291290566437, 15373555507761845373, 8780119261264514018, 729009684537575982, 18306419558979237700, 15407410920890065538, 2509966126115291236, 12709897403480972846, 11498596868429821859, 6606875518512322314, 13880694912200059110, 6972406840307481976, 14148490408465275064, 2917966740410115114, 18375473735916206629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10627125303494028926, 14952889910786498171, 4766776471757604196, 12230245468863423579, 18104224094677170296, 15873409126341319274, 10073785188538358192, 9346697284679931865, 9007898958502691821, 18310381669862731969, 6720634958674998611, 4972858056675247397, 3284008361973965746, 14482858214234206831, 15154449156086880838, 5792220624700559072, 12843525862417693577, 642245012387336876, 14582627702688057517, 2964899186980974939, 8169860993617536308, 10855885493426519851, 1871971423867885122, 7909458165142256993, 3879457158905131550, 11439385698067115077, 12781603895645888322, 12658641528827989062, 9129723360543316479, 2424787611628537668, 16343713044075599831, 14619522228640933410, 40, 803284148597046, 10010111294767420802, 16943179644353820008, 8996122336997085030, 17350347680949584060, 13520911097528541892, 14769691589967587136, 81685142906752346, 7559897225353479520, 128512095027132822, 9792116363139842106, 4634576985104787587, 8679380235287294885, 1134592111928495305, 4684288247441474792, 15613043314698948257, 4841731940180862534, 5786518576333159075, 12666070374819933283, 2487841274273895537, 5690982477694717281, 5924572671969496500, 8629130978595053833, 18206699227813987098, 14234831161984809711, 16798226782780142546, 9330568307929665420, 9731250716956559616, 12286920896461242142, 1919835269886444210, 10627125303494028926, 0, 264, 9085863547783897978, 4029278259426396811, 16053154709446024998, 15730095788089532534, 1184856151594203190, 7658158244024203478, 7908104163460391198, 11768448888839053133, 15952542848401697239, 2236539493336923746, 12654027314481387133, 183479441840898968, 12829755263022627333, 14927722658095997307, 8579481663516436508, 2326984138263422166, 12584151503586926798, 5547037854005909933, 18320766430359725566, 16436941964924985549, 2398490839703252269, 15603212774947060210, 2697950444757558845, 7336230381913860230, 2577750295211676178, 16469775866150825791, 360850050916534143, 7183698983616787617, 9070535322622906244, 6732564319544917702, 0, 2064, 18136552782870868471, 952274539956745973, 15933282259815262093, 9924516287334785738, 18064603646801610993, 5114527609957824263, 11816233963570869158, 17699527003452380450, 14533708946479200173, 17484213571014188868, 832814531422633701, 1508169308733590908, 8423043379628164525, 12595277727969636921, 14226276023010866965, 10485112285448962747, 1783527593060720204, 10145484005384627580, 7463752398658534839, 17345550819494003223, 4432309123412733588, 7086318781105575433, 8830891075082588619, 310185093236608634, 16683125300631590273, 7786799186167080425, 29465347809991832, 8090161351836983773, 8665315444141111469, 2105717247508690050, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [12334791106787903660, 10536106724359599792, 14660905060901389201, 17357985657180629743, 10490790376815116141, 8856174280738574418, 17564486157138470037, 2383050989032417578, 9423711593310475409, 4142017075081989212, 6217567350304044823, 15435624740876731287, 3215908606625999288, 11222238183310766613, 17187582840477322187, 11654551786904653634, 6201498867875513095, 9940061963065628902, 1432819846316931691, 5068010018173215582, 13903556343063122489, 8872060411343823556, 17720392065240548352, 17643816943101201258, 1449530809054027683, 17965277233811019017, 4895491920411997249, 10751559368097521724, 16513197729164811328, 4815287357290896051, 3003012580421078075, 6636010883309744683, 0, 803284148596806, 2549897079792572603, 5670682422759337153, 4249626004536644548, 9138873913574622404, 1343119293110958009, 15707367360995172765, 2149720931386886989, 12579497520806083785, 14990373923527496282, 7330871518527332444, 5790961380321049961, 5495469617420264118, 10789212522972025785, 4356961356341052500, 8032044444015716361, 5554647570062987979, 1022644107902166331, 6764324513849573852, 14002884382934858252, 14316154512513580139, 8331374540726760892, 13067519389098510351, 8671032013540344722, 13457978878695920483, 16399505509770566014, 10578307416004071064, 11950037765875050974, 12195903600484928258, 17694444981837938563, 12334791106787903660, 0, 88, 13728083094831419091, 5555139373262852832, 2905384006316447019, 12155959663009124293, 13187847930197094867, 15053688477158705110, 5239197399579256268, 18372875045424962848, 6782570937531856778, 5670979983981263850, 10968120781620208764, 2099848306821515114, 7984319522957739004, 14143871504578433969, 14093328990578646811, 5769086287272836702, 13010501651213663576, 16984828703781093727, 13803823311240773956, 17471084929704555662, 5508754216278517899, 14994098977964244257, 8220163139135834751, 17625713553185819225, 15041604777168753281, 17976701769209321205, 10958079103202840999, 17793074612839242130, 3601655880141993647, 16687523027086140644, 0, 2064, 9594118340025725004, 16218246678075491818, 11582919835122342747, 5661452934218108707, 3714647928422746674, 13689184893219719187, 1899963197709801965, 8313716591368695784, 17822645741084942000, 18354595702287703799, 12620512717427217848, 10145637708639089787, 1735222492513760332, 14681927838838900060, 9262747238997471758, 11498487923782501751, 8924101344488972446, 2592517964915386184, 4276681409258176044, 3764365715267793208, 3120204268813370353, 6019260256544801113, 2801984351776029768, 16979166255722313516, 2813750347113564525, 16588139065369475399, 12012198471360912693, 2492059183640657261, 16968938268466755316, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [13210061556570014836, 1599157050859759633, 12446750015896088802, 10353774239160274935, 11424271721157330669, 15057005486179715954, 8861044108273791962, 12243038632327996294, 6387235594535598756, 10620968503766467282, 10090957857949391364, 610949617653761740, 2641692952954235941, 16682338453560518377, 1667764180674112574, 3944406972826047531, 7937338373741897463, 677543792580138430, 16064632909904135712, 18144484844415291494, 7226453148331774623, 1179808805540104806, 2700524299164928450, 739842910379542056, 18551850792840682, 16856435263285305760, 6893839572721182305, 14666214556500183752, 10619536471246139015, 4063396021928247911, 1116280449848444285, 11377866377890790275, 0, 2008210371491335, 16850544756775285522, 652387120995254672, 4188956971131276775, 18389965100329173053, 852421464532798418, 17258729097516267384, 11347427093515448316, 13908538323250058716, 6558337355650114042, 4089976927111145333, 17816809041231283545, 12843997071522346840, 1655996231185402724, 11256141768734986569, 3019459069615110433, 16778373777892540383, 10175251160015024193, 11396702708789693017, 16481019216530994753, 5122353003150766192, 17913616556333538828, 6485826671956173957, 15738756542654855641, 12199621872357116369, 12077164016468113545, 8907315944885273345, 4878983963291132913, 1618531819557712390, 565132887411573955, 7288090792972058500, 0, 616, 4968648927826019469, 17195207199910519646, 6734621562241387182, 9715952180361858627, 2034771934048449998, 13730246563790151743, 15224252119305799711, 16575323315490024998, 9453153207794904511, 8194394828646838882, 1235308382947710635, 134218781076142871, 12444330148186854115, 16838588367568106248, 3274404606032631663, 8680261223649739505, 13512134067010568333, 15074317169196019601, 3919235389861209780, 14979187502739607198, 1116932806094012842, 12657319342943489784, 998626228777839492, 2347840117369842691, 15743276195226846510, 9881270424621082635, 2778123425092199841, 2613774562373586415, 1448060333031158668, 6190635258012880107, 0, 5160, 1190658701913535022, 9371121588404883743, 7133056533056999470, 7380100170229652082, 14719783382686670107, 4693530971176924881, 11125714198188567552, 2434816259070577714, 17927785478103501878, 834873962620943786, 1091858408197145201, 9293176204765248193, 11318806736621162148, 979530496520387452, 8328113718786640843, 15870139479256453021, 7754853849459016697, 2742936430580983415, 6806060556807781604, 5089080673677611112, 16430235900965466453, 309743103212430298, 15664803780047891222, 3113571524475220627, 17862871362988443440, 1231393200801541530, 15779352999894925288, 6026600320279882336, 6970552753544824994, 4949154992619464010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16003296542960478536, 13466221688393768258, 12927954860087459534, 3759003303159369746, 1148549753827007441, 7129001791528740265, 5281592040827142238, 16203079979032760691, 7039074043166063940, 9054598259215599503, 2018397558465392243, 16413792935045431209, 12604373665766922919, 1493466405559625913, 11868526707386259660, 3043746450373199613, 8246328563832581273, 5887036391937389613, 2796053561793572028, 7645118395649289364, 12303475117195379639, 207358776078213315, 9218579057118601952, 14479451218433079532, 2031744097966400086, 2566041186493151514, 17259376159632543425, 10376116775360567681, 11289943669462175698, 10804772324353478999, 17288383771256214060, 9885671831159451104, 0, 1606568297193092, 1076973899277284702, 14086579741019377519, 3818478693739735842, 5593621083784091164, 11728670858811596587, 12625736484548160126, 968047239546776409, 15493380284459454506, 15542100289574010625, 15053368214221814937, 17388070103506970075, 4738318434573394804, 15389814481683087606, 14763812299525073807, 384493414835098150, 7660052382355122994, 7691788916209089905, 14721544157906502013, 737940994724202658, 3221762534387838371, 7517398897305596666, 13211005290810103003, 12141388589516060378, 13672030567886044471, 12296311093518063031, 6143526203440544581, 5554567664494429423, 12302163852964786956, 14310991091785572129, 7008881577152522467, 0, 528, 12828040835569540857, 15946070950510533025, 6868712626693654693, 16719465941571322506, 15929304398043808838, 7333330621525318559, 8574904634803746916, 11585949634519199591, 14215120915846294561, 15431555872184246136, 556415272972402332, 13729762303106745810, 1895854814022398925, 16120810718921859928, 14563556215553868244, 9584551737159741567, 1050656582218051719, 2849157683178260515, 4987801895818641338, 3252006976820452311, 4232022539410523688, 12145542090324719848, 13475056960068950678, 4212050629407893798, 18068871666013902057, 4214295938146797537, 13664544216029702565, 1391392205806749871, 3418909895274525076, 4840757955412667387, 0, 4128, 1352424102745866255, 13301242752201603536, 5420135027930584396, 17078794493496835379, 4779811836607866048, 3650219859599657886, 13618468821889769363, 11429589192023659923, 8853101337885331080, 9650238821992519861, 14401087967309285252, 12035560952634921032, 15407186837043713393, 15711028160746246110, 5396976350889627712, 15903424027416555998, 11304777107657759509, 9857843669692965578, 12605480788735099613, 14618970056708743810, 8493993205782554647, 6059068631740368787, 18316971448227884023, 12499808993385025318, 4210674244211222629, 18405965507148502967, 173097048437312502, 15568437290332308327, 11532601739151124629, 10000279862191744493, 3, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6732564319544917702, 11424946734513850952, 14751589151467562513, 3091073535594807983, 17274728363719186424, 6785780051417756764, 15374515033027594653, 12476673273305390844, 11491856728648046938, 889587581187765015, 1832729573374625479, 11964718430105317483, 10284914521902415429, 4989117988224154817, 7310308994414837120, 4896165117485439507, 781193619199190152, 4972018469228063343, 11237024791849123316, 8136517227202567877, 12980119595156137175, 5277784125198234251, 8730957263237386090, 6627357084936364627, 9579937749716133270, 13182791294901350976, 7788172704304532836, 1814160375547940386, 7818804555865981505, 11573391963135759227, 18390005084876364234, 49905639292627904, 0, 401642074298523, 16072847024087248681, 1047399340937520223, 13840617071834531990, 13835424809772757395, 12438858367585478828, 14080077230806112448, 11208516754282785707, 7691155727086178136, 17898846423848868766, 13990233438164144322, 14765296463244153634, 10144768301469359068, 16658833476738371029, 4674204014270448977, 12722211832796318871, 492549161703070590, 13986658207276323375, 14512155514173182920, 13983563295828088546, 2440687363152463730, 15931932209781173412, 11078906302351818677, 3584926465549602493, 6813538466449503008, 2334817027508375898, 12619526317209583817, 6515674137823977144, 393947096345211186, 1951192747307666741, 7526556702499462773, 0, 264, 14858685484860085108, 16638144790071955925, 14803289513390493682, 7947368985060100292, 8540021318758160201, 1005829865088874654, 2182109332887118586, 2709878912677862734, 8639678844062658411, 1087022739668739893, 10504771173378443613, 10062807734250201377, 7979854057356878352, 5264886220300798691, 17178601938487182393, 14209807647112141969, 364963036030481104, 6977342036970944167, 9475211165936098151, 2067156367555811068, 13444810812224497486, 17338503932931685384, 18075892757378330321, 5992364927925930356, 280994234174845985, 4192504288997153355, 10293012497513243194, 12632074680840502609, 12384471116364520725, 14304772746964984975, 0, 1032, 4798141223555508282, 12962488577647927717, 10133257770726709126, 332864556927106185, 12116126881643349994, 6604148216925166409, 101015634312276042, 15934992137290074922, 6112274855072540816, 17762248064501548615, 13166189948742588777, 270100349969833402, 13485211244653928073, 3502306881032295169, 13607663468974078519, 8883940618995723208, 10623667092532612652, 12293715092576816840, 10386976621364522928, 9128135834925108269, 15731443845270647366, 13373704167654916087, 13746187061551926812, 11684868053863796759, 3258729720361659960, 10434904637843727165, 7034851303745741351, 16133345873308301364, 5426492436527662130, 2980140658145787783, 7458506668679174706, 7458506668679174706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16687523027086140644, 9086882804838007993, 18208410790236506017, 3398985649909830369, 11870335859895317550, 1782594595734670280, 7950908231675299553, 11699755763721080867, 5559192297727634984, 15856483324254330201, 3827177513892222045, 8697421447132597636, 6525137006607571383, 9739016092723027913, 37096681180297292, 5998909423699657245, 1737478325904747641, 9603988472267868801, 14612309354257526062, 963817021754931361, 2954837086209820968, 11485058781500311480, 10011022503247302490, 6596157637386353039, 2185026052398200396, 8667196121129603577, 17444739644589522901, 17384087895468261804, 4673396992430997118, 5652365973964779246, 14148401294484512817, 594790136239256278, 0, 401642074298403, 6959791354043610236, 1843180796447728437, 9556362158826632350, 3220022195391792741, 6012411438022691140, 4309223969498591447, 7596903557041777533, 18393682838284953355, 3973832102121938954, 12190997158276486897, 15972235844585587264, 14899488070931524727, 17337514399056563302, 10500237188498665928, 18440452962210035879, 7481614450647261413, 65300580117832193, 14713590013611289205, 13086268929321267306, 17247769089209001713, 11421561962034654967, 4561010052951998759, 9562817622798343284, 3062054327467638127, 6016566887476098647, 5513989129644936969, 13097123292793361360, 17631302057213141907, 8382824402074565601, 16136160484984138575, 0, 88, 11332670461359993442, 14431967032738938661, 10393518078208184991, 2462224494429193628, 2381519205788696693, 5156397633515475273, 13071332837477200404, 6583788956280193302, 8309261923972302555, 7204946769828595498, 10143223184962015615, 2291749916011172217, 12651590612371699683, 1757329184049619756, 8575055855333374088, 10782010546727900871, 11693001677843026089, 13372591108841832182, 6745878472543166577, 17326074735792689056, 17178266551378060244, 9012900451066906030, 9513119903156534723, 14316793092410720577, 15850020848376370982, 5093266838540794296, 2953143545478827927, 9172592184988170325, 3259030218090439002, 13670896049781213124, 0, 1032, 11702782905971311743, 8115486282645452027, 16425371230714077552, 10333496212804492507, 1572943607289284437, 13244361396034453954, 12880029163967100393, 14716450796809578181, 2618965885956593171, 1606019581379521796, 12562170441304287563, 4599116799417823473, 4257071131168813417, 10446583017549019711, 3570388907037362614, 11170081717188072664, 17238997244398394333, 17231192964516960933, 8123337005847551087, 7060091366977384949, 5719725530909274667, 5057603743378325948, 13848013489728729143, 17729739340387068117, 367186060507240673, 1411195984452924204, 11088333491201093194, 16575090776691519559, 16147396598096989679, 14525300817521856881, 18375473735916206629, 18375473735916206629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 6538312968872592849, 8060897427763484267, 15694315280551902473, 15462035367190511759, 16783127636073026773, 10756964923802715923, 4768450986425500783, 586150029444692874, 14745636460228146879, 5204776334183399126, 7685703760533694936, 16111592919872596132, 6944599323919802145, 1254987403839644538, 9402574875622777470, 16210856058698621820, 6207690803740787708, 5909774410804808527, 11610503998702777421, 686805010274260483, 8419527378140004636, 6342702858222909287, 8706567413279745902, 8451985615096117101, 8796637399824800240, 15979424445015031332, 13704751155696621736, 18261872069356847559, 7568935938034555881, 3939988349760901151, 3558778201956820739, 0, 2008210371491335, 13098960849839742034, 9449621519891201049, 2814310786559014444, 5305842545683321494, 4969236906288915907, 1243780951433164967, 6167749875842285147, 9490220981060631819, 3665259354621890034, 7437125179920904126, 12655958476488865400, 17935537000594940941, 91614862745339577, 1869550524566103495, 17384150297165671545, 1154605885284628266, 8665046436862728398, 6741156569294553317, 9490927005547387767, 8947900188307771735, 13752550215202657538, 7714188412126691626, 12225947487197390724, 13509943592829854189, 7120740401378484294, 6789669275155346195, 2929601484581949152, 1077164174037184778, 7253613682453412944, 12957959164911169922, 0, 1232, 6031863247325663438, 674016650738724202, 9655491867310024790, 4753798685424869288, 10749041705000945043, 14520855376130294244, 1540176383869885892, 10236894625417199268, 9196614711423540610, 7978597004657283049, 6086008265617713639, 14043785705271347590, 10693788391520380705, 12309293813476849789, 12287432898048046644, 12476380710530844150, 2814554338965902349, 12370730861881949935, 13055692992345669402, 801564953257569940, 10614676804436196472, 7985393687855976209, 16788264280259941604, 4042445936043537075, 17844212763579117389, 14723420347046552696, 2456530167870834703, 7343890316269580191, 6483315548845037473, 9440211366785524370, 0, 5160, 18346837778669738664, 15130142357101091527, 6726588340010678615, 8394319278312203283, 15942424551308612685, 7629500615465222065, 14939877513325106589, 17048523965011794048, 2306293645521445312, 823113708878672797, 14981348226783328932, 7432878333905782051, 3482639998457803800, 632277917380007036, 18266437030920184246, 3366715262389109205, 5280275432441977334, 5379329043314533811, 13912213856326486056, 17217059915921675075, 15634373017412823086, 14981257187297131103, 16697350900700022325, 5239234081629986555, 3229291246709926782, 18373224696258292584, 6771862800272250893, 7666370275789511263, 12942227631865082960, 15190222347874856922, 2105717247508690050, 2105717247508690050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [87, 7206805482451038763, 10391043349415287037, 17044036436784806527, 13171139175044072684, 2094744771380247596, 13239410091625892436, 168039991714389118, 9272483157421678641, 9491323991579079848, 16844742792488708348, 9520544349855559315, 792788122696624862, 16163267682416611248, 7281147841738764349, 9382208451579624348, 15681622260194273891, 1390751769269680465, 8196141638178857464, 15172831853577650839, 12922697597526240324, 7829823799088278618, 1783927422614660621, 4975249353684987436, 13048186608776014077, 3034445649013398243, 6966167031354634355, 7794510095811729812, 8010670397007670803, 871847630272290682, 18441078654886601219, 1106728433230065324, 0, 1606568297193092, 17457628753812655267, 5096693283465186518, 12947605480618213072, 13490514080936595140, 16186587491946121120, 10245245868334896235, 6026705707665599719, 9827345407768028181, 2812471843237874845, 12940670116574659651, 2714930976118111710, 11931084046533097040, 5957825878304116293, 4815270995456833861, 3281433232253188744, 1527514044633931889, 3155608937877823823, 496495357063373704, 12643114535206930756, 2926290280590787897, 4481685646324082958, 2913086696180341350, 4929647997916999987, 9053067786296036128, 12860916533743270733, 13426707234447106813, 15934882759672330788, 2173747106952139997, 5260381980138555939, 9238536158694879401, 88, 1056, 10194964851803169917, 2476887483552371976, 9610004573075108621, 4964236593939309395, 10117579878001530331, 8588168632019162203, 7961669463441676499, 8688363314921128388, 7669238601546834041, 15117861700401653408, 7267798175629900560, 18420331634788000621, 2168204218347522931, 13774182815867438503, 11793649490935032382, 264326996749206681, 422815844549413164, 11144132125283193307, 16600930886850462534, 14741236577529096830, 7550071867985447349, 10163945784944658272, 8810849992229527370, 979169410947035438, 18181508983255172512, 10501853123801116024, 10292737970295456228, 632012914013142222, 9098012027422757538, 7698805642109006453, 0, 4128, 6496253015800789210, 18063315295058131399, 14099326864720264780, 16744359797696928029, 11669954633423859445, 10923938539628559259, 10579480970462933513, 17315553376669597828, 12114095292572219189, 16129781670858537825, 67936491912723144, 6285840300661422802, 14359460599290704174, 7597471307904508314, 8469569990667894210, 9117246600999250277, 14614928058075190380, 13738364908865630160, 1806905237893315697, 261412144627674040, 8380596589382515797, 3809925330596605534, 1983199361335541287, 6337901890572878101, 17063257729896061936, 12690697575318882146, 3846044480011221270, 10729939698274680623, 5297971463863936522, 8671284646676347574, 1679902783560062568, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2643697525295255282, 7848268271641614303, 1670964981039714496, 12506995107569119516, 16020980424362300069, 3910461774754452973, 14887150284650111993, 11430895388638705560, 15925982986489674986, 559122298435457095, 16369319727902045750, 5911900249842037740, 9993545485068101534, 16804807948024450931, 6109216944498588777, 6962786378900996817, 14779846517676698965, 14597810963258762343, 16333362039819991192, 2239891938742671995, 8902636803530046125, 12348911713752556021, 9576130314342554279, 9464686824958661262, 14724291818312841818, 5956660324772534609, 5179789141411429720, 14891365206755013222, 833106187556617464, 14690990432528119604, 7399742180187746173, 0, 401642074298523, 10076989882539553734, 13617634258944637452, 11664888937794835322, 6832371865971954132, 7435465380685145582, 8856983143236954540, 15647394574465449881, 5004639611979401749, 16333513927375132208, 11586223746088007538, 17258599442845821467, 10089347514894229223, 8927362828162004403, 1274761678102044944, 13987176689734561031, 968318691601385838, 17920302096119022338, 18172419653743826470, 5238866342343116613, 4715585282245523496, 6782917713521523376, 845034972551066538, 8264516316211712068, 4395820162956710988, 17367170950581948054, 11715439359473390301, 4924405821869545305, 1674381281184830519, 4077397353846458666, 16570851802495678006, 0, 528, 3020492374890726247, 15867024276402164724, 2691485309401819348, 10383311521670833729, 16323720466012865692, 12111425008963394821, 6863497050423701439, 4068736078963485223, 6871052579055075230, 11135759119963236724, 8026699645344521142, 4857505768584918289, 10792639723427933554, 15144263097518946995, 2672819086738268108, 9175748808845810742, 8523928999979138359, 5837654600063955860, 4020408003683484830, 6777545915715419993, 16222025381660955186, 14681340973312169871, 11211579677305883898, 8623233971250462580, 418056849863168392, 2919384330136358405, 2666974936005298869, 14966813495153624489, 13584072213050301608, 17057575786157171701, 0, 1032, 13084260837127404333, 4018109146681745349, 14498381569327145056, 3778421823029569719, 1344624249217908323, 3634653398484528177, 1428985706412758663, 11382569756632997337, 13894906302086601399, 3911680161282028629, 11467762927868003365, 10098326072301516020, 16073214466625742345, 16150512194511843089, 11525294274796193451, 15902507139806774023, 13926886722650908730, 2974304378722638293, 5274544965980948277, 9984170014312577610, 639485734140932316, 15088403650698955530, 17189134684458608982, 6515320870350778492, 7902492290152572474, 17310456195349246143, 4070136787975548901, 6345872167795009033, 3095930865537762353, 4232664728858134772, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 392081819927674604, 13621084556403650323, 17078772340992927473, 862170971660204027, 5676881743340217488, 5517012370953012053, 3863387227510711423, 6521284656283570782, 17282496836457066698, 8668839984066399279, 10481218501610762636, 13268880552322298648, 9575112247205521418, 14191613402325013881, 17855143966403217682, 8464300128340058390, 4400313738036540825, 14739186344673284697, 1501891124109012983, 9798699259742823392, 8843421723884165135, 7746605484191389759, 8323169935435436763, 15323881858459172368, 8509325593168557185, 14233099751914870044, 12164983556041574509, 17356025534910089368, 2031310896521954322, 16067965450256037769, 8147499972447601337, 0, 401642074298403, 9851586117636382793, 7414079509745519565, 10414894202973226643, 11403399710197601656, 10230759118395809329, 4887466173119518776, 12376579030877442488, 15222686873173021915, 11343634646223977946, 15054143113295762432, 8578483304162845495, 8187399805941604842, 17460975957431844228, 12368453570037757143, 4715095521846408852, 10685847052710927197, 5160934306801665605, 12877482432527277885, 1026289052488784895, 12183816968946827507, 954239020314042893, 1899038343674936222, 3582199871763692750, 10141562795735590523, 5883730844910027408, 10313342961711791200, 10308552102917724507, 1101239144209002141, 16732112788727027442, 6132059608254040410, 0, 176, 14015299246960655077, 18240053740881435667, 9264051620447261114, 3770835013589498382, 14269426645353023865, 1064418857115644823, 9055361938666247589, 1923541152082479674, 7329032621716426413, 14147095007921770778, 12290092320014837503, 14167154425694482177, 2008826339817234435, 12727493810822145141, 13765995246049388004, 5723824967382588797, 11506863252089006870, 13547802874613831044, 2099106023167119258, 6345494554579617353, 13921991112058773762, 5885105447661412229, 8709961227558437878, 9751610933111772233, 13912537796384226859, 5691895930177454540, 2936046437280927758, 7163672760378086559, 12965649133168865250, 17131584050600476194, 0, 1032, 15909096041365347974, 18432189660917429733, 2798890989547891271, 10768372030970716894, 5935807051329113911, 1259182408195029650, 16024750973514577255, 6103595041913569283, 914770550723164908, 5067028895751058275, 5242612139537538536, 13359135899043031769, 4430959127423856282, 16317056360529517539, 2634255659160911215, 15590656855559575839, 6832335878067392309, 6045109056629836176, 18146646330136390606, 6482705684632040588, 2770791364887326735, 7707774010999656594, 3401430074469265273, 3500862351024377705, 5135727797169111985, 14940852959892477883, 9633218853985087472, 16966092255533854383, 3065488485208441055, 15703076512693482766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4099276459869907627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }, last_program_row: RowIndex(19) }, program_info: ProgramInfo { program_hash: Word([9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, merkle_store_nodes: {Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]): (Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350])), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]): (Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693])), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]): (Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874])), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]): (Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361])), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]): (Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305])), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]): (Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195])), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]): (Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063])), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]): (Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661])), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]): (Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829])), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]): (Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223])), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]): (Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388])), Word([13190842942618341421, 17548956981569849952, 15418963848144418856, 730733050713174879]): (Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144])), Word([17191480143063228124, 12589680459716948133, 10946639844735547820, 787516000067494874]): (Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675])), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]): (Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115])), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]): (Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257])), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]): (Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555])), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]): (Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882])), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]): (Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979])), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]): (Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987])), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]): (Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910])), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]): (Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054])), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]): (Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742])), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]): (Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928])), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]): (Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979])), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]): (Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106])), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]): (Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594]), Word([14699717555081076654, 4746435082174818730, 813708662788963698, 810806105436991594])), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]): (Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045])), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]): (Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281])), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]): (Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828]), Word([7481106124656138857, 15701278658979622977, 10594307887748114695, 1271681404559784828])), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]): (Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171]), Word([8685862689121056404, 22002718222056080, 6470349339189627848, 162171956419094171])), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]): (Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992])), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]): (Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004])), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]): (Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023])), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]): (Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537])), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]): (Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225])), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]): (Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947])), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]): (Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552])), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]): (Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444]), Word([16982412062719753139, 14539706782548677236, 9516947633545542451, 568128984770113444])), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]): (Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548])), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]): (Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987])), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]): (Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035])), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]): (Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414])), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]): (Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212]), Word([7901669741913940275, 2676076790248429841, 7183611356696016060, 1938288097969569212])), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]): (Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439])), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]): (Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955])), Word([16002133484205557268, 8413116937675482636, 12449052044564295509, 3039249045473298882]): (Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802])), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]): (Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887])), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]): (Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948])), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]): (Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093])), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]): (Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134]), Word([12526278552863588878, 1670719453400392876, 18358823493852521322, 1240067944793321134])), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]): (Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228]), Word([17993017087997641271, 5808763436878906560, 11543739521656962714, 1405103854912651228])), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]): (Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414]), Word([2591375019783745655, 8015778681285537565, 17578080770996639687, 2928872354236574414])), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]): (Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703]), Word([9136672917227524458, 6030009050554484352, 12435125861127256693, 2974051506150805703])), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]): (Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205])), Word([15674463781995314698, 14464505438699472696, 6467194644802591262, 3528302404251149537]): (Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011])), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]): (Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301]), Word([1405699014889740084, 14013046305941666355, 10417414171593962773, 2844878341839501301])), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]): (Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986])), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]): (Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057])), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]): (Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689]), Word([3597515369448291039, 1667495422733289765, 17303218237506387342, 468912532899078689])), Word([6986051014421313943, 678198511255499146, 5261836282734195530, 3810997979073436144]): (Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682])), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]): (Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268])), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]): (Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513])), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]): (Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565])), Word([14300690858557908768, 10507781723268256024, 15904113820267812857, 3969227413967165439]): (Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012])), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]): (Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850]), Word([11934214708621870744, 691331677734325115, 17965922536791202949, 2742604638132828850])), Word([3597148481979750018, 7983354472796334988, 13544278068440573252, 4056655181729488986]): (Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865]), Word([11569107685829756166, 7187477731240244145, 8326334713638926095, 2239973196746300865])), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]): (Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777]), Word([6071348004122092698, 13039859062734201588, 5633518569501799708, 1072811608667331777])), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]): (Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394]), Word([5009154494627340044, 3172285993689068837, 12977328012193691236, 3399602256565600394])), Word([16568590159814885376, 13276446786965344698, 6390176043704481341, 4236530685983566979]): (Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690]), Word([1531096329227431566, 10396279320957153079, 11399097763451460827, 2476342835701309690])), Word([3192208859458128235, 11728532665092266005, 492034778879809254, 4243878262948068093]): (Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620]), Word([8322091277119180762, 11729978832222981985, 15954928019202204932, 3416208934581357620])), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]): (Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789])), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]): (Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094])), Word([12080505668088055898, 571051185085206587, 11035321487777199720, 4426183469020559057]): (Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362]), Word([3535038408270342604, 7568123861223701339, 3597813201789850256, 490415785320792362])), Word([15704141825016550533, 9702133105467572793, 17112005317888626361, 4547270738239016205]): (Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961])), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]): (Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580]), Word([8408046365471540227, 2662292955057793903, 4226388297479576450, 1459746174763861580])), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]): (Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960])), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]): (Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031])), Word([4045587508292687318, 3477196676977645246, 6296685615391332282, 4667648627484990682]): (Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053])), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]): (Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562])), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]): (Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666])), Word([10047598218150573206, 4530551255734412008, 5135152177315026244, 5136529096604752661]): (Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897])), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]): (Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447])), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]): (Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646])), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]): (Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404])), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]): (Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152]), Word([9394589772933367669, 14579018520272275408, 3210908204569932003, 3050114434918646152])), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]): (Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664])), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]): (Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103])), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]): (Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169]), Word([4587622888555803751, 13610098627129405084, 9171377283614195668, 4591758751870604169])), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]): (Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758]), Word([10804380279573693722, 14483852602370717051, 3369269827863158856, 1456394486912900758])), Word([3432350596910229027, 17916861794212443713, 13786973740436472151, 5850439935268184802]): (Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070])), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]): (Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005])), Word([17200367375744481466, 7173935273650285464, 4919254770572885679, 5994506765282741350]): (Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443]), Word([7390567561970872999, 6922246493794922144, 3453421506602300723, 1408350034180458443])), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]): (Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573])), Word([12633292943917459679, 6439871695557339929, 6944991753981667445, 6046843502017063928]): (Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331])), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]): (Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166])), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]): (Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079]), Word([6361589938523777660, 11807529033202791288, 7989433571969962515, 2699251935539566079])), Word([10077688234816402506, 3867170110404705980, 14977857572922113715, 6426617178264224447]): (Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820])), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]): (Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057])), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]): (Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131])), Word([143481666315169289, 5622547778651542966, 7101493876925952456, 6502742246135181955]): (Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290])), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]): (Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202]), Word([2852976121295438129, 2806800050654790917, 13240785659200951958, 2486261825154534202])), Word([11258275789878222563, 6126155174074085420, 16166207024589258835, 6538548660514489910]): (Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822])), Word([7889430716910419531, 14576813768493677077, 12290049844847582983, 6589448232299292106]): (Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847])), Word([9787733042104514727, 6685242697806496612, 17803905955470949916, 6680588871692614404]): (Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441])), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]): (Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186])), Word([15695915255737157591, 10149314375997995607, 5171427370319057728, 6967789539213736053]): (Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516]), Word([13320800758773165257, 5213392577382401121, 6696982961545949080, 3699901592208350516])), Word([17802550886941079335, 14293116379440073386, 6936688310934136274, 7127639471265202992]): (Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818]), Word([605386594765628255, 1095435790537612282, 7912669391696546979, 3964434845610204818])), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]): (Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315])), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]): (Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794])), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]): (Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539])), Word([3841149689888075775, 3494874406965850237, 3216622481702810440, 7458636614191504664]): (Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558])), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]): (Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579]), Word([3840533837275016078, 6742379836675073178, 12727866131421682079, 1908063110750251579])), Word([5566342864887828581, 2912451680115539017, 13467125261803475601, 7568088041353600947]): (Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502]), Word([11346815749277083123, 859117116051274381, 3376052340934782986, 2095734609894136502])), Word([17235583951376661684, 10083644464194131865, 11409601709860874655, 7577240030531334829]): (Word([0, 0, 0, 0]), Word([0, 0, 0, 0])), Word([6773343764150970507, 5433787848085812740, 13359755994482809459, 7786556093092244045]): (Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137])), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]): (Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041]), Word([10498953993187227208, 7966893092136728999, 12995544634956206557, 2841797288974373041])), Word([6279479133009007084, 11401662032408237226, 9565267648644581712, 7830928412974239573]): (Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378])), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]): (Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873])), Word([7983625839178916306, 5764166547129930953, 4707620800940860897, 8172658278540769225]): (Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262])), Word([7278338892935452771, 6745373714943841014, 1010566802979034079, 8532110148832582057]): (Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692])), Word([8169136595508989707, 8243120424069329723, 8738550448108656333, 8576884522729946131]): (Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997])), Word([9752828135749747582, 3710927128543391430, 18247880090110070989, 8784551664702000555]): (Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385]), Word([1363381549187485019, 5341376580899763503, 10266127647741586957, 1664715822757989385])), Word([10714400302651658947, 12896032539950153667, 14644371771687359561, 8853254989027832195]): (Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709]), Word([17697452907874426808, 5956252311079559799, 16951130280809220578, 7324270570011397709])), Word([11415858355095084095, 4594972467727466179, 12150072248829203101, 8947813715439776166]): (Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542]), Word([14521673759358910476, 17640957108605213856, 4488010974505873773, 4402194598394806542])), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]): (Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373])), Word([9997025551367286476, 12250115225408866497, 14539938448104360178, 9017805745904219378]): (Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509]), Word([6529321350747691322, 2369118314416134221, 14749665906520275381, 1098621791380571509])), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]): (Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553]), Word([11776240979341984975, 16634362485568577506, 11760547346592305266, 4571184991775900553])), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]): (Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815]), Word([14164690091458710855, 12742723480735450594, 1355101223253774660, 327051675466461815])), Word([15303291583700576086, 16612499901671360858, 6444928163424779134, 9217688198259020873]): (Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864])), Word([16921285376760315539, 4445695104649211786, 15002322448892175266, 9222584557072414997]): (Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722]), Word([9719038431785031627, 3235103812655532636, 10151263309029441796, 3780158187757522722])), Word([11746894431582240550, 737232193019922226, 13442402277669779496, 9299070803547773887]): (Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766]), Word([8701907534575455700, 8883164660418241821, 1737881807742287125, 1539262223102213766])), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]): (Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757])), Word([17826823084639578348, 5184636437620014612, 14308957397020647307, 9402732915173653539]): (Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665])), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]): (Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229])), Word([13747670991316450712, 1172354525619892499, 685177444088537696, 9494811788571855137]): (Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312])), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]): (Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378])), Word([9809010169677958571, 11614032490706782401, 1432535583307813560, 9584838209789571331]): (Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713])), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]): (Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980])), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]): (Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546]), Word([11291658160204975080, 3319227360579127132, 10320124664591158457, 3409955787521638546])), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]): (Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822])), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]): (Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295]), Word([16903610831203055692, 2734332116881329900, 7700021291788863086, 3862018245546197295])), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]): (Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848]), Word([16294653838354045684, 2193197165210075221, 1264111440551853574, 525086553076832848])), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]): (Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796]), Word([5893039117368206833, 7604725979619535425, 11729567497137566546, 6896335025392018796])), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]): (Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170]), Word([4026809165176549162, 6722818553137845987, 8947073501882758180, 9636655244062289170])), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]): (Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448]), Word([13463115553848141913, 2234313826766699609, 6628397615987899732, 2827452548907499448])), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]): (Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294]), Word([4895802800415601645, 15476509782342646098, 17969866374575441833, 7532225864810560294])), Word([6278199066229041760, 16311980358263143866, 3873428331219235942, 10293564703875496757]): (Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416])), Word([16783688595993307882, 16683666618221250293, 2037538602671525616, 10332684425259766378]): (Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091]), Word([11306294485504183418, 14372508567226056949, 10257673953775170961, 7347952386823745091])), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]): (Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463]), Word([156695302078341182, 2614653764812468045, 12582648781927804036, 2041201760208061463])), Word([17847783635742578791, 6982390677875977265, 5346405803827927574, 10389968640106345666]): (Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361])), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]): (Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992])), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]): (Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401]), Word([13576424288885502032, 16034758793396238238, 7359912013279161995, 4551344463330998401])), Word([16682490504911598337, 12553235793846729151, 1125267884919010622, 10704544007021652665]): (Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957]), Word([1515263932974556950, 13802305078162013256, 14155267753658493882, 7258483858411019957])), Word([7713356742107933684, 14394767747119872906, 7633447735505415433, 10711135650256356262]): (Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144])), Word([7968615064424337937, 1702639151308436124, 14573334289005817978, 10800717278082241229]): (Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284]), Word([11170981928111944793, 5148523130693116298, 15871367056359503175, 6485250385093061284])), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]): (Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325]), Word([9233812072842079621, 6671569500746161189, 645737594433289846, 9593384516431683325])), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]): (Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765]), Word([3491467487177008025, 18221406568666854232, 16356397084417252234, 1538761618144968765])), Word([17261598987103457340, 16170722649741451802, 7398412186345361478, 11258799517657859115]): (Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814])), Word([1975195610270384701, 109494945442785198, 1622259821444479979, 11299246364087669441]): (Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831]), Word([14531577091064785866, 14478329038843742212, 15573902416339116519, 3707642964779488831])), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]): (Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446])), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]): (Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005]), Word([3991610620715329894, 18343802458191631930, 2595781633135092903, 5785277143495754005])), Word([6451687531525031522, 16102586076766998309, 10877292644997462254, 11456053754555611789]): (Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995])), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]): (Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267])), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]): (Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982]), Word([7585549374847224159, 3047288099099161097, 13431868204571712333, 4173972336275478982])), Word([17311662800950957701, 9666810111057935870, 8790320373617118241, 12036014063162441995]): (Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539]), Word([10775960781917369910, 15745271547738838628, 18214585570410449253, 2141128241026376539])), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]): (Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512]), Word([5205848095116621817, 6632852171799423847, 5538816239062299913, 4040900473486356512])), Word([1363116324348425804, 16843841372177310645, 11225339855204849383, 12098256081247237305]): (Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118]), Word([15759245781060327053, 8651306991551919473, 1007632711365386409, 5059048402164262118])), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]): (Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009])), Word([14916473491970765698, 16808426016846303935, 13175204391709088148, 12165836579790674416]): (Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089])), Word([14278149425947938131, 8830543101101850994, 4247579024591319165, 12421494154636998980]): (Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445])), Word([6701305982140326477, 16209852248089411584, 9367486892136859931, 12475359606430236063]): (Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140]), Word([16104115186119694102, 3385365138628625844, 4047451188020276989, 5283833390754661140])), Word([1418777206478642671, 1086272827953357414, 13333986128605291175, 12622204459545563713]): (Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159]), Word([14599286198013947524, 5478159134755618088, 5822970462210837761, 5932077771754348159])), Word([8184150047773628941, 5309851822823304166, 734579595355185414, 12645397502010029031]): (Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809]), Word([13819563594593520825, 178930620081345139, 17928149299158490145, 966461501228531809])), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]): (Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037])), Word([3631709318383903915, 1479741680283558651, 6316109116759262169, 12908519712326182094]): (Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925]), Word([13487209600383596313, 7884156680105936667, 7807194553872838561, 9988673253211151925])), Word([16364072711563314218, 8680826946768008494, 8827581652194015975, 12917736039460991315]): (Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386]), Word([10175931699548654034, 15162046055971105538, 1194257770182870069, 638415270357423386])), Word([10240399888579978058, 11980913266776497326, 15817676351110653867, 12961983625333298446]): (Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721])), Word([7061863827368340100, 568026302621690235, 7892835898224002733, 13098998435586379742]): (Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981]), Word([4587034485726845202, 5452720220830946319, 15622535499012086715, 5163318747710759981])), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]): (Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072]), Word([1799612852864078116, 8911988199792566140, 2770645853688704834, 5245350660620269072])), Word([8501354343463522082, 14164101075188730599, 12540449626688486894, 13264416375505828979]): (Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671]), Word([6890338765285148676, 16465305462210979340, 1559857762145226502, 3464029730236878671])), Word([6384975908774756962, 11522441658859715689, 971642957603512741, 13313175758860095361]): (Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269])), Word([769773935990321492, 13982548694223290638, 9191429625447033826, 13477213882525530558]): (Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571]), Word([4660997969723963906, 7795863912383732003, 7651144559093280129, 12058532240616571])), Word([10095110350197481234, 16754927149671889804, 5794054697993172373, 13697490197149520290]): (Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902]), Word([11518398729237529927, 6461960461150937577, 11234208699685110116, 4379160819171915902])), Word([783872972672570241, 17009386614070788809, 1620451599046508738, 14097521971534230987]): (Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741]), Word([13171191895283252343, 4967471993524838998, 17039560476853477706, 5637000416510512741])), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]): (Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515]), Word([9857272261467358701, 4691189963638172987, 3394470452303829436, 5439877186966589515])), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]): (Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028]), Word([15593989025428686711, 6830942213549652008, 13114383859060884199, 3053506549353753028])), Word([2210664882600769081, 1970940532663876801, 9698543107861049951, 14215078170257699948]): (Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709]), Word([6715480276341239622, 17622296017563716652, 2870119458052011204, 5463024993890883709])), Word([4155805307514823775, 13767673705116584912, 2128908174209062000, 14280577264721470009]): (Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725]), Word([17943605159295944272, 2543536838982224250, 12028953864078157333, 5075009933050053725])), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]): (Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317]), Word([5458312965436071919, 12180002662844597029, 14440000721594118913, 10232651548933972317])), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]): (Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808]), Word([6737563254999857180, 17617716535832219618, 10622562591474756769, 4224277995775353808])), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]): (Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699]), Word([10713348141912934044, 3912178578481351300, 4766343807006379639, 8152946901198636699])), Word([8092582813770725163, 18320289632286565682, 18342659779394639565, 14403144114495728312]): (Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000]), Word([3769945351214152035, 7469202120892526624, 379029646267533068, 11467831642914811000])), Word([11906383717123954639, 4495840065004669051, 10229404979573251436, 14549831649316276987]): (Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821])), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]): (Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909]), Word([3049191375891481776, 6027646082252118273, 14017620000446571203, 10046411696974019909])), Word([8093713986304565024, 6683480815383198279, 16585223719164161917, 14699734404521972565]): (Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028])), Word([852551854027645333, 15499351590521579421, 1342383109919052612, 14788025673029660269]): (Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352]), Word([12203744453072453296, 7141863219303444631, 501288423901964251, 563960044861138352])), Word([8928843363506044055, 3149275884893389422, 4993712340608026279, 14799179392886088847]): (Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271]), Word([5424641566596402017, 2303287366273484453, 12354701310739373196, 3011434336524422271])), Word([3188955840837796722, 17640893095583126920, 14690471846913619905, 14941338482845832513]): (Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800]), Word([14963986415178008725, 14532956656774501606, 10043099537758467008, 3446615689751686800])), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]): (Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394]), Word([16481480371722421471, 12962335603630703335, 382365863238141755, 14401146627915118394])), Word([16275765473469464592, 2953078902181057893, 3981926055582992410, 15023519093029762004]): (Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977]), Word([15841404828892380962, 13123234819662369960, 5456641096570689114, 11300052908284048977])), Word([14721666955669192867, 8455854366770470773, 524097494637038517, 15108014279657316675]): (Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800]), Word([3099556779638818133, 14570418459022495509, 17209356172849038591, 5636050577868052800])), Word([5457450126874468407, 10689625788190426235, 1310738296969150738, 15177267085502055692]): (Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159]), Word([4102268297800748332, 16322356494526406732, 16994087482505079850, 14329684231729862159])), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]): (Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932]), Word([4268006992851463842, 14506457128915819607, 13668536977299122052, 12708449346165229932])), Word([13142100355974731164, 7373782609404016168, 12137034191284675235, 15267584243587914814]): (Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697]), Word([9914883151124511737, 2520862578017620080, 3049925336228865628, 6501333336014617697])), Word([11531698103252198029, 514765863543485731, 12625400259302497735, 15274735534568445186]): (Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387]), Word([9212177872611643581, 10985447739281342247, 11607925359102538960, 14316484072878608387])), Word([4927041635269984615, 14115328727242206825, 15507827819493700235, 15288167886564912445]): (Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470]), Word([6035546400232273884, 5494370888984847475, 5027959732064350199, 10648340619464421470])), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]): (Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507]), Word([1632352272931598773, 13373839708502289855, 10272230035455739196, 12044926024433128507])), Word([5404036605550742542, 5072779045409325594, 2007486859543667101, 15485723958086254548]): (Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253])), Word([7380494641903612464, 6658051037189709530, 1598345256024049520, 15544884248567796897]): (Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783])), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]): (Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054]), Word([6510245351129855014, 14499781813891764676, 15415444664024674250, 15020644957368440054])), Word([15182906631253422133, 11210863479776221297, 9705815985032988063, 15681564952203239268]): (Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661]), Word([7762110520822785747, 15429768501160942121, 12180343601146840686, 13110597419621835661])), Word([1647346434040935821, 9479485455816730668, 1481410489053062942, 15698839004775251388]): (Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643]), Word([6391490631968727471, 10635523455095202572, 17817390745962571400, 1455820373918112643])), Word([11217554745661218137, 1254401472818238349, 11780985643636624657, 15930386039286304257]): (Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174]), Word([7524977039508561914, 3055387227595582549, 5337721299951095982, 10414890455199545174])), Word([11193463709754597275, 4687622073211056750, 9119685337510911899, 15984916424506674960]): (Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241]), Word([15359909534839720370, 18318319650890754454, 2680287043082032897, 3966575381596623241])), Word([15588393932722205321, 3014421399727113191, 16974809683756463518, 16027452425640143721]): (Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046]), Word([7506857997622957556, 10875981862989180914, 8286973802024589221, 14625951212107957046])), Word([3860596429637617372, 6554947514780740919, 13784339542180683209, 16095390482634395822]): (Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217]), Word([6232524979177425513, 12527657586268026488, 7199273373983737623, 9110556028668813217])), Word([2716770394206193982, 362567518346453877, 14278130375786750283, 16157765803262987253]): (Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697]), Word([10285273574406477445, 10358085193884076336, 2434476537487209654, 6026720306787293697])), Word([18014981229509410732, 14176208642919289188, 14793532609372582788, 16258038996058589054]): (Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019]), Word([6624360674817694443, 13995138081824377721, 8793226512399568408, 9523299032065916019])), Word([12896783327193558842, 14223520847319929296, 5231161851247674324, 16351311593357593821]): (Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432])), Word([15292884165239381677, 17354017007365527649, 18235283403765031924, 16502052609200735864]): (Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105])), Word([8175639808607885231, 15057488524410397820, 3256086896525912308, 16549058435568464373]): (Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855]), Word([5165403483994067838, 8621833651061017483, 10386289880036139513, 11199579522064000855])), Word([6495367580430056673, 5076188903290142617, 12440597605435697544, 16626831055447852646]): (Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830]), Word([15261229425597066902, 6277908017697274409, 4227476040890544387, 1351103020348566830])), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]): (Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208]), Word([1164247015370135465, 7799612277036514947, 11420825300197983897, 15668721591952065208])), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]): (Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214]), Word([14885546587311653320, 3739514343695545938, 11011166341483442498, 10150425085211425214])), Word([3145763642359150001, 7897572988335042336, 6193288093009236035, 16994348488259690105]): (Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129]), Word([6693828566576478062, 9974347315015299018, 16810437251415499748, 9485179093745367129])), Word([10798749058444003951, 6168130450702141604, 7408954842695441275, 17026147563136962281]): (Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909]), Word([9731053615716631609, 2500177426364872764, 4074597168154615882, 15227453932851378909])), Word([17008098382907755429, 1028295502599238628, 12638566816978689597, 17145758341827756028]): (Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027]), Word([13765044287689523240, 10143406322268804702, 17537689849071213425, 8975210496588340027])), Word([111967274994054564, 9536248623982663598, 6042602402422585474, 17200272701522564012]): (Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054]), Word([1870082289396567722, 14064949003056156855, 14126921475482258001, 9848833093575165054])), Word([14313238461606681048, 10538247441300629090, 17720672251454816062, 17238261909384191562]): (Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589]), Word([5583119793707713195, 14875734569327540391, 1745113605406493161, 9308105398669557589])), Word([8072532674895849860, 5223941016633909464, 12797973693661944820, 17332086611511481037]): (Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097]), Word([17785069920353893885, 12181610511466211054, 14696766909203382452, 9052223307518092097])), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]): (Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460]), Word([13146029447454426688, 13929020329594806690, 7535585724124566531, 16861943362254986460])), Word([10993240108549911562, 6065557944400892830, 7941258837795145679, 17448192827019270223]): (Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355]), Word([1196614781450255080, 15954236593773889073, 6595781758631550588, 17371251785288749355])), Word([3888425849842771009, 16996682999008100764, 7098985071818251871, 17459654002179420089]): (Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306])), Word([2019362789636238252, 4881686650820287406, 4909133469122434095, 17473436797172613035]): (Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219]), Word([9817293520112454397, 18000244251434114627, 8726413454644140082, 12102270733961459219])), Word([7487425037348922165, 1956217638218512959, 123048945093955622, 17522180546005380432]): (Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297])), Word([9730477409177006857, 17480075229477193722, 6186479790878476117, 17555344782525054693]): (Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263]), Word([1534320704104329911, 1067167308616339937, 17417664834701232933, 10334563823251782263])), Word([16729297220020279609, 9101907995765144749, 18227949116633400486, 17698385478566617794]): (Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484]), Word([14194125215964987460, 15844283789357152624, 10326080260423903048, 76481665721782484])), Word([5459324076910258714, 2715526985710463271, 8706353568913208333, 17707468888855250552]): (Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941])), Word([18262299801479393995, 2548638218321300653, 6321476038940663933, 17719903204537459267]): (Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814]), Word([3259840020995850274, 1955770763221708273, 16741517283537178957, 6208262575450146814])), Word([17867126075653024918, 13358502965677383543, 1509302598027765781, 17728311630022719992]): (Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415]), Word([12551890022622607975, 7741993066542755358, 17047903593589748855, 3755644490112375415])), Word([17764660672296400890, 2270358193567233748, 1759338745692426825, 17743296383167139941]): (Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966]), Word([9580231643078727010, 11299141597397477477, 10734894173851293848, 15367839016167866966])), Word([10485961955196622691, 13441840831192481511, 6078856539768404764, 17864427699814990822]): (Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320]), Word([380242875898080855, 17055454844409939598, 15136303572069031901, 6114301609965976320])), Word([2856609154075759039, 12776076242729478628, 15730939018297634347, 17876993614336549306]): (Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902]), Word([14865076421927260997, 6733926354869989791, 6031424015752692995, 14169937261764597902])), Word([8210210402666457757, 12346888287403415558, 9171514665786205857, 17919227531564609820]): (Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880]), Word([5831686759021827687, 2007745977793688231, 4531961776655959371, 11419029465616987880])), Word([12224078686353806515, 11451311687035481131, 9321073197525705635, 17950958067790911361]): (Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725]), Word([15843536302707163227, 11250410302008099333, 17454633778507679755, 1136761107663850725])), Word([10838788592058011920, 17324949700844653466, 2414632977575414655, 18140940028430619005]): (Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914]), Word([7878858208803821817, 15778070601049834593, 4818331171663007243, 7791574802681449914])), Word([9704899558699429294, 888934449251485682, 431693366268687850, 18154544112943616783]): (Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781]), Word([570501813714977969, 1871407190021905056, 16365155059730069592, 96373817867264781])), Word([18046796134595922123, 149177996845839981, 7131765588342576721, 18231795817679852011]): (Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033]), Word([16083490555960573055, 10554044942365811137, 6717174434164247328, 16887281882883677033])), Word([9792536038170012532, 5334903103249849494, 3126812150848513643, 18231944901762444297]): (Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910]), Word([4582144536293102146, 9269530318385652642, 12118844264596008701, 6522025486101713910])), Word([2007554302483830424, 5859686910273439185, 18262930357764454476, 18235967302672812070]): (Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134]), Word([15944157248647461489, 1398275880958592016, 1909535179135680085, 11052039712054633134])), Word([7844338342611588357, 2340596165485472322, 13679522615119311893, 18241876085345904144]): (Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331]), Word([2875079704164660567, 14166261742124196884, 12383124306027484830, 3184947252558081331])), Word([2490458683104779985, 16738008805434919226, 2700599825558420210, 18254091674337546023]): (Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497]), Word([6111503942509124479, 7703676124098578528, 15836918219455478393, 14199796850044420497])), Word([9701025282533463304, 6908536088374387903, 16649151904726767446, 18339908092645480103]): (Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540]), Word([12365615317603094162, 15233395488851602361, 12718548272404288288, 10086125990937166540])), Word([2406555040894638492, 13046612881607389552, 4647344913357899135, 18390947994356851961]): (Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998]), Word([3698679818884153447, 2854011133060452491, 9705870317226154568, 11829774003193377998])), Word([6301397172966377848, 13179298638617871403, 208561277675731807, 18401460835794969414]): (Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]), Word([17586296187399257435, 8046751734003554711, 8621731950173158251, 9588298017293500959]))}, trace_len_summary: TraceLenSummary { main_trace_len: 20, range_trace_len: 47, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 128, bitwise_chiplet_len: 0, memory_chiplet_len: 2, kernel_rom_len: 0 } } } +ExecutionTrace { main_trace: MainTrace { storage: Parts { core_rm: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 0, 0, 0, 0, 0, 0, 1, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 1, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 3137828705454, 1, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 1, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 1, 1, 1, 0, 1, 0, 24514286761, 1, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 40, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 2, 1, 4, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 191517865, 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 1496233, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 6, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 11689, 1, 0, 0, 0, 0, 0, 0, 1, 2, 4, 0, 0, 0, 0, 0, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 7, 0, 0, 0, 0, 0, 3, 1, 0, 0, 1, 0, 1, 0, 91, 1, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 0, 0, 0, 0, 0, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 7, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 11, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1, 1, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 8, 1, 13, 0, 0, 0, 0, 0, 5, 0, 1, 1, 0, 1, 0, 1, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 8, 5, 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, 16, 0, 0, 15, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 1, 1, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 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, 16, 0, 0, 17, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 1, 1, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 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, 16, 0, 0, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 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, 16, 0, 0], chiplets_rm: [1, 1, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 0, 87, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 11377866377890790275, 9885671831159451104, 49905639292627904, 594790136239256278, 3558778201956820739, 1106728433230065324, 7399742180187746173, 8147499972447601337, 0, 0, 1, 0, 0, 1, 1, 0, 0, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 7288090792972058500, 7008881577152522467, 7526556702499462773, 16136160484984138575, 12957959164911169922, 9238536158694879401, 16570851802495678006, 6132059608254040410, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 6190635258012880107, 4840757955412667387, 14304772746964984975, 13670896049781213124, 9440211366785524370, 7698805642109006453, 17057575786157171701, 17131584050600476194, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 88, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13342492399873323769, 4511615971967153504, 9085863547783897978, 13728083094831419091, 4968648927826019469, 12828040835569540857, 14858685484860085108, 11332670461359993442, 6031863247325663438, 10194964851803169917, 3020492374890726247, 14015299246960655077, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1439796670523758837, 11189511375577512439, 4029278259426396811, 5555139373262852832, 17195207199910519646, 15946070950510533025, 16638144790071955925, 14431967032738938661, 674016650738724202, 2476887483552371976, 15867024276402164724, 18240053740881435667, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2591609871503882494, 14523290705070057408, 16053154709446024998, 2905384006316447019, 6734621562241387182, 6868712626693654693, 14803289513390493682, 10393518078208184991, 9655491867310024790, 9610004573075108621, 2691485309401819348, 9264051620447261114, 1, 0, 0, 0, 1, 0, 16310674867943291767, 6055575173485499620, 12415403453461233454, 5919456033500076693, 11602649596278030541, 15730095788089532534, 12155959663009124293, 9715952180361858627, 16719465941571322506, 7947368985060100292, 2462224494429193628, 4753798685424869288, 4964236593939309395, 10383311521670833729, 3770835013589498382, 1, 0, 0, 0, 1, 0, 18087077157995694324, 16330777485816030986, 10063042555031126160, 5687909194194711965, 7973996941547777109, 7908104163460391198, 5239197399579256268, 15224252119305799711, 8574904634803746916, 2182109332887118586, 13071332837477200404, 1540176383869885892, 7961669463441676499, 6863497050423701439, 9055361938666247589, 1, 0, 0, 0, 1, 0, 16967670111924614213, 17486841943826861107, 18307481886056309438, 7941686916236651549, 3672880019205947738, 2236539493336923746, 5670979983981263850, 8194394828646838882, 15431555872184246136, 1087022739668739893, 7204946769828595498, 7978597004657283049, 15117861700401653408, 11135759119963236724, 14147095007921770778, 1, 0, 0, 0, 1, 0, 15248998622285712496, 1816831098907864072, 1977941839824239836, 10471520652203868473, 12969815742735761919, 12829755263022627333, 7984319522957739004, 12444330148186854115, 1895854814022398925, 7979854057356878352, 12651590612371699683, 10693788391520380705, 2168204218347522931, 10792639723427933554, 2008826339817234435, 1, 0, 0, 0, 1, 0, 1949341260302477275, 10525442150725175322, 10268663784703415650, 4586059525590481046, 10757916804785969985, 2326984138263422166, 5769086287272836702, 8680261223649739505, 9584551737159741567, 14209807647112141969, 10782010546727900871, 12476380710530844150, 264326996749206681, 9175748808845810742, 5723824967382588797, 1, 0, 0, 0, 1, 0, 13440535156983805468, 12080935995323460100, 9067005830434678477, 14314758709191331837, 1326425913004665964, 18320766430359725566, 13803823311240773956, 3919235389861209780, 4987801895818641338, 9475211165936098151, 6745878472543166577, 13055692992345669402, 16600930886850462534, 4020408003683484830, 2099106023167119258, 1, 0, 0, 0, 1, 0, 5892436324803940896, 7017064751240904271, 10317850206740106337, 16403500445172050158, 8998725782446855275, 15603212774947060210, 14994098977964244257, 12657319342943489784, 12145542090324719848, 17338503932931685384, 9012900451066906030, 7985393687855976209, 10163945784944658272, 14681340973312169871, 5885105447661412229, 1, 0, 0, 0, 1, 0, 13935905759807022949, 0, 0, 6981555831806437627, 3320646806195653797, 2577750295211676178, 15041604777168753281, 15743276195226846510, 18068871666013902057, 280994234174845985, 15850020848376370982, 17844212763579117389, 18181508983255172512, 418056849863168392, 13912537796384226859, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13711912288503888270, 502156843765695809, 360850050916534143, 10958079103202840999, 2778123425092199841, 13664544216029702565, 10293012497513243194, 2953143545478827927, 2456530167870834703, 10292737970295456228, 2666974936005298869, 2936046437280927758, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7425430573821419685, 13147348360138928114, 7183698983616787617, 17793074612839242130, 2613774562373586415, 1391392205806749871, 12632074680840502609, 9172592184988170325, 7343890316269580191, 632012914013142222, 14966813495153624489, 7163672760378086559, 1, 0, 0, 0, 1, 0, 0, 0, 0, 16752277069679715408, 11903841834984596874, 9070535322622906244, 3601655880141993647, 1448060333031158668, 3418909895274525076, 12384471116364520725, 3259030218090439002, 6483315548845037473, 9098012027422757538, 13584072213050301608, 12965649133168865250, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 6190635258012880107, 4840757955412667387, 14304772746964984975, 13670896049781213124, 9440211366785524370, 7698805642109006453, 17057575786157171701, 17131584050600476194, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13024110921086730221, 1131208899036558480, 18136552782870868471, 9594118340025725004, 1190658701913535022, 1352424102745866255, 4798141223555508282, 11702782905971311743, 18346837778669738664, 6496253015800789210, 13084260837127404333, 15909096041365347974, 1, 0, 0, 0, 1, 0, 0, 0, 0, 3587442816163675215, 1667157010810320250, 952274539956745973, 16218246678075491818, 9371121588404883743, 13301242752201603536, 12962488577647927717, 8115486282645452027, 15130142357101091527, 18063315295058131399, 4018109146681745349, 18432189660917429733, 1, 0, 0, 0, 1, 0, 0, 0, 0, 512402747638547729, 2053960715201569301, 15933282259815262093, 11582919835122342747, 7133056533056999470, 5420135027930584396, 10133257770726709126, 16425371230714077552, 6726588340010678615, 14099326864720264780, 14498381569327145056, 2798890989547891271, 1, 0, 0, 0, 1, 0, 1146202597936876238, 5907497589537577326, 12401833826959750188, 9217956011885162917, 1526213270499333709, 9924516287334785738, 5661452934218108707, 7380100170229652082, 17078794493496835379, 332864556927106185, 10333496212804492507, 8394319278312203283, 16744359797696928029, 3778421823029569719, 10768372030970716894, 1, 0, 0, 0, 1, 0, 1909941408887978391, 15888660883255058425, 301654227516565330, 12846799727083908462, 1380252317064967448, 11816233963570869158, 1899963197709801965, 11125714198188567552, 13618468821889769363, 101015634312276042, 12880029163967100393, 14939877513325106589, 10579480970462933513, 1428985706412758663, 16024750973514577255, 1, 0, 0, 0, 1, 0, 13790262192006840807, 12747268767129483984, 15893046134662715133, 1720195204565087693, 664031068804619792, 17484213571014188868, 18354595702287703799, 834873962620943786, 9650238821992519861, 17762248064501548615, 1606019581379521796, 823113708878672797, 16129781670858537825, 3911680161282028629, 5067028895751058275, 1, 0, 0, 0, 1, 0, 7370492772357229844, 11911421948164011982, 6120215642153888610, 16676527939404087356, 9404280000999464502, 8423043379628164525, 1735222492513760332, 11318806736621162148, 15407186837043713393, 13485211244653928073, 4257071131168813417, 3482639998457803800, 14359460599290704174, 16073214466625742345, 4430959127423856282, 1, 0, 0, 0, 1, 0, 15213348941945515579, 4080896831515632495, 2115916331101874032, 14072300156908432530, 4680481291290566437, 10485112285448962747, 11498487923782501751, 15870139479256453021, 15903424027416555998, 8883940618995723208, 11170081717188072664, 3366715262389109205, 9117246600999250277, 15902507139806774023, 15590656855559575839, 1, 0, 0, 0, 1, 0, 9281128272221551300, 1953391350014801803, 10361246786850296393, 15658716527747040980, 729009684537575982, 7463752398658534839, 4276681409258176044, 6806060556807781604, 12605480788735099613, 10386976621364522928, 8123337005847551087, 13912213856326486056, 1806905237893315697, 5274544965980948277, 18146646330136390606, 1, 0, 0, 0, 1, 0, 3184119643432893508, 12666055134254320926, 13347884086274478638, 10805338145914832851, 2509966126115291236, 7086318781105575433, 6019260256544801113, 309743103212430298, 6059068631740368787, 13373704167654916087, 5057603743378325948, 14981257187297131103, 3809925330596605534, 15088403650698955530, 7707774010999656594, 1, 0, 0, 0, 1, 0, 17563106072770942913, 0, 0, 11866022853402812888, 6606875518512322314, 16683125300631590273, 2813750347113564525, 17862871362988443440, 4210674244211222629, 3258729720361659960, 367186060507240673, 3229291246709926782, 17063257729896061936, 7902492290152572474, 5135727797169111985, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13328288515202849800, 6972406840307481976, 29465347809991832, 12012198471360912693, 15779352999894925288, 173097048437312502, 7034851303745741351, 11088333491201093194, 6771862800272250893, 3846044480011221270, 4070136787975548901, 9633218853985087472, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17331158106613184460, 14148490408465275064, 8090161351836983773, 2492059183640657261, 6026600320279882336, 15568437290332308327, 16133345873308301364, 16575090776691519559, 7666370275789511263, 10729939698274680623, 6345872167795009033, 16966092255533854383, 1, 0, 0, 0, 1, 0, 0, 0, 0, 18344276842462151560, 2917966740410115114, 8665315444141111469, 16968938268466755316, 6970552753544824994, 11532601739151124629, 5426492436527662130, 16147396598096989679, 12942227631865082960, 5297971463863936522, 3095930865537762353, 3065488485208441055, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 4949154992619464010, 10000279862191744493, 2980140658145787783, 14525300817521856881, 15190222347874856922, 8671284646676347574, 4232664728858134772, 15703076512693482766, 1, 0, 0, 0, 1, 0, 0, 0, 0, 401642074298203, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 14280802901810915241, 1835177830541154044, 10010111294767420802, 2549897079792572603, 16850544756775285522, 1076973899277284702, 16072847024087248681, 6959791354043610236, 13098960849839742034, 17457628753812655267, 10076989882539553734, 9851586117636382793, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7925919485060883878, 826263100281998566, 16943179644353820008, 5670682422759337153, 652387120995254672, 14086579741019377519, 1047399340937520223, 1843180796447728437, 9449621519891201049, 5096693283465186518, 13617634258944637452, 7414079509745519565, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9094034340168608638, 9612296353153372169, 8996122336997085030, 4249626004536644548, 4188956971131276775, 3818478693739735842, 13840617071834531990, 9556362158826632350, 2814310786559014444, 12947605480618213072, 11664888937794835322, 10414894202973226643, 1, 0, 0, 0, 1, 0, 206637164063268726, 10092260866618400225, 13038545162971821924, 6650811367268781560, 2509054224639990472, 17350347680949584060, 9138873913574622404, 18389965100329173053, 5593621083784091164, 13835424809772757395, 3220022195391792741, 5305842545683321494, 13490514080936595140, 6832371865971954132, 11403399710197601656, 1, 0, 0, 0, 1, 0, 13042021488072180943, 17665366762968375743, 14514089290800305099, 13091389828882674218, 4611398810491526224, 81685142906752346, 2149720931386886989, 11347427093515448316, 968047239546776409, 11208516754282785707, 7596903557041777533, 6167749875842285147, 6026705707665599719, 15647394574465449881, 12376579030877442488, 1, 0, 0, 0, 1, 0, 7479226098762365380, 20647088475708265, 14234714302482719672, 680445747454648704, 10159688738464070440, 9792116363139842106, 7330871518527332444, 4089976927111145333, 15053368214221814937, 13990233438164144322, 12190997158276486897, 7437125179920904126, 12940670116574659651, 11586223746088007538, 15054143113295762432, 1, 0, 0, 0, 1, 0, 13347963917530181895, 10889708507292659338, 4175833649164370394, 5233297770622824375, 745298233749984501, 1134592111928495305, 10789212522972025785, 1655996231185402724, 15389814481683087606, 16658833476738371029, 17337514399056563302, 91614862745339577, 5957825878304116293, 8927362828162004403, 17460975957431844228, 1, 0, 0, 0, 1, 0, 6929809241430544204, 6641711964892684437, 12124997350307806549, 9867160564810673994, 17942681985602265676, 4841731940180862534, 5554647570062987979, 16778373777892540383, 7660052382355122994, 492549161703070590, 7481614450647261413, 1154605885284628266, 1527514044633931889, 968318691601385838, 10685847052710927197, 1, 0, 0, 0, 1, 0, 17634176407370476921, 7739526124990237795, 13838384228721941065, 10263347723858682786, 10152063658776528390, 2487841274273895537, 14002884382934858252, 16481019216530994753, 737940994724202658, 13983563295828088546, 13086268929321267306, 9490927005547387767, 12643114535206930756, 5238866342343116613, 1026289052488784895, 1, 0, 0, 0, 1, 0, 6697396169967230934, 18287805115840952516, 14443334479498508931, 9643915442530902318, 5274902253855511588, 8629130978595053833, 13067519389098510351, 6485826671956173957, 13211005290810103003, 11078906302351818677, 4561010052951998759, 7714188412126691626, 2913086696180341350, 845034972551066538, 1899038343674936222, 1, 0, 0, 0, 1, 0, 15116382065750335012, 0, 0, 887493237489321299, 6033538369482377655, 16798226782780142546, 16399505509770566014, 12077164016468113545, 12296311093518063031, 2334817027508375898, 6016566887476098647, 7120740401378484294, 12860916533743270733, 17367170950581948054, 5883730844910027408, 1, 0, 0, 0, 1, 0, 0, 0, 0, 13483864438078018308, 3570589185097006252, 9731250716956559616, 11950037765875050974, 4878983963291132913, 5554567664494429423, 6515674137823977144, 13097123292793361360, 2929601484581949152, 15934882759672330788, 4924405821869545305, 10308552102917724507, 1, 0, 0, 0, 1, 0, 0, 0, 0, 8159241411748295729, 4587292818271677447, 12286920896461242142, 12195903600484928258, 1618531819557712390, 12302163852964786956, 393947096345211186, 17631302057213141907, 1077164174037184778, 2173747106952139997, 1674381281184830519, 1101239144209002141, 1, 0, 0, 0, 1, 0, 0, 0, 0, 10385528691577928985, 16771298688176486904, 1919835269886444210, 17694444981837938563, 565132887411573955, 14310991091785572129, 1951192747307666741, 8382824402074565601, 7253613682453412944, 5260381980138555939, 4077397353846458666, 16732112788727027442, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 7288090792972058500, 7008881577152522467, 7526556702499462773, 16136160484984138575, 12957959164911169922, 9238536158694879401, 16570851802495678006, 6132059608254040410, 1, 0, 0, 0, 1, 0, 0, 0, 0, 5482243896119908732, 17271741639510569126, 10627125303494028926, 12334791106787903660, 13210061556570014836, 16003296542960478536, 6732564319544917702, 16687523027086140644, 0, 87, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4383606322674378669, 13264028927506398677, 4766776471757604196, 14660905060901389201, 12446750015896088802, 12927954860087459534, 14751589151467562513, 18208410790236506017, 8060897427763484267, 10391043349415287037, 7848268271641614303, 13621084556403650323, 1, 0, 0, 0, 1, 0, 0, 0, 0, 11282929110176162954, 5896249534368220847, 12230245468863423579, 17357985657180629743, 10353774239160274935, 3759003303159369746, 3091073535594807983, 3398985649909830369, 15694315280551902473, 17044036436784806527, 1670964981039714496, 17078772340992927473, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17215248529293365853, 11382862066285680273, 18104224094677170296, 10490790376815116141, 11424271721157330669, 1148549753827007441, 17274728363719186424, 11870335859895317550, 15462035367190511759, 13171139175044072684, 12506995107569119516, 862170971660204027, 1, 0, 0, 0, 1, 0, 18208784611061899534, 11090107870009134382, 15816468029966600756, 13193227772306657556, 5436084715181539253, 15873409126341319274, 8856174280738574418, 15057005486179715954, 7129001791528740265, 6785780051417756764, 1782594595734670280, 16783127636073026773, 2094744771380247596, 16020980424362300069, 5676881743340217488, 1, 0, 0, 0, 1, 0, 3995660239591967986, 13991065272063476564, 4842320139602494012, 5492874275384737590, 9049442861863566881, 9007898958502691821, 9423711593310475409, 6387235594535598756, 7039074043166063940, 11491856728648046938, 5559192297727634984, 586150029444692874, 9272483157421678641, 11430895388638705560, 6521284656283570782, 1, 0, 0, 0, 1, 0, 10265417819422388610, 3230613796530740211, 8204482557338271208, 5965860733558915216, 3732227441816681926, 4972858056675247397, 15435624740876731287, 610949617653761740, 16413792935045431209, 11964718430105317483, 8697421447132597636, 7685703760533694936, 9520544349855559315, 16369319727902045750, 10481218501610762636, 1, 0, 0, 0, 1, 0, 4200148723083586126, 8898019494692638676, 9361391436000884061, 6906630570311142812, 10416842793286403595, 15154449156086880838, 17187582840477322187, 1667764180674112574, 11868526707386259660, 7310308994414837120, 37096681180297292, 1254987403839644538, 7281147841738764349, 16804807948024450931, 14191613402325013881, 1, 0, 0, 0, 1, 0, 6921512846940257894, 8083147322870350598, 7402338099048749868, 11028121748345672612, 9182929970775715030, 642245012387336876, 9940061963065628902, 677543792580138430, 5887036391937389613, 4972018469228063343, 9603988472267868801, 6207690803740787708, 1390751769269680465, 14779846517676698965, 4400313738036540825, 1, 0, 0, 0, 1, 0, 15720913686265040726, 11620345195770806393, 392865519522630483, 10866688391213961683, 4078956937078417294, 8169860993617536308, 13903556343063122489, 7226453148331774623, 12303475117195379639, 12980119595156137175, 2954837086209820968, 686805010274260483, 12922697597526240324, 2239891938742671995, 9798699259742823392, 1, 0, 0, 0, 1, 0, 1576291082626878936, 6836143998208741199, 5718769156293156294, 501346961392724628, 12301747922262729865, 7909458165142256993, 17643816943101201258, 739842910379542056, 14479451218433079532, 6627357084936364627, 6596157637386353039, 8706567413279745902, 4975249353684987436, 9576130314342554279, 8323169935435436763, 1, 0, 0, 0, 1, 0, 13015036049004182291, 0, 0, 3820689183586493894, 8535816953133153286, 12781603895645888322, 4895491920411997249, 6893839572721182305, 17259376159632543425, 7788172704304532836, 17444739644589522901, 15979424445015031332, 6966167031354634355, 5956660324772534609, 14233099751914870044, 1, 0, 0, 0, 1, 0, 0, 0, 0, 2862138511955678409, 2554244438665697829, 9129723360543316479, 16513197729164811328, 10619536471246139015, 11289943669462175698, 7818804555865981505, 4673396992430997118, 18261872069356847559, 8010670397007670803, 14891365206755013222, 17356025534910089368, 1, 0, 0, 0, 1, 0, 0, 0, 0, 7758258992155315690, 6695383891040002341, 2424787611628537668, 4815287357290896051, 4063396021928247911, 10804772324353478999, 11573391963135759227, 5652365973964779246, 7568935938034555881, 871847630272290682, 833106187556617464, 2031310896521954322, 1, 0, 0, 0, 1, 0, 0, 0, 0, 17115115516972321026, 9265251570417433175, 16343713044075599831, 3003012580421078075, 1116280449848444285, 17288383771256214060, 18390005084876364234, 14148401294484512817, 3939988349760901151, 18441078654886601219, 14690990432528119604, 16067965450256037769, 1, 0, 0, 0, 1, 0, 0, 0, 0, 9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683, 11377866377890790275, 9885671831159451104, 49905639292627904, 594790136239256278, 3558778201956820739, 1106728433230065324, 7399742180187746173, 8147499972447601337, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 40, 0, 0, 3, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 1, 0, 1, 1, 10, 0, 0, 0, 1, 0, 1, 1, 0, 40, 0, 0, 12, 7458506668679174706, 18375473735916206629, 2105717247508690050, 1679902783560062568, 9, 0, 4099276459869907627, 1, 10, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], range_checker_cols: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 7, 8, 9, 10, 2197, 4384, 6571, 8758, 10945, 13132, 15319, 17506, 19693, 21880, 24067, 26254, 28441, 30628, 32815, 35002, 37189, 39376, 41563, 43750, 45937, 48124, 50311, 52498, 54685, 56872, 59059, 61246, 63433, 64162, 64891, 65134, 65377, 65458, 65485, 65512, 65521, 65530, 65533, 65534, 65535, 65535]], num_rows: 128 }, last_program_row: RowIndex(19) }, program_info: ProgramInfo { program_hash: Word([9874694795284567525, 11914585017133270728, 14619522228640933410, 6636010883309744683]), kernel: Kernel([]) }, stack_outputs: StackOutputs { elements: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, precompile_requests: [], final_precompile_transcript: PrecompileTranscript { state: Word([0, 0, 0, 0]) }, trace_len_summary: TraceLenSummary { main_trace_len: 20, range_trace_len: 49, chiplets_trace_len: ChipletsLengths { hash_chiplet_len: 80, bitwise_chiplet_len: 0, memory_chiplet_len: 2, ace_chiplet_len: 0, kernel_rom_len: 0 } } } diff --git a/processor/src/trace/parallel/tests.rs b/processor/src/trace/parallel/tests.rs index c3abcf4c76..c675b81d84 100644 --- a/processor/src/trace/parallel/tests.rs +++ b/processor/src/trace/parallel/tests.rs @@ -1,14 +1,20 @@ use alloc::{string::String, sync::Arc}; -use miden_air::trace::{AUX_TRACE_RAND_CHALLENGES, chiplets::hasher::HASH_CYCLE_LEN}; +use miden_air::trace::{ + AUX_TRACE_RAND_CHALLENGES, DECODER_TRACE_OFFSET, + chiplets::hasher::HASH_CYCLE_LEN, + decoder::{HASHER_STATE_OFFSET, NUM_OP_BITS, OP_BITS_OFFSET}, +}; use miden_core::{ - Felt, + Felt, Word, + events::EventId, mast::{ BasicBlockNodeBuilder, CallNodeBuilder, DynNodeBuilder, ExternalNodeBuilder, JoinNodeBuilder, LoopNodeBuilder, MastForest, MastForestContributor, MastNodeExt, SplitNodeBuilder, }, - operations::Operation, + operations::{Operation, opcodes}, + precompile::PrecompileRequest, program::{Kernel, Program, StackInputs}, }; use miden_utils_testing::{get_column_name, rand::rand_array}; @@ -17,7 +23,7 @@ use rstest::{fixture, rstest}; use super::*; use crate::{ - AdviceInputs, DefaultHost, ExecutionOptions, FastProcessor, HostLibrary, + AdviceInputs, DefaultHost, ExecutionOptions, FastProcessor, HostLibrary, TraceBuildInputs, trace::trace_state::MemoryReadsReplay, }; @@ -327,10 +333,8 @@ fn test_trace_generation_at_fragment_boundaries( ); let mut host = DefaultHost::default(); host.load_library(create_simple_library()).unwrap(); - let (execution_output, trace_fragment_contexts) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); - - build_trace(execution_output, trace_fragment_contexts, program.to_info()).unwrap() + let trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); + build_trace(trace_inputs).unwrap() }; let trace_from_single_fragment = { @@ -343,11 +347,10 @@ fn test_trace_generation_at_fragment_boundaries( ); let mut host = DefaultHost::default(); host.load_library(create_simple_library()).unwrap(); - let (execution_output, trace_fragment_contexts) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); - assert!(trace_fragment_contexts.core_trace_contexts.len() == 1); + let trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); + assert!(trace_inputs.trace_generation_context().core_trace_contexts.len() == 1); - build_trace(execution_output, trace_fragment_contexts, program.to_info()).unwrap() + build_trace(trace_inputs).unwrap() }; // Ensure that the trace generated from multiple fragments is identical to the one generated @@ -395,20 +398,15 @@ fn test_trace_generation_at_fragment_boundaries( trace_from_single_fragment.trace_len_summary(), ); - // Verify merkle store data match deterministically. - let merkle_nodes_from_fragments: alloc::collections::BTreeMap<_, _> = trace_from_fragments - .advice_provider() - .merkle_store() - .inner_nodes() - .map(|info| (info.value, (info.left, info.right))) - .collect(); - let merkle_nodes_from_single: alloc::collections::BTreeMap<_, _> = trace_from_single_fragment - .advice_provider() - .merkle_store() - .inner_nodes() - .map(|info| (info.value, (info.left, info.right))) - .collect(); - assert_eq!(merkle_nodes_from_fragments, merkle_nodes_from_single,); + // Verify deferred precompile data match deterministically. + assert_eq!( + trace_from_fragments.precompile_requests(), + trace_from_single_fragment.precompile_requests(), + ); + assert_eq!( + trace_from_fragments.final_precompile_transcript, + trace_from_single_fragment.final_precompile_transcript, + ); // Verify aux trace columns match. let rand_elements = rand_array::(); @@ -434,6 +432,72 @@ fn test_trace_generation_at_fragment_boundaries( insta::assert_compact_debug_snapshot!(testname, DeterministicTrace(&trace_from_fragments)); } +#[test] +fn test_nested_loop_end_flags_stable_across_fragmentation() { + // Small fragment size is chosen so that the fragment boundaries land on the outer loop replay: + // rows [0..6], [7..13], [14..]. + // + // Execution for the chosen stack inputs: + // 0: LOOP + // 1: LOOP + // 2: BLOCK PAD DROP END + // 6: END + // 7: REPEAT + // 8: LOOP + // 9: BLOCK PAD DROP END + // 13: END + // 14: END + // 15: HALT + // + // Stack inputs, top first: + // 1) enter outer loop + // 2) enter inner loop + // 3) exit inner loop + // 4) repeat outer loop + // 5) enter inner loop + // 6) exit inner loop + // 7) exit outer loop + const SMALL_FRAGMENT_SIZE: usize = 7; + const LARGE_FRAGMENT_SIZE: usize = 1 << 20; + + let program = nested_loop_program(); + let stack_inputs = &[ONE, ONE, ZERO, ONE, ONE, ZERO, ZERO, SENTINEL_VALUE]; + + let trace_from_fragments = build_trace_for_program(&program, stack_inputs, SMALL_FRAGMENT_SIZE); + let trace_from_single_fragment = + build_trace_for_program(&program, stack_inputs, LARGE_FRAGMENT_SIZE); + + let columns_from_fragments = trace_from_fragments + .main_trace() + .columns() + .map(|col| col.to_vec()) + .collect::>(); + let columns_from_single_fragment = trace_from_single_fragment + .main_trace() + .columns() + .map(|col| col.to_vec()) + .collect::>(); + + assert_eq!( + columns_from_fragments, columns_from_single_fragment, + "nested-loop trace changed across fragment boundaries" + ); + + let end_flags = collect_end_flags(&trace_from_fragments); + assert!( + end_flags.contains(&[ONE, ZERO, ZERO, ZERO].into()), + "expected an END row for loop body basic block (is_loop_body=1)" + ); + assert!( + end_flags.contains(&[ONE, ONE, ZERO, ZERO].into()), + "expected an END row for inner loop node (is_loop_body=1, loop_entered=1)" + ); + assert!( + end_flags.contains(&[ZERO, ONE, ZERO, ZERO].into()), + "expected an END row for outer loop node (is_loop_body=0, loop_entered=1)" + ); +} + #[test] fn test_partial_last_fragment_exists_for_h0_inversion_path() { // Keep this > 1 and non-dividing for join_program() to guarantee a short final fragment. @@ -450,15 +514,14 @@ fn test_partial_last_fragment_exists_for_h0_inversion_path() { let mut host = DefaultHost::default(); host.load_library(create_simple_library()).unwrap(); - let (execution_output, trace_fragment_contexts) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); + let trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); assert!( - trace_fragment_contexts.core_trace_contexts.len() > 1, + trace_inputs.trace_generation_context().core_trace_contexts.len() > 1, "repro precondition requires multiple fragments" ); - let trace = build_trace(execution_output, trace_fragment_contexts, program.to_info()).unwrap(); + let trace = build_trace(trace_inputs).unwrap(); let total_rows_without_halt = trace.main_trace().num_rows() - 1; assert_ne!( @@ -485,12 +548,11 @@ fn miri_repro_uninitialized_tail_read_during_h0_inversion() { ); let mut host = DefaultHost::default(); host.load_library(create_simple_library()).unwrap(); - let (execution_output, trace_fragment_contexts) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); + let trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); - assert!(trace_fragment_contexts.core_trace_contexts.len() > 1); + assert!(trace_inputs.trace_generation_context().core_trace_contexts.len() > 1); - let _ = build_trace(execution_output, trace_fragment_contexts, program.to_info()); + let _ = build_trace(trace_inputs); } /// Creates a library with a single procedure containing just a SWAP operation. @@ -598,6 +660,25 @@ fn loop_program() -> Program { Program::new(Arc::new(program), root_join_node) } +/// (loop (loop (block pad drop))) +fn nested_loop_program() -> Program { + let mut program = MastForest::new(); + + let inner_loop = { + let basic_block_pad_drop = + BasicBlockNodeBuilder::new(vec![Operation::Pad, Operation::Drop], Vec::new()) + .add_to_forest(&mut program) + .unwrap(); + + LoopNodeBuilder::new(basic_block_pad_drop).add_to_forest(&mut program).unwrap() + }; + + let outer_loop = LoopNodeBuilder::new(inner_loop).add_to_forest(&mut program).unwrap(); + + program.make_root(outer_loop); + Program::new(Arc::new(program), outer_loop) +} + /// (join ( /// (block swap swap) /// (call ()) @@ -842,16 +923,15 @@ fn test_build_trace_returns_err_on_empty_memory_reads_replay() { .unwrap(), ); let mut host = DefaultHost::default(); - let (execution_output, mut trace_generation_context) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); + let mut trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); // Clear the memory reads replay so the replay processor will fail when the DYN node tries to // read the callee hash from memory. - for ctx in &mut trace_generation_context.core_trace_contexts { + for ctx in &mut trace_inputs.trace_generation_context_mut().core_trace_contexts { ctx.replay.memory_reads = MemoryReadsReplay::default(); } - let result = build_trace(execution_output, trace_generation_context, program.to_info()); + let result = build_trace(trace_inputs); assert!( result.is_err(), "build_trace should return Err when hasher replay has bad node ID" @@ -875,8 +955,7 @@ fn test_build_trace_returns_err_on_bad_node_id_in_hasher_replay() { .unwrap(), ); let mut host = DefaultHost::default(); - let (execution_output, mut trace_generation_context) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); + let mut trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); // Inject a HashBasicBlock entry with a node ID that points to a non-existent node in an empty // forest. @@ -886,19 +965,59 @@ fn test_build_trace_returns_err_on_bad_node_id_in_hasher_replay() { let valid_id = BasicBlockNodeBuilder::new(vec![Operation::Noop], Vec::new()) .add_to_forest(&mut temp_forest) .unwrap(); - trace_generation_context.hasher_for_chiplet.record_hash_basic_block( - empty_forest, - valid_id, - [ZERO; 4].into(), - ); + trace_inputs + .trace_generation_context_mut() + .hasher_for_chiplet + .record_hash_basic_block(empty_forest, valid_id, [ZERO; 4].into()); - let result = build_trace(execution_output, trace_generation_context, program.to_info()); + let result = build_trace(trace_inputs); assert!( result.is_err(), "build_trace should return Err when hasher replay has bad node ID" ); } +/// Verifies that `build_trace` rejects compatibility bundles that reuse matching public outputs +/// but carry different deferred precompile requests. +#[test] +fn test_build_trace_rejects_mismatched_precompile_requests() { + const MAX_FRAGMENT_SIZE: usize = 1 << 20; + + let program = basic_block_program_small(); + + let processor = FastProcessor::new_with_options( + StackInputs::new(DEFAULT_STACK).unwrap(), + AdviceInputs::default(), + ExecutionOptions::default() + .with_core_trace_fragment_size(MAX_FRAGMENT_SIZE) + .unwrap(), + ); + let mut host = DefaultHost::default(); + let trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); + let (trace_output, trace_generation_context, program_info) = trace_inputs.into_parts(); + + let mut other_trace_output = trace_output; + other_trace_output + .precompile_requests + .push(PrecompileRequest::new(EventId::from_u64(7), vec![1, 2, 3])); + + let result = build_trace(TraceBuildInputs::from_parts( + other_trace_output, + trace_generation_context, + program_info, + )); + + assert!( + matches!( + result, + Err(ExecutionError::Internal( + "trace inputs do not match deferred precompile requests" + )) + ), + "expected deferred-precompile-request mismatch error, got: {result:?}" + ); +} + /// Tests `build_trace_with_max_len` behavior at various `max_trace_len` boundaries relative to the /// core trace length. `core_trace_len` is the number of core trace rows including the HALT row /// appended by `build_trace_with_max_len`. @@ -927,24 +1046,18 @@ fn test_build_trace_with_max_len_corner_cases( .unwrap(), ); let mut host = DefaultHost::default(); - let (execution_output, trace_generation_context) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); + let trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); // Compute the number of core trace rows generated, which includes the HALT row inserted by // `build_trace_with_max_len`. - let core_trace_len = trace_generation_context.core_trace_contexts.len() - * trace_generation_context.fragment_size + let core_trace_len = trace_inputs.trace_generation_context().core_trace_contexts.len() + * trace_inputs.trace_generation_context().fragment_size + 1; let max_trace_len = core_trace_len .checked_add_signed(max_trace_len_offset_from_core_trace_len) .unwrap(); - let result = build_trace_with_max_len( - execution_output, - trace_generation_context, - program.to_info(), - max_trace_len, - ); + let result = build_trace_with_max_len(trace_inputs, max_trace_len); assert_eq!( result.is_ok(), @@ -979,18 +1092,12 @@ fn test_build_trace_returns_err_on_fragment_size_overflow() { .unwrap(), ); let mut host = DefaultHost::default(); - let (execution_output, mut trace_generation_context) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); + let mut trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); // Set fragment_size to usize::MAX so that `len() * fragment_size` overflows. - trace_generation_context.fragment_size = usize::MAX; + trace_inputs.trace_generation_context_mut().fragment_size = usize::MAX; - let result = build_trace_with_max_len( - execution_output, - trace_generation_context, - program.to_info(), - usize::MAX, - ); + let result = build_trace_with_max_len(trace_inputs, usize::MAX); assert!( matches!(result, Err(ExecutionError::TraceLenExceeded(_))), @@ -1016,13 +1123,12 @@ fn test_build_trace_returns_err_when_chiplets_trace_exceeds_max_len() { .unwrap(), ); let mut host = DefaultHost::default(); - let (execution_output, mut trace_generation_context) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); + let mut trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); // Note: the last fragment may have fewer rows than the fragment size, so this is really an // upper bound on the number of core trace rows - let core_trace_rows = - trace_generation_context.core_trace_contexts.len() * trace_generation_context.fragment_size; + let core_trace_rows = trace_inputs.trace_generation_context().core_trace_contexts.len() + * trace_inputs.trace_generation_context().fragment_size; // Inject enough hasher permutations so the chiplets trace exceeds core_trace_rows. // Each permute adds HASH_CYCLE_LEN rows to the hasher chiplet trace, so we need @@ -1030,19 +1136,17 @@ fn test_build_trace_returns_err_when_chiplets_trace_exceeds_max_len() { // limit. let num_permutations = core_trace_rows / HASH_CYCLE_LEN + 1; for _ in 0..num_permutations { - trace_generation_context.hasher_for_chiplet.record_permute_input([ZERO; 12]); + trace_inputs + .trace_generation_context_mut() + .hasher_for_chiplet + .record_permute_input([ZERO; 12]); } // Set max_trace_len equal to core_trace_rows. The core trace check passes (not strictly // greater), but the inflated chiplets trace will exceed it. let max_trace_len = core_trace_rows; - let result = build_trace_with_max_len( - execution_output, - trace_generation_context, - program.to_info(), - max_trace_len, - ); + let result = build_trace_with_max_len(trace_inputs, max_trace_len); assert!( matches!(result, Err(ExecutionError::TraceLenExceeded(_))), @@ -1066,13 +1170,12 @@ fn test_build_trace_returns_err_on_empty_core_trace_contexts() { .unwrap(), ); let mut host = DefaultHost::default(); - let (execution_output, mut trace_generation_context) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); + let mut trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); // Clear core_trace_contexts to simulate an empty trace. - trace_generation_context.core_trace_contexts.clear(); + trace_inputs.trace_generation_context_mut().core_trace_contexts.clear(); - let result = build_trace(execution_output, trace_generation_context, program.to_info()); + let result = build_trace(trace_inputs); assert!( matches!(result, Err(ExecutionError::Internal(_))), @@ -1089,6 +1192,62 @@ fn testname() -> String { std::thread::current().name().unwrap().replace("::", "__") } +fn build_trace_for_program( + program: &Program, + stack_inputs: &[Felt], + fragment_size: usize, +) -> ExecutionTrace { + let processor = FastProcessor::new_with_options( + StackInputs::new(stack_inputs).unwrap(), + AdviceInputs::default(), + ExecutionOptions::default() + .with_core_trace_fragment_size(fragment_size) + .unwrap(), + ); + let mut host = DefaultHost::default(); + host.load_library(create_simple_library()).unwrap(); + let trace_inputs = processor.execute_trace_inputs_sync(program, &mut host).unwrap(); + + build_trace(trace_inputs).unwrap() +} + +fn collect_end_flags(trace: &ExecutionTrace) -> Vec { + let main_trace = trace.main_trace(); + + (0..main_trace.num_rows()) + .filter_map(|row_idx| { + if read_opcode(main_trace, row_idx) == opcodes::END { + Some( + [ + main_trace.get_column(DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 4) + [row_idx], + main_trace.get_column(DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 5) + [row_idx], + main_trace.get_column(DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 6) + [row_idx], + main_trace.get_column(DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 7) + [row_idx], + ] + .into(), + ) + } else { + None + } + }) + .collect() +} + +fn read_opcode(main_trace: &MainTrace, row_idx: usize) -> u8 { + let mut result = 0; + for i in 0..NUM_OP_BITS { + let op_bit = main_trace.get_column(DECODER_TRACE_OFFSET + OP_BITS_OFFSET + i)[row_idx] + .as_canonical_u64(); + assert!(op_bit <= 1, "invalid op bit"); + result += op_bit << i; + } + result as u8 +} + /// Wrapper around `ExecutionTrace` that produces deterministic `Debug` output. /// /// `ExecutionTrace` contains a `MerkleStore` backed by `HashMap`, whose iteration order is @@ -1100,19 +1259,12 @@ impl core::fmt::Debug for DeterministicTrace<'_> { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { let trace = self.0; - // Collect merkle store nodes into a sorted BTreeMap for deterministic output - let sorted_nodes: alloc::collections::BTreeMap<_, _> = trace - .advice_provider() - .merkle_store() - .inner_nodes() - .map(|info| (info.value, (info.left, info.right))) - .collect(); - f.debug_struct("ExecutionTrace") .field("main_trace", trace.main_trace()) .field("program_info", &trace.program_info()) .field("stack_outputs", &trace.stack_outputs()) - .field("merkle_store_nodes", &sorted_nodes) + .field("precompile_requests", &trace.precompile_requests()) + .field("final_precompile_transcript", &trace.final_precompile_transcript) .field("trace_len_summary", &trace.trace_len_summary()) .finish() } diff --git a/processor/src/trace/parallel/tracer/mod.rs b/processor/src/trace/parallel/tracer/mod.rs index e32e46de81..c13ea0dd21 100644 --- a/processor/src/trace/parallel/tracer/mod.rs +++ b/processor/src/trace/parallel/tracer/mod.rs @@ -9,8 +9,9 @@ use super::{ trace_state::{ BlockAddressReplay, BlockStackReplay, DecoderState, StackState, SystemState, }, + utils::RowMajorTraceWriter, }, - core_trace_fragment::{BasicBlockContext, CoreTraceFragment}, + core_trace_fragment::BasicBlockContext, processor::ReplayProcessor, }; use crate::{ @@ -18,6 +19,7 @@ use crate::{ continuation_stack::{Continuation, ContinuationStack}, errors::MapExecErrNoCtx, mast::{MastForest, MastNode, MastNodeExt, MastNodeId}, + trace::trace_state::NodeFlags, tracer::{OperationHelperRegisters, Tracer}, }; @@ -52,8 +54,8 @@ pub(crate) struct TracerFinalState { /// final state of the tracer (or the error, if one was encountered). #[derive(Debug)] pub(crate) struct CoreTraceGenerationTracer<'a> { - /// The trace fragment being populated with rows by this tracer. - fragment: &'a mut CoreTraceFragment<'a>, + /// The writer for the core trace fragment. + writer: RowMajorTraceWriter<'a, Felt>, /// The index of the next row to write in the trace fragment. row_write_index: usize, @@ -91,6 +93,13 @@ pub(crate) struct CoreTraceGenerationTracer<'a> { /// this cycle. continuation: Option, + /// Whether the node ending in this clock cycle is a body of a LOOP node. This is determined + /// by peeking at the continuation stack in [`start_clock_cycle`](Tracer::start_clock_cycle) + /// to check if the next clock-incrementing continuation is a `FinishLoop`. + /// + /// This is only relevant for END operations (Finish* continuations). + is_loop_body: bool, + /// If an error is encountered during trace generation, it is stored here. Once set, all /// subsequent `start_clock_cycle` and `finalize_clock_cycle` calls become no-ops, and the /// error is returned by [`into_parts`](Self::into_parts). @@ -99,13 +108,13 @@ pub(crate) struct CoreTraceGenerationTracer<'a> { impl<'a> CoreTraceGenerationTracer<'a> { pub fn new( - fragment: &'a mut CoreTraceFragment<'a>, + writer: RowMajorTraceWriter<'a, Felt>, decoder_state: DecoderState, block_address_replay: BlockAddressReplay, block_stack_replay: BlockStackReplay, ) -> Self { Self { - fragment, + writer, row_write_index: 0, decoder_state, block_address_replay, @@ -116,6 +125,7 @@ impl<'a> CoreTraceGenerationTracer<'a> { finish_loop_condition: None, dyn_callee_hash: None, continuation: None, + is_loop_body: false, error_encountered: None, } } @@ -288,6 +298,52 @@ impl<'a> CoreTraceGenerationTracer<'a> { None } + /// Returns the `NodeFlags` for an END operation based on the continuation type and state + /// captured in `start_clock_cycle`. + fn compute_node_flags( + &self, + continuation: &Continuation, + current_forest: &MastForest, + ) -> Result { + let is_loop_body = self.is_loop_body; + + match continuation { + Continuation::FinishLoop { was_entered, .. } => { + // The Loop node itself is ending. `loop_entered` = `was_entered`. + Ok(NodeFlags::new(is_loop_body, *was_entered, false, false)) + }, + Continuation::FinishCall(node_id) => { + let node = get_node_in_forest(current_forest, *node_id)?; + let MastNode::Call(call_node) = node else { + return Err(ExecutionError::Internal( + "expected call node in FinishCall continuation", + )); + }; + let is_syscall = call_node.is_syscall(); + let is_call = !is_syscall; + Ok(NodeFlags::new(is_loop_body, false, is_call, is_syscall)) + }, + Continuation::FinishDyn(node_id) => { + let node = get_node_in_forest(current_forest, *node_id)?; + let MastNode::Dyn(dyn_node) = node else { + return Err(ExecutionError::Internal( + "expected dyn node in FinishDyn continuation", + )); + }; + let is_call = dyn_node.is_dyncall(); + Ok(NodeFlags::new(is_loop_body, false, is_call, false)) + }, + Continuation::FinishJoin(_) + | Continuation::FinishSplit(_) + | Continuation::FinishBasicBlock(_) => { + Ok(NodeFlags::new(is_loop_body, false, false, false)) + }, + _ => { + Err(ExecutionError::Internal("compute_node_flags called for non-END continuation")) + }, + } + } + /// Returns the callee hash for a `Dyn` node, or `None` if the continuation is not a /// `StartNode` for a `Dyn` node. /// @@ -329,7 +385,7 @@ impl Tracer for CoreTraceGenerationTracer<'_> { &mut self, processor: &ReplayProcessor, continuation: Continuation, - _continuation_stack: &ContinuationStack, + continuation_stack: &ContinuationStack, current_forest: &Arc, ) { if self.error_encountered.is_some() { @@ -345,6 +401,13 @@ impl Tracer for CoreTraceGenerationTracer<'_> { self.dyn_callee_hash = self.get_dyn_callee_hash(&continuation, processor, current_forest)?; + // For END operations, determine if the ending node is a body of a LOOP by checking + // whether the next clock-incrementing continuation is a FinishLoop. + self.is_loop_body = matches!( + continuation_stack.iter_continuations_for_next_clock().last(), + Some(Continuation::FinishLoop { was_entered: true, .. }) + ); + // Store state for finalizing the clock cycle later. self.continuation = Some(continuation); @@ -384,11 +447,23 @@ impl Tracer for CoreTraceGenerationTracer<'_> { }, FinishJoin(node_id) => { let node = get_node_in_forest(current_forest, *node_id)?; - self.fill_end_trace_row(&processor.system, &processor.stack, node.digest())?; + let flags = self.compute_node_flags(continuation, current_forest)?; + self.fill_end_trace_row( + &processor.system, + &processor.stack, + node.digest(), + flags.to_hasher_state_second_word(), + )?; }, FinishSplit(node_id) => { let node = get_node_in_forest(current_forest, *node_id)?; - self.fill_end_trace_row(&processor.system, &processor.stack, node.digest())?; + let flags = self.compute_node_flags(continuation, current_forest)?; + self.fill_end_trace_row( + &processor.system, + &processor.stack, + node.digest(), + flags.to_hasher_state_second_word(), + )?; }, FinishLoop { node_id, was_entered: _ } => { let loop_condition = self.finish_loop_condition.take().ok_or( @@ -418,20 +493,34 @@ impl Tracer for CoreTraceGenerationTracer<'_> { } else { // Loop is finished, so fill in an END row. let node = get_node_in_forest(current_forest, *node_id)?; + let flags = self.compute_node_flags(continuation, current_forest)?; self.fill_end_trace_row( &processor.system, &processor.stack, node.digest(), + flags.to_hasher_state_second_word(), )?; } }, FinishCall(node_id) => { let node = get_node_in_forest(current_forest, *node_id)?; - self.fill_end_trace_row(&processor.system, &processor.stack, node.digest())?; + let flags = self.compute_node_flags(continuation, current_forest)?; + self.fill_end_trace_row( + &processor.system, + &processor.stack, + node.digest(), + flags.to_hasher_state_second_word(), + )?; }, FinishDyn(node_id) => { let node = get_node_in_forest(current_forest, *node_id)?; - self.fill_end_trace_row(&processor.system, &processor.stack, node.digest())?; + let flags = self.compute_node_flags(continuation, current_forest)?; + self.fill_end_trace_row( + &processor.system, + &processor.stack, + node.digest(), + flags.to_hasher_state_second_word(), + )?; }, ResumeBasicBlock { node_id, batch_index, op_idx_in_batch } => { let MastNode::Block(basic_block_node) = @@ -502,10 +591,12 @@ impl Tracer for CoreTraceGenerationTracer<'_> { )); }; + let flags = self.compute_node_flags(continuation, current_forest)?; self.fill_basic_block_end_trace_row( &processor.system, &processor.stack, basic_block_node, + flags.to_hasher_state_second_word(), )?; }, FinishExternal(_) @@ -545,7 +636,7 @@ fn get_node_in_forest( #[cfg(test)] mod tests { - use alloc::{vec, vec::Vec}; + use alloc::vec; use miden_core::mast::{DynNodeBuilder, MastForestContributor}; @@ -559,6 +650,7 @@ mod tests { MastForestResolutionReplay, MemoryReadsReplay, StackOverflowReplay, StackState, SystemState, }, + utils::RowMajorTraceWriter, }, }; @@ -614,18 +706,11 @@ mod tests { 1u32.into(), ); - // Create a minimal CoreTraceFragment — its contents are unused by the method under - // test. - let mut columns_data: Vec> = - (0..CORE_TRACE_WIDTH).map(|_| vec![ZERO; 1]).collect(); - let column_slices: Vec<&mut [Felt]> = - columns_data.iter_mut().map(|v| v.as_mut_slice()).collect(); - let mut fragment = CoreTraceFragment { - columns: column_slices.try_into().expect("CORE_TRACE_WIDTH columns"), - }; + let mut buffer = vec![ZERO; CORE_TRACE_WIDTH]; + let writer = RowMajorTraceWriter::new(&mut buffer, CORE_TRACE_WIDTH); let tracer = CoreTraceGenerationTracer::new( - &mut fragment, + writer, DecoderState { current_addr: ZERO, parent_addr: ZERO }, BlockAddressReplay::default(), BlockStackReplay::default(), diff --git a/processor/src/trace/parallel/tracer/trace_row.rs b/processor/src/trace/parallel/tracer/trace_row.rs index dc61ea12e0..bd07c9a347 100644 --- a/processor/src/trace/parallel/tracer/trace_row.rs +++ b/processor/src/trace/parallel/tracer/trace_row.rs @@ -2,8 +2,8 @@ use miden_air::trace::{ CLK_COL_IDX, CTX_COL_IDX, DECODER_TRACE_OFFSET, FN_HASH_OFFSET, STACK_TRACE_OFFSET, - SYS_TRACE_WIDTH, - chiplets::hasher::HASH_CYCLE_LEN_FELT, + STACK_TRACE_WIDTH, SYS_TRACE_WIDTH, + chiplets::hasher::CONTROLLER_ROWS_PER_PERM_FELT, decoder::{ ADDR_COL_IDX, GROUP_COUNT_COL_IDX, HASHER_STATE_OFFSET, IN_SPAN_COL_IDX, NUM_OP_BATCH_FLAGS, NUM_OP_BITS, NUM_USER_OP_HELPERS, OP_BATCH_FLAGS_OFFSET, @@ -22,7 +22,9 @@ use miden_core::{ use super::{ExecutionContextInfo, StackState, SystemState, get_node_in_forest}; use crate::{ ExecutionError, - trace::parallel::{core_trace_fragment::BasicBlockContext, tracer::CoreTraceGenerationTracer}, + trace::parallel::{ + CORE_TRACE_WIDTH, core_trace_fragment::BasicBlockContext, tracer::CoreTraceGenerationTracer, + }, }; // DECODER ROW @@ -176,13 +178,13 @@ impl<'a> CoreTraceGenerationTracer<'a> { system: &SystemState, stack: &StackState, basic_block_node: &BasicBlockNode, + hasher_state_second_word: Word, ) -> Result<(), ExecutionError> { - let (ended_node_addr, flags) = - self.decoder_state.replay_node_end(&mut self.block_stack_replay)?; + let ended_node_addr = self.decoder_state.replay_node_end(&mut self.block_stack_replay)?; let decoder_row = DecoderRow::new_control_flow( opcodes::END, - (basic_block_node.digest(), flags.to_hasher_state_second_word()), + (basic_block_node.digest(), hasher_state_second_word), ended_node_addr, ); @@ -217,7 +219,7 @@ impl<'a> CoreTraceGenerationTracer<'a> { } // Update block address for the upcoming block - self.decoder_state.current_addr += HASH_CYCLE_LEN_FELT; + self.decoder_state.current_addr += CONTROLLER_ROWS_PER_PERM_FELT; // Update basic block context basic_block_context.group_count_in_block -= ONE; @@ -447,14 +449,14 @@ impl<'a> CoreTraceGenerationTracer<'a> { system: &SystemState, stack: &StackState, node_digest: Word, + hasher_state_second_word: Word, ) -> Result<(), ExecutionError> { // Pop the block from stack and use its info for END operations - let (ended_node_addr, flags) = - self.decoder_state.replay_node_end(&mut self.block_stack_replay)?; + let ended_node_addr = self.decoder_state.replay_node_end(&mut self.block_stack_replay)?; let decoder_row = DecoderRow::new_control_flow( opcodes::END, - (node_digest, flags.to_hasher_state_second_word()), + (node_digest, hasher_state_second_word), ended_node_addr, ); @@ -479,124 +481,96 @@ impl<'a> CoreTraceGenerationTracer<'a> { stack: &StackState, decoder_row: DecoderRow, ) { + let mut row = [ZERO; CORE_TRACE_WIDTH]; + // System trace columns (identical for all control flow operations) - self.populate_system_trace_columns(system, self.row_write_index); + if let Some(ref system_cols) = self.system_cols { + row[..SYS_TRACE_WIDTH].copy_from_slice(system_cols); + } // Decoder trace columns - self.populate_decoder_trace_columns(self.row_write_index, &decoder_row); + Self::write_decoder_to_row(&mut row, &decoder_row); // Stack trace columns (identical for all control flow operations) - self.populate_stack_trace_columns(stack, self.row_write_index); - - // Increment the row write index - self.row_write_index += 1; - } - - /// Populates the system trace columns - fn populate_system_trace_columns(&mut self, system: &SystemState, row_idx: usize) { - // If we have buffered system rows from the previous call, write them to the trace - if let Some(system_rows) = self.system_cols { - // Write buffered system rows to the trace at current row - for (i, &value) in system_rows.iter().enumerate() { - self.fragment.columns[i][row_idx] = value; - } + if let Some(ref stack_cols) = self.stack_cols { + row[STACK_TRACE_OFFSET..STACK_TRACE_OFFSET + STACK_TRACE_WIDTH] + .copy_from_slice(stack_cols); } - // Now populate the buffer with current system state for the next row - let mut new_system_rows = [ZERO; SYS_TRACE_WIDTH]; - - new_system_rows[CLK_COL_IDX] = (system.clk + 1).into(); - new_system_rows[CTX_COL_IDX] = system.ctx.into(); - new_system_rows[FN_HASH_OFFSET] = system.fn_hash[0]; - new_system_rows[FN_HASH_OFFSET + 1] = system.fn_hash[1]; - new_system_rows[FN_HASH_OFFSET + 2] = system.fn_hash[2]; - new_system_rows[FN_HASH_OFFSET + 3] = system.fn_hash[3]; + self.writer.write_row(self.row_write_index, &row); // Store the buffer for the next call - self.system_cols = Some(new_system_rows); + self.system_cols = Some(Self::build_system_buffer(system)); + self.stack_cols = Some(Self::build_stack_buffer(stack)); + + // Increment the row write index + self.row_write_index += 1; } - /// Populates the decoder trace columns with operation-specific data - fn populate_decoder_trace_columns(&mut self, row_idx: usize, row: &DecoderRow) { + fn write_decoder_to_row(row: &mut [Felt; CORE_TRACE_WIDTH], decoder_row: &DecoderRow) { // Block address - self.fragment.columns[DECODER_TRACE_OFFSET + ADDR_COL_IDX][row_idx] = row.addr; + row[DECODER_TRACE_OFFSET + ADDR_COL_IDX] = decoder_row.addr; // Decompose operation into bits - let opcode = row.opcode; + let opcode = decoder_row.opcode; for i in 0..NUM_OP_BITS { let bit = Felt::from_u8((opcode >> i) & 1); - self.fragment.columns[DECODER_TRACE_OFFSET + OP_BITS_OFFSET + i][row_idx] = bit; + row[DECODER_TRACE_OFFSET + OP_BITS_OFFSET + i] = bit; } // Hasher state - let (first_hash, second_hash) = row.hasher_state; - self.fragment.columns[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET][row_idx] = first_hash[0]; // hasher[0] - self.fragment.columns[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 1][row_idx] = - first_hash[1]; // hasher[1] - self.fragment.columns[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 2][row_idx] = - first_hash[2]; // hasher[2] - self.fragment.columns[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 3][row_idx] = - first_hash[3]; // hasher[3] - self.fragment.columns[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 4][row_idx] = - second_hash[0]; // hasher[4] - self.fragment.columns[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 5][row_idx] = - second_hash[1]; // hasher[5] - self.fragment.columns[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 6][row_idx] = - second_hash[2]; // hasher[6] - self.fragment.columns[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 7][row_idx] = - second_hash[3]; // hasher[7] + let (first_hash, second_hash) = decoder_row.hasher_state; + row[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET] = first_hash[0]; + row[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 1] = first_hash[1]; + row[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 2] = first_hash[2]; + row[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 3] = first_hash[3]; + row[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 4] = second_hash[0]; + row[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 5] = second_hash[1]; + row[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 6] = second_hash[2]; + row[DECODER_TRACE_OFFSET + HASHER_STATE_OFFSET + 7] = second_hash[3]; // Remaining decoder trace columns (identical for all control flow operations) - self.fragment.columns[DECODER_TRACE_OFFSET + OP_INDEX_COL_IDX][row_idx] = row.op_index; - self.fragment.columns[DECODER_TRACE_OFFSET + GROUP_COUNT_COL_IDX][row_idx] = - row.group_count; - self.fragment.columns[DECODER_TRACE_OFFSET + IN_SPAN_COL_IDX][row_idx] = - if row.in_basic_block { ONE } else { ZERO }; + row[DECODER_TRACE_OFFSET + OP_INDEX_COL_IDX] = decoder_row.op_index; + row[DECODER_TRACE_OFFSET + GROUP_COUNT_COL_IDX] = decoder_row.group_count; + row[DECODER_TRACE_OFFSET + IN_SPAN_COL_IDX] = + if decoder_row.in_basic_block { ONE } else { ZERO }; // Batch flag columns - all 0 for control flow operations for i in 0..NUM_OP_BATCH_FLAGS { - self.fragment.columns[DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET + i][row_idx] = - row.op_batch_flags[i]; + row[DECODER_TRACE_OFFSET + OP_BATCH_FLAGS_OFFSET + i] = decoder_row.op_batch_flags[i]; } // Extra bit columns - let bit6 = self.fragment.columns[DECODER_TRACE_OFFSET + OP_BITS_OFFSET + 6][row_idx]; - let bit5 = self.fragment.columns[DECODER_TRACE_OFFSET + OP_BITS_OFFSET + 5][row_idx]; - let bit4 = self.fragment.columns[DECODER_TRACE_OFFSET + OP_BITS_OFFSET + 4][row_idx]; - self.fragment.columns[DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET][row_idx] = - bit6 * (ONE - bit5) * bit4; - self.fragment.columns[DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET + 1][row_idx] = - bit6 * bit5; + let bit6 = Felt::from_u8((opcode >> 6) & 1); + let bit5 = Felt::from_u8((opcode >> 5) & 1); + let bit4 = Felt::from_u8((opcode >> 4) & 1); + row[DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET] = bit6 * (ONE - bit5) * bit4; + row[DECODER_TRACE_OFFSET + OP_BITS_EXTRA_COLS_OFFSET + 1] = bit6 * bit5; } - /// Populates the stack trace columns - fn populate_stack_trace_columns(&mut self, stack: &StackState, row_idx: usize) { - use miden_air::trace::STACK_TRACE_WIDTH; - - // If we have buffered stack rows from the previous call, write them to the trace - if let Some(stack_rows) = self.stack_cols { - // Write buffered stack rows to the trace at current row - for (i, &value) in stack_rows.iter().enumerate() { - self.fragment.columns[STACK_TRACE_OFFSET + i][row_idx] = value; - } - } - - // Now populate the buffer with current stack state for the next row - let mut new_stack_rows = [ZERO; STACK_TRACE_WIDTH]; + fn build_system_buffer(system: &SystemState) -> [Felt; SYS_TRACE_WIDTH] { + let mut buf = [ZERO; SYS_TRACE_WIDTH]; + buf[CLK_COL_IDX] = (system.clk + 1).into(); + buf[CTX_COL_IDX] = system.ctx.into(); + buf[FN_HASH_OFFSET] = system.fn_hash[0]; + buf[FN_HASH_OFFSET + 1] = system.fn_hash[1]; + buf[FN_HASH_OFFSET + 2] = system.fn_hash[2]; + buf[FN_HASH_OFFSET + 3] = system.fn_hash[3]; + buf + } - // Stack top (16 elements) + fn build_stack_buffer(stack: &StackState) -> [Felt; STACK_TRACE_WIDTH] { + let mut buf = [ZERO; STACK_TRACE_WIDTH]; for i in STACK_TOP_RANGE { - new_stack_rows[STACK_TOP_OFFSET + i] = stack.get(i); + buf[STACK_TOP_OFFSET + i] = stack.get(i); } // Stack helpers (b0, b1, h0) // Note: H0 will be inverted using batch inversion later - new_stack_rows[B0_COL_IDX] = Felt::new(stack.stack_depth() as u64); // b0 - new_stack_rows[B1_COL_IDX] = stack.overflow_addr(); // b1 - new_stack_rows[H0_COL_IDX] = stack.overflow_helper(); // h0 - - // Store the buffer for the next call - self.stack_cols = Some(new_stack_rows); + buf[B0_COL_IDX] = Felt::new(stack.stack_depth() as u64); + buf[B1_COL_IDX] = stack.overflow_addr(); + buf[H0_COL_IDX] = stack.overflow_helper(); + buf } } diff --git a/processor/src/trace/range/aux_trace.rs b/processor/src/trace/range/aux_trace.rs index f71245396f..7f76797ff8 100644 --- a/processor/src/trace/range/aux_trace.rs +++ b/processor/src/trace/range/aux_trace.rs @@ -3,6 +3,7 @@ use core::mem::MaybeUninit; use miden_air::trace::{ Challenges, MainTrace, RowIndex, + bus_types::RANGE_CHECK_BUS, range::{M_COL_IDX, V_COL_IDX}, }; @@ -68,7 +69,7 @@ impl AuxTraceBuilder { challenges: &Challenges, ) -> Vec { // run batch inversion on the lookup values - let divisors = get_divisors(&self.lookup_values, challenges.alpha); + let divisors = get_divisors(&self.lookup_values, challenges.bus_prefix[RANGE_CHECK_BUS]); // allocate memory for the running sum column and set the initial value to ZERO let mut b_range: Vec> = uninit_vector(main_trace.num_rows()); @@ -98,8 +99,7 @@ impl AuxTraceBuilder { let mut new_value = current_value; // include the operation lookups for lookup in range_checks.iter() { - let value = divisors.get(lookup).expect("invalid lookup value"); - new_value -= *value; + new_value -= divisors[*lookup as usize]; } b_range[b_range_idx].write(new_value); current_value = new_value; @@ -130,17 +130,14 @@ impl AuxTraceBuilder { let mut new_value = current_value; if *multiplicity != ZERO { // add the value in the range checker: multiplicity / (alpha + lookup) - let value = divisors - .get(&(lookup.as_canonical_u64() as u16)) - .expect("invalid lookup value"); - new_value = current_value + *value * *multiplicity; + new_value = + current_value + divisors[lookup.as_canonical_u64() as usize] * *multiplicity; } // subtract the range checks requested by operations if let Some(range_checks) = self.cycle_lookups.get(&(row_idx as u32).into()) { for lookup in range_checks.iter() { - let value = divisors.get(lookup).expect("invalid lookup value"); - new_value -= *value; + new_value -= divisors[*lookup as usize]; } } @@ -148,12 +145,15 @@ impl AuxTraceBuilder { current_value = new_value; } - // at this point, all range checks from user operations and the range checker should be - // matched - so, the last value must be ZERO; - assert_eq!(current_value, E::ZERO); + // At this point, b_range accounts for all cycle-based range check lookups (deltas from + // memory and stack) matched against the range checker table. The range table also contains + // entries for memory address decomposition (w0, w1, 4*w1) whose LogUp requests are on the + // wiring bus, not b_range. So b_range may have a non-zero residual equal to the sum of + // w0/w1/4*w1 LogUp fractions. The combined balance (b_range + v_wiring) is checked via + // reduced_aux_values. if b_range_idx < b_range.len() - 1 { - b_range[(b_range_idx + 1)..].fill(MaybeUninit::new(E::ZERO)); + b_range[(b_range_idx + 1)..].fill(MaybeUninit::new(current_value)); } // all elements are now initialized @@ -164,7 +164,7 @@ impl AuxTraceBuilder { /// Runs batch inversion on all range check lookup values and returns a map which maps each value /// to the divisor used for including it in the LogUp lookup. In other words, the map contains /// mappings of x to 1/(alpha + x). -fn get_divisors>(lookup_values: &[u16], alpha: E) -> BTreeMap { +fn get_divisors>(lookup_values: &[u16], alpha: E) -> Vec { // run batch inversion on the lookup values let mut values: Vec> = uninit_vector(lookup_values.len()); let mut inv_values: Vec> = uninit_vector(lookup_values.len()); @@ -186,11 +186,11 @@ fn get_divisors>(lookup_values: &[u16], alpha: E) -> BTr // multiply the accumulated product by the original values to compute the inverses, then // build a map of inverses for the lookup values - let mut log_values = BTreeMap::new(); + let mut log_values = vec![E::ZERO; 1 << 16]; for i in (0..lookup_values.len()).rev() { inv_values[i] *= acc; acc *= values[i]; - log_values.insert(lookup_values[i], inv_values[i]); + log_values[lookup_values[i] as usize] = inv_values[i]; } log_values diff --git a/processor/src/trace/stack/aux_trace.rs b/processor/src/trace/stack/aux_trace.rs index 5a21b27b18..c8fb40f813 100644 --- a/processor/src/trace/stack/aux_trace.rs +++ b/processor/src/trace/stack/aux_trace.rs @@ -1,6 +1,6 @@ use alloc::vec::Vec; -use miden_air::trace::{Challenges, MainTrace, RowIndex}; +use miden_air::trace::{Challenges, MainTrace, RowIndex, bus_types::STACK_OVERFLOW_TABLE}; use miden_core::{field::ExtensionField, operations::opcodes}; use super::Felt; @@ -112,6 +112,6 @@ impl OverflowTableRow { /// Reduces this row to a single field element in the field specified by E. This requires /// at least 4 alpha values. pub fn to_value>(&self, challenges: &Challenges) -> E { - challenges.encode([self.clk, self.val, self.prev]) + challenges.encode(STACK_OVERFLOW_TABLE, [self.clk, self.val, self.prev]) } } diff --git a/processor/src/trace/tests/chiplets/bitwise.rs b/processor/src/trace/tests/chiplets/bitwise.rs index 5ed3ec7996..ce411b19b7 100644 --- a/processor/src/trace/tests/chiplets/bitwise.rs +++ b/processor/src/trace/tests/chiplets/bitwise.rs @@ -9,7 +9,7 @@ use miden_core::field::Field; use super::{ AUX_TRACE_RAND_CHALLENGES, CHIPLETS_BUS_AUX_TRACE_OFFSET, ExecutionTrace, Felt, HASH_CYCLE_LEN, - LAST_CYCLE_ROW, ONE, Operation, build_trace_from_ops, rand_array, rand_value, + ONE, Operation, build_trace_from_ops, rand_array, rand_value, }; /// Tests the generation of the `b_chip` bus column when only bitwise lookups are included. It @@ -22,7 +22,6 @@ use super::{ /// for this test we set those values explicitly, enforcing only that the same initial and final /// values are requested & provided. #[test] -#[expect(clippy::needless_range_loop)] fn b_chip_trace_bitwise() { let a = rand_value::(); let b = rand_value::(); @@ -62,19 +61,24 @@ fn b_chip_trace_bitwise() { assert_eq!(ONE, b_chip[0]); // At cycle 0 the span hash initialization is requested from the decoder and provided by the - // hash chiplet, so the trace should still equal one. + // hasher (both at main trace row 0), so they cancel and b_chip stays ONE. assert_eq!(ONE, b_chip[1]); - // The first bitwise request from the stack is sent when the `U32and` operation is executed at - // cycle 1, so the request is included in the next row. (The trace begins by executing `span`). - let value = build_expected_bitwise( + // At row 1, two things happen simultaneously: + // - The hasher provides the HOUT response (span hash result) at controller output row 1 + // - The decoder sends the first U32and bitwise request (user op at cycle 1) + // We treat the HOUT response as a black box and extract it from the bus column. + let bitwise_1_value = build_expected_bitwise( &challenges, BITWISE_AND_LABEL, Felt::from_u32(a), Felt::from_u32(b), Felt::from_u32(a & b), ); - let mut expected = value.inverse(); + // b_chip[2] = ONE * hout_response * bitwise_1.inverse() + // so hout_response = b_chip[2] * bitwise_1 + let hout_response = b_chip[2] * bitwise_1_value; + let mut expected = hout_response * bitwise_1_value.inverse(); assert_eq!(expected, b_chip[2]); // Nothing changes during user operations with no requests to the Chiplets. @@ -84,7 +88,6 @@ fn b_chip_trace_bitwise() { // The second bitwise request from the stack is sent when the `U32and` operation is executed at // cycle 4, so the request is included in the next row. - // After Push(a) then Push(b), stack is [b, a, ...] so operands are (s0=b, s1=a). let value = build_expected_bitwise( &challenges, BITWISE_AND_LABEL, @@ -102,7 +105,6 @@ fn b_chip_trace_bitwise() { // The third bitwise request from the stack is sent when the `U32xor` operation is executed at // cycle 15, so the request is included in the next row. - // After Push(a) then Push(b), stack is [b, a, ...] so operands are (s0=b, s1=a). let value = build_expected_bitwise( &challenges, BITWISE_XOR_LABEL, @@ -118,47 +120,40 @@ fn b_chip_trace_bitwise() { assert_eq!(expected, b_chip[row]); } - // At cycle 21 the decoder requests the span hash. Since this test focuses on bitwise lookups, - // we treat the hasher bus messages as a black box and extract their multiplicands directly from - // the bus column. + // At cycle 21 the decoder requests the span hash result (END). This should cancel with the + // HOUT response that was provided earlier at row 1. assert_ne!(expected, b_chip[22]); - let span_request_mult = b_chip[22] * b_chip[21].inverse(); - expected *= span_request_mult; + let span_end_request = b_chip[22] * b_chip[21].inverse(); + expected *= span_end_request; assert_eq!(expected, b_chip[22]); - - // Nothing changes until the hasher provides the result of the `SPAN` hash at the end of the - // hasher cycle. - for row in 23..HASH_CYCLE_LEN { + // Verify the HOUT response and END request cancel. + assert_eq!(hout_response * span_end_request, ONE); + + // The hasher trace in the dispatch/compute split has: + // - Hasher controller rows 0-1 (already processed above) + // - Hasher padding rows 2-31 (selectors [0,1,0] = neither input nor output, no bus activity) + // - Hasher permutation segment rows 32-63 (no bus activity on chiplets bus) + // So nothing changes until the bitwise segment. + let hasher_trace_len = 2 * HASH_CYCLE_LEN; // controller(32 padded) + perm(32) + for row in 23..hasher_trace_len { assert_eq!(expected, b_chip[row]); } - // At the end of the hasher cycle, the hasher provides the `SPAN` hash. Its multiplicand should - // cancel out the earlier request. - assert_ne!(expected, b_chip[HASH_CYCLE_LEN]); - let span_response_mult = b_chip[HASH_CYCLE_LEN] * b_chip[LAST_CYCLE_ROW].inverse(); - assert_eq!(span_request_mult * span_response_mult, ONE); - expected *= span_response_mult; - assert_eq!(expected, b_chip[HASH_CYCLE_LEN]); - - // Bitwise responses will be provided during the bitwise segment of the Chiplets trace, which - // starts after the hash for the span block. Responses are provided at the last row of the - // Bitwise chiplet's operation cycle. - let response_1_row = HASH_CYCLE_LEN + OP_CYCLE_LEN; + // Bitwise responses are provided during the bitwise segment, which starts after the hasher. + let response_1_row = hasher_trace_len + OP_CYCLE_LEN; let response_2_row = response_1_row + OP_CYCLE_LEN; let response_3_row = response_2_row + OP_CYCLE_LEN; // Nothing changes until the Bitwise chiplet responds. - for row in (HASH_CYCLE_LEN + 1)..response_1_row { + for row in hasher_trace_len..response_1_row { assert_eq!(expected, b_chip[row]); } - // At the end of the first bitwise cycle, the response for `U32and` is provided by the Bitwise - // chiplet. + // At the end of the first bitwise cycle, the response for `U32and` is provided. expected *= build_expected_bitwise_from_trace(&trace, &challenges, (response_1_row - 1).into()); assert_eq!(expected, b_chip[response_1_row]); - // At the end of the next bitwise cycle, the response for `U32and` is provided by the Bitwise - // chiplet. + // At the end of the next bitwise cycle, the response for `U32and` is provided. for row in (response_1_row + 1)..response_2_row { assert_eq!(expected, b_chip[row]); } @@ -170,8 +165,7 @@ fn b_chip_trace_bitwise() { assert_eq!(expected, b_chip[row]); } - // At the end of the next bitwise cycle, the response for `U32and` is provided by the Bitwise - // chiplet. + // At the end of the next bitwise cycle, the response for `U32xor` is provided. expected *= build_expected_bitwise_from_trace(&trace, &challenges, (response_3_row - 1).into()); assert_eq!(expected, b_chip[response_3_row]); @@ -191,7 +185,7 @@ fn build_expected_bitwise( s1: Felt, result: Felt, ) -> Felt { - challenges.encode([label, s0, s1, result]) + challenges.encode(miden_air::trace::bus_types::CHIPLETS_BUS, [label, s0, s1, result]) } fn build_expected_bitwise_from_trace( diff --git a/processor/src/trace/tests/chiplets/hasher.rs b/processor/src/trace/tests/chiplets/hasher.rs index fd9205f1db..02a96263ce 100644 --- a/processor/src/trace/tests/chiplets/hasher.rs +++ b/processor/src/trace/tests/chiplets/hasher.rs @@ -1,57 +1,43 @@ use alloc::vec::Vec; -use core::ops::Range; use miden_air::trace::{ - CLK_COL_IDX, Challenges, DECODER_TRACE_OFFSET, RowIndex, - chiplets::{ - HASHER_NODE_INDEX_COL_IDX, HASHER_STATE_COL_RANGE, HASHER_TRACE_OFFSET, - hasher::{ - CAPACITY_DOMAIN_IDX, DIGEST_RANGE, HASH_CYCLE_LEN, HasherState, LAST_CYCLE_ROW, - LINEAR_HASH, LINEAR_HASH_LABEL, MP_VERIFY, MP_VERIFY_LABEL, MR_UPDATE_NEW, - MR_UPDATE_NEW_LABEL, MR_UPDATE_OLD, MR_UPDATE_OLD_LABEL, RATE_LEN, RETURN_HASH, - RETURN_HASH_LABEL, RETURN_STATE, RETURN_STATE_LABEL, STATE_WIDTH, Selectors, - }, + Challenges, RowIndex, bus_message, bus_types, + chiplets::hasher::{ + CONTROLLER_ROWS_PER_PERM_FELT, DIGEST_RANGE, HasherState, LINEAR_HASH_LABEL, + MP_VERIFY_LABEL, MR_UPDATE_NEW_LABEL, MR_UPDATE_OLD_LABEL, RATE_LEN, RETURN_HASH_LABEL, + RETURN_STATE_LABEL, + }, + log_precompile::{ + HELPER_ADDR_IDX, HELPER_CAP_PREV_RANGE, STACK_CAP_NEXT_RANGE, STACK_COMM_RANGE, + STACK_R0_RANGE, STACK_R1_RANGE, STACK_TAG_RANGE, }, - decoder::{NUM_OP_BITS, OP_BITS_OFFSET}, }; use miden_core::{ Word, - chiplets::hasher::apply_permutation, - crypto::merkle::{MerkleStore, MerkleTree, NodeIndex}, + crypto::merkle::{MerkleStore, MerkleTree}, field::Field, mast::{BasicBlockNodeBuilder, MastForest, MastForestContributor, SplitNodeBuilder}, operations::opcodes, program::Program, - utils::range, }; use miden_utils_testing::stack; use super::{ AUX_TRACE_RAND_CHALLENGES, AdviceInputs, CHIPLETS_BUS_AUX_TRACE_OFFSET, ExecutionTrace, Felt, ONE, Operation, ZERO, build_span_with_respan_ops, build_trace_from_ops_with_inputs, - build_trace_from_program, init_state_from_words, rand_array, + build_trace_from_program, rand_array, }; use crate::StackInputs; -// CONSTANTS -// ================================================================================================ - -const DECODER_HASHER_STATE_RANGE: Range = range( - DECODER_TRACE_OFFSET + miden_air::trace::decoder::HASHER_STATE_OFFSET, - miden_air::trace::decoder::NUM_HASHER_COLUMNS, -); - -/// Location of operation bits columns relative to the main trace. -pub const DECODER_OP_BITS_RANGE: Range = - range(DECODER_TRACE_OFFSET + OP_BITS_OFFSET, NUM_OP_BITS); - // TESTS // ================================================================================================ /// Tests the generation of the `b_chip` bus column when the hasher only performs a single `SPAN` /// with one operation batch. +/// +/// Verifies step-by-step that each decoder request (SPAN, END) and each hasher response +/// (sponge start, digest return) correctly update the bus running product. #[test] -#[expect(clippy::needless_range_loop)] pub fn b_chip_span() { let program = { let mut mast_forest = MastForest::new(); @@ -67,68 +53,25 @@ pub fn b_chip_span() { let trace = build_trace_from_program(&program, &[]); - let challenges = rand_array::(); - let aux_columns = trace.build_aux_trace(&challenges).unwrap(); + let rand_challenges = rand_array::(); + let aux_columns = trace.build_aux_trace(&rand_challenges).unwrap(); let b_chip = aux_columns.get_column(CHIPLETS_BUS_AUX_TRACE_OFFSET); - - let challenges = Challenges::::new(challenges[0], challenges[1]); + let challenges = Challenges::new(rand_challenges[0], rand_challenges[1]); assert_eq!(trace.length(), b_chip.len()); assert_eq!(ONE, b_chip[0]); - // at the first cycle the following are added for inclusion in the next row: - // - the initialization of the span hash is requested by the decoder - // - the initialization of the span hash is provided by the hasher - - // initialize the request state. - let mut state = [ZERO; STATE_WIDTH]; - fill_state_from_decoder_with_domain(&trace, &mut state, 0.into()); - // request the initialization of the span hash - let request_init = - build_expected(&challenges, LINEAR_HASH_LABEL, state, [ZERO; STATE_WIDTH], ONE, ZERO); - let mut expected = request_init.inverse(); - - // provide the initialization of the span hash - expected *= build_expected_from_trace(&trace, &challenges, 0.into()); - assert_eq!(expected, b_chip[1]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in 2..4 { - assert_eq!(expected, b_chip[row]); - } - - // At cycle 3 the decoder requests the result of the span hash. - apply_permutation(&mut state); - let request_result = build_expected( - &challenges, - RETURN_HASH_LABEL, - state, - [ZERO; STATE_WIDTH], - Felt::new(HASH_CYCLE_LEN as u64), - ZERO, - ); - expected *= request_result.inverse(); - assert_eq!(expected, b_chip[4]); + // Verify the bus running product step-by-step at every row. + verify_b_chip_step_by_step(&trace, &challenges, b_chip); - // Nothing changes when there is no communication with the hash chiplet. - for row in 5..HASH_CYCLE_LEN { - assert_eq!(expected, b_chip[row]); - } - - // At the end of the hash cycle, the result of the span hash is provided by the hasher - expected *= build_expected_from_trace(&trace, &challenges, LAST_CYCLE_ROW.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN]); - - // The value in b_chip should be ONE now and for the rest of the trace. - for row in HASH_CYCLE_LEN..trace.length() { - assert_eq!(ONE, b_chip[row]); - } + assert_bus_balanced(b_chip); } /// Tests the generation of the `b_chip` bus column when the hasher only performs a `SPAN` but it -/// includes multiple batches. +/// includes multiple batches (RESPAN). +/// +/// Verifies step-by-step that SPAN, RESPAN, and END requests are each matched by hasher responses. #[test] -#[expect(clippy::needless_range_loop)] pub fn b_chip_span_with_respan() { let program = { let mut mast_forest = MastForest::new(); @@ -143,103 +86,23 @@ pub fn b_chip_span_with_respan() { }; let trace = build_trace_from_program(&program, &[]); - let challenges = rand_array::(); - let aux_columns = trace.build_aux_trace(&challenges).unwrap(); + let rand_challenges = rand_array::(); + let aux_columns = trace.build_aux_trace(&rand_challenges).unwrap(); let b_chip = aux_columns.get_column(CHIPLETS_BUS_AUX_TRACE_OFFSET); + let challenges = Challenges::new(rand_challenges[0], rand_challenges[1]); - let challenges = Challenges::::new(challenges[0], challenges[1]); - - assert_eq!(trace.length(), b_chip.len()); assert_eq!(ONE, b_chip[0]); - // at cycle 0 the following are added for inclusion in the next row: - // - the initialization of the span hash is requested by the decoder - // - the initialization of the span hash is provided by the hasher - - // initialize the request state. - let mut state = [ZERO; STATE_WIDTH]; - fill_state_from_decoder_with_domain(&trace, &mut state, 0.into()); - // request the initialization of the span hash - let request_init = - build_expected(&challenges, LINEAR_HASH_LABEL, state, [ZERO; STATE_WIDTH], ONE, ZERO); - let mut expected = request_init.inverse(); - - // provide the initialization of the span hash - expected *= build_expected_from_trace(&trace, &challenges, 0.into()); - assert_eq!(expected, b_chip[1]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in 2..10 { - assert_eq!(expected, b_chip[row]); - } + verify_b_chip_step_by_step(&trace, &challenges, b_chip); - // At cycle 9, after the first operation batch, the decoder initiates a respan and requests the - // absorption of the next operation batch. - apply_permutation(&mut state); - let prev_state = state; - // get the state with the next absorbed batch. - fill_state_from_decoder(&trace, &mut state, 9.into()); - - let request_respan = build_expected( - &challenges, - LINEAR_HASH_LABEL, - prev_state, - state, - Felt::new(HASH_CYCLE_LEN as u64), - ZERO, - ); - expected *= request_respan.inverse(); - assert_eq!(expected, b_chip[10]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in 11..22 { - assert_eq!(expected, b_chip[row]); - } - - // At cycle 21, after the second operation batch, the decoder ends the SPAN block and requests - // its hash. - apply_permutation(&mut state); - let request_result = build_expected( - &challenges, - RETURN_HASH_LABEL, - state, - [ZERO; STATE_WIDTH], - Felt::new((2 * HASH_CYCLE_LEN) as u64), - ZERO, - ); - expected *= request_result.inverse(); - assert_eq!(expected, b_chip[22]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in 23..HASH_CYCLE_LEN { - assert_eq!(expected, b_chip[row]); - } - - // At the end of the first hash cycle, the absorption of the next operation batch is provided - // by the hasher. - expected *= build_expected_from_trace(&trace, &challenges, LAST_CYCLE_ROW.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in (HASH_CYCLE_LEN + 1)..(2 * HASH_CYCLE_LEN) { - assert_eq!(expected, b_chip[row]); - } - - // At the end of the second hash cycle, the result of the span hash is provided by the hasher. - expected *= - build_expected_from_trace(&trace, &challenges, (HASH_CYCLE_LEN + LAST_CYCLE_ROW).into()); - assert_eq!(expected, b_chip[2 * HASH_CYCLE_LEN]); - - // The value in b_chip should be ONE now and for the rest of the trace. - for row in (2 * HASH_CYCLE_LEN)..trace.length() { - assert_eq!(ONE, b_chip[row]); - } + assert_bus_balanced(b_chip); } /// Tests the generation of the `b_chip` bus column when the hasher performs a merge of two code -/// blocks requested by the decoder. (This also requires a `SPAN` block.) +/// blocks requested by the decoder (SPLIT). This also requires inner SPAN blocks. +/// +/// Verifies step-by-step that SPLIT, SPAN, and END requests are each matched by hasher responses. #[test] -#[expect(clippy::needless_range_loop)] pub fn b_chip_merge() { let program = { let mut mast_forest = MastForest::new(); @@ -260,111 +123,21 @@ pub fn b_chip_merge() { let trace = build_trace_from_program(&program, &[]); - let challenges = rand_array::(); - let aux_columns = trace.build_aux_trace(&challenges).unwrap(); + let rand_challenges = rand_array::(); + let aux_columns = trace.build_aux_trace(&rand_challenges).unwrap(); let b_chip = aux_columns.get_column(CHIPLETS_BUS_AUX_TRACE_OFFSET); + let challenges = Challenges::new(rand_challenges[0], rand_challenges[1]); - let challenges = Challenges::::new(challenges[0], challenges[1]); - - assert_eq!(trace.length(), b_chip.len()); assert_eq!(ONE, b_chip[0]); - // at cycle 0 the following are added for inclusion in the next row: - // - the initialization of the merge of the split's child hashes is requested by the decoder - // - the initialization of the code block merge is provided by the hasher - - // initialize the request state. - let mut split_state = [ZERO; STATE_WIDTH]; - fill_state_from_decoder_with_domain(&trace, &mut split_state, 0.into()); - // request the initialization of the span hash - let split_init = - build_expected(&challenges, LINEAR_HASH_LABEL, split_state, [ZERO; STATE_WIDTH], ONE, ZERO); - let mut expected = split_init.inverse(); - - // provide the initialization of the span hash - expected *= build_expected_from_trace(&trace, &challenges, 0.into()); - assert_eq!(expected, b_chip[1]); - - // at cycle 1 the initialization of the span block hash for the false branch is requested by the - // decoder - let mut f_branch_state = [ZERO; STATE_WIDTH]; - fill_state_from_decoder_with_domain(&trace, &mut f_branch_state, 1.into()); - // request the initialization of the false branch hash - let f_branch_init = build_expected( - &challenges, - LINEAR_HASH_LABEL, - f_branch_state, - [ZERO; STATE_WIDTH], - Felt::new((HASH_CYCLE_LEN + 1) as u64), - ZERO, - ); - expected *= f_branch_init.inverse(); - assert_eq!(expected, b_chip[2]); - - // Nothing changes when there is no communication with the hash chiplet. - assert_eq!(expected, b_chip[3]); - - // at cycle 3 the result hash of the span block for the false branch is requested by the decoder - apply_permutation(&mut f_branch_state); - let f_branch_result = build_expected( - &challenges, - RETURN_HASH_LABEL, - f_branch_state, - [ZERO; STATE_WIDTH], - Felt::new((2 * HASH_CYCLE_LEN) as u64), - ZERO, - ); - expected *= f_branch_result.inverse(); - assert_eq!(expected, b_chip[4]); - - // at cycle 4 the result of the split code block's hash is requested by the decoder - apply_permutation(&mut split_state); - let split_result = build_expected( - &challenges, - RETURN_HASH_LABEL, - split_state, - [ZERO; STATE_WIDTH], - Felt::new(HASH_CYCLE_LEN as u64), - ZERO, - ); - expected *= split_result.inverse(); - assert_eq!(expected, b_chip[5]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in 6..HASH_CYCLE_LEN { - assert_eq!(expected, b_chip[row]); - } - - // At the end of the merge hash cycle, the result of the merge is provided by the hasher. - expected *= build_expected_from_trace(&trace, &challenges, LAST_CYCLE_ROW.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN]); - - // At the start of the next hash cycle, the initialization of the hash of the span block for the - // false branch is provided by the hasher. - expected *= build_expected_from_trace(&trace, &challenges, HASH_CYCLE_LEN.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN + 1]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in (HASH_CYCLE_LEN + 2)..(2 * HASH_CYCLE_LEN) { - assert_eq!(expected, b_chip[row]); - } - - // At the end of the false branch hash cycle, the result of the span block for the false branch - // is provided by the hasher. - expected *= - build_expected_from_trace(&trace, &challenges, (HASH_CYCLE_LEN + LAST_CYCLE_ROW).into()); - assert_eq!(expected, b_chip[2 * HASH_CYCLE_LEN]); + verify_b_chip_step_by_step(&trace, &challenges, b_chip); - // The value in b_chip should be ONE now and for the rest of the trace. - for row in (2 * HASH_CYCLE_LEN)..trace.length() { - assert_eq!(ONE, b_chip[row]); - } + assert_bus_balanced(b_chip); } /// Tests the generation of the `b_chip` bus column when the hasher performs a permutation /// requested by the `HPerm` user operation. #[test] -#[expect(clippy::needless_range_loop)] pub fn b_chip_permutation() { let program = { let mut mast_forest = MastForest::new(); @@ -379,109 +152,22 @@ pub fn b_chip_permutation() { let stack = vec![8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 8]; let trace = build_trace_from_program(&program, &stack); - let mut hperm_state: [Felt; STATE_WIDTH] = stack - .iter() - .map(|v| Felt::new(*v)) - .collect::>() - .try_into() - .expect("failed to convert vector to array"); - let challenges = rand_array::(); - let aux_columns = trace.build_aux_trace(&challenges).unwrap(); + let rand_challenges = rand_array::(); + let aux_columns = trace.build_aux_trace(&rand_challenges).unwrap(); let b_chip = aux_columns.get_column(CHIPLETS_BUS_AUX_TRACE_OFFSET); + let challenges = Challenges::new(rand_challenges[0], rand_challenges[1]); - let challenges = Challenges::::new(challenges[0], challenges[1]); - - assert_eq!(trace.length(), b_chip.len()); assert_eq!(ONE, b_chip[0]); - // at cycle 0 the following are added for inclusion in the next row: - // - the initialization of the span hash is requested by the decoder - // - the initialization of the span hash is provided by the hasher - - // initialize the request state. - let mut span_state = [ZERO; STATE_WIDTH]; - fill_state_from_decoder_with_domain(&trace, &mut span_state, 0.into()); - // request the initialization of the span hash - let span_init = - build_expected(&challenges, LINEAR_HASH_LABEL, span_state, [ZERO; STATE_WIDTH], ONE, ZERO); - let mut expected = span_init.inverse(); - // provide the initialization of the span hash - expected *= build_expected_from_trace(&trace, &challenges, 0.into()); - assert_eq!(expected, b_chip[1]); - - // at cycle 1 hperm is executed and the initialization and result of the hash are both - // requested by the stack. - let hperm_init = build_expected( - &challenges, - LINEAR_HASH_LABEL, - hperm_state, - [ZERO; STATE_WIDTH], - Felt::new((HASH_CYCLE_LEN + 1) as u64), - ZERO, - ); - // request the hperm initialization. - expected *= hperm_init.inverse(); - apply_permutation(&mut hperm_state); - let hperm_result = build_expected( - &challenges, - RETURN_STATE_LABEL, - hperm_state, - [ZERO; STATE_WIDTH], - Felt::new((2 * HASH_CYCLE_LEN) as u64), - ZERO, - ); - // request the hperm result. - expected *= hperm_result.inverse(); - assert_eq!(expected, b_chip[2]); - - // at cycle 2 the result of the span hash is requested by the decoder - apply_permutation(&mut span_state); - let span_result = build_expected( - &challenges, - RETURN_HASH_LABEL, - span_state, - [ZERO; STATE_WIDTH], - Felt::new(HASH_CYCLE_LEN as u64), - ZERO, - ); - expected *= span_result.inverse(); - assert_eq!(expected, b_chip[3]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in 4..HASH_CYCLE_LEN { - assert_eq!(expected, b_chip[row]); - } + verify_b_chip_step_by_step(&trace, &challenges, b_chip); - // At the end of the span hash cycle, the result of the span hash is provided by the hasher. - expected *= build_expected_from_trace(&trace, &challenges, LAST_CYCLE_ROW.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN]); - - // At the start of the next hash cycle, the initialization of the hperm hash is provided by the - // hasher. - expected *= build_expected_from_trace(&trace, &challenges, HASH_CYCLE_LEN.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN + 1]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in (HASH_CYCLE_LEN + 2)..(2 * HASH_CYCLE_LEN) { - assert_eq!(expected, b_chip[row]); - } - - // At the end of the hperm hash cycle, the result of the hperm hash is provided by the hasher. - expected *= - build_expected_from_trace(&trace, &challenges, (HASH_CYCLE_LEN + LAST_CYCLE_ROW).into()); - assert_eq!(expected, b_chip[2 * HASH_CYCLE_LEN]); - - // The value in b_chip should be ONE now and for the rest of the trace. - for row in (2 * HASH_CYCLE_LEN)..trace.length() { - assert_eq!(ONE, b_chip[row]); - } + assert_bus_balanced(b_chip); } /// Tests the generation of the `b_chip` bus column when the hasher performs a log_precompile /// operation requested by the stack. The operation absorbs TAG and COMM into a Poseidon2 /// sponge with capacity CAP_PREV, producing (CAP_NEXT, R0, R1). #[test] -#[expect(clippy::needless_range_loop)] pub fn b_chip_log_precompile() { let program = { let mut mast_forest = MastForest::new(); @@ -493,122 +179,25 @@ pub fn b_chip_log_precompile() { Program::new(mast_forest.into(), basic_block_id) }; - // Runtime stack layout: [COMM(5,6,7,8), TAG(1,2,3,4)] with comm[0]=5 on top - let comm_word: Word = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)].into(); - let tag_word: Word = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)].into(); // stack! takes elements in runtime order (first = top) and handles reversal let stack_inputs = stack![5, 6, 7, 8, 1, 2, 3, 4]; let trace = build_trace_from_program(&program, &stack_inputs); - let challenges = rand_array::(); - let aux_columns = trace.build_aux_trace(&challenges).unwrap(); + let rand_challenges = rand_array::(); + let aux_columns = trace.build_aux_trace(&rand_challenges).unwrap(); let b_chip = aux_columns.get_column(CHIPLETS_BUS_AUX_TRACE_OFFSET); + let challenges = Challenges::new(rand_challenges[0], rand_challenges[1]); - let challenges = Challenges::::new(challenges[0], challenges[1]); - - assert_eq!(trace.length(), b_chip.len()); assert_eq!(ONE, b_chip[0]); - let mut expected = ONE; + verify_b_chip_step_by_step(&trace, &challenges, b_chip); - // at cycle 0 the following are added for inclusion in the next row: - // - the initialization of the span hash is requested by the decoder - // - the initialization of the span hash is provided by the hasher - - // initialize the request state. - let mut span_state = [ZERO; STATE_WIDTH]; - fill_state_from_decoder_with_domain(&trace, &mut span_state, 0.into()); - // request the initialization of the span hash - let span_init = - build_expected(&challenges, LINEAR_HASH_LABEL, span_state, [ZERO; STATE_WIDTH], ONE, ZERO); - expected *= span_init.inverse(); - // provide the initialization of the span hash - expected *= build_expected_from_trace(&trace, &challenges, 0.into()); - assert_eq!(expected, b_chip[1]); - - // at cycle 1 log_precompile is executed and the initialization and result of the hash are both - // requested by the stack. - - // Build the input state in sponge order: [COMM, TAG, CAP_PREV] = [RATE0, RATE1, CAP] - // CAP_PREV comes from helper registers and defaults to [0,0,0,0]. - // COMM = [5,6,7,8] is at stack positions 0-3. - // TAG = [1,2,3,4] is at stack positions 4-7. - // init_state_from_words(w1, w2) puts w1 at RATE0 and w2 at RATE1. - let log_pc_state = init_state_from_words(&comm_word, &tag_word); - - let log_pc_init = build_expected( - &challenges, - LINEAR_HASH_LABEL, - log_pc_state, - [ZERO; STATE_WIDTH], - Felt::new((HASH_CYCLE_LEN + 1) as u64), - ZERO, - ); - // request the log_precompile initialization. - expected *= log_pc_init.inverse(); - - // Compute the output state by applying the permutation - let mut log_pc_output_state = log_pc_state; - apply_permutation(&mut log_pc_output_state); - - let log_pc_result = build_expected( - &challenges, - RETURN_STATE_LABEL, - log_pc_output_state, - [ZERO; STATE_WIDTH], - Felt::new((2 * HASH_CYCLE_LEN) as u64), - ZERO, - ); - // request the log_precompile result. - expected *= log_pc_result.inverse(); - assert_eq!(expected, b_chip[2]); - - // at cycle 2 the result of the span hash is requested by the decoder - apply_permutation(&mut span_state); - let span_result = build_expected( - &challenges, - RETURN_HASH_LABEL, - span_state, - [ZERO; STATE_WIDTH], - Felt::new(HASH_CYCLE_LEN as u64), - ZERO, - ); - expected *= span_result.inverse(); - assert_eq!(expected, b_chip[3]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in 4..HASH_CYCLE_LEN { - assert_eq!(expected, b_chip[row]); - } - - // at cycle 7 the result of the span hash is provided by the hasher - expected *= build_expected_from_trace(&trace, &challenges, LAST_CYCLE_ROW.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN]); - - // at cycle 8 the initialization of the log_precompile hash is provided by the hasher - expected *= build_expected_from_trace(&trace, &challenges, HASH_CYCLE_LEN.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN + 1]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in (HASH_CYCLE_LEN + 2)..(2 * HASH_CYCLE_LEN) { - assert_eq!(expected, b_chip[row]); - } - - // at cycle 15 the result of the log_precompile hash is provided by the hasher - expected *= - build_expected_from_trace(&trace, &challenges, (HASH_CYCLE_LEN + LAST_CYCLE_ROW).into()); - assert_eq!(expected, b_chip[2 * HASH_CYCLE_LEN]); - - // The value in b_chip should be ONE now and for the rest of the trace. - for row in (2 * HASH_CYCLE_LEN)..trace.length() { - assert_eq!(ONE, b_chip[row]); - } + assert_bus_balanced(b_chip); } /// Tests the generation of the `b_chip` bus column when the hasher performs a Merkle path /// verification requested by the `MpVerify` user operation. #[test] -#[expect(clippy::needless_range_loop)] fn b_chip_mpverify() { let index = 5usize; let leaves = init_leaves(&[1, 2, 3, 4, 5, 6, 7, 8]); @@ -628,116 +217,29 @@ fn b_chip_mpverify() { stack_inputs, advice_inputs, ); - let challenges = rand_array::(); - let aux_columns = trace.build_aux_trace(&challenges).unwrap(); - let b_chip = aux_columns.get_column(CHIPLETS_BUS_AUX_TRACE_OFFSET); - let challenges = Challenges::::new(challenges[0], challenges[1]); + let rand_challenges = rand_array::(); + let aux_columns = trace.build_aux_trace(&rand_challenges).unwrap(); + let b_chip = aux_columns.get_column(CHIPLETS_BUS_AUX_TRACE_OFFSET); + let challenges = Challenges::new(rand_challenges[0], rand_challenges[1]); - assert_eq!(trace.length(), b_chip.len()); assert_eq!(ONE, b_chip[0]); - // at cycle 0 the following are added for inclusion in the next row: - // - the initialization of the span hash is requested by the decoder - // - the initialization of the span hash is provided by the hasher - - // initialize the request state. - let mut span_state = [ZERO; STATE_WIDTH]; - fill_state_from_decoder_with_domain(&trace, &mut span_state, 0.into()); - // request the initialization of the span hash - let span_init = - build_expected(&challenges, LINEAR_HASH_LABEL, span_state, [ZERO; STATE_WIDTH], ONE, ZERO); - let mut expected = span_init.inverse(); - // provide the initialization of the span hash - expected *= build_expected_from_trace(&trace, &challenges, 0.into()); - assert_eq!(expected, b_chip[1]); - - // at cycle 1 a merkle path verification is executed and the initialization and result of the - // hash are both requested by the stack. - let path = tree - .get_path(NodeIndex::new(tree.depth(), index as u64).unwrap()) - .expect("failed to get Merkle tree path"); - let mp_state = init_state_from_words(&path[0], &leaves[index]); - let mp_init = build_expected( - &challenges, - MP_VERIFY_LABEL, - mp_state, - [ZERO; STATE_WIDTH], - Felt::new((HASH_CYCLE_LEN + 1) as u64), - Felt::new(index as u64), - ); - // request the initialization of the Merkle path verification - expected *= mp_init.inverse(); - - let mp_verify_complete = HASH_CYCLE_LEN + (tree.depth() as usize) * HASH_CYCLE_LEN; - let mut result_state = [ZERO; STATE_WIDTH]; - result_state[DIGEST_RANGE].copy_from_slice(tree.root().as_elements()); - let mp_result = build_expected( - &challenges, - RETURN_HASH_LABEL, - result_state, - [ZERO; STATE_WIDTH], - Felt::new(mp_verify_complete as u64), - Felt::new(index as u64 >> tree.depth()), - ); - // request the result of the Merkle path verification - expected *= mp_result.inverse(); - assert_eq!(expected, b_chip[2]); - - // at cycle 2 the result of the span hash is requested by the decoder - apply_permutation(&mut span_state); - let span_result = build_expected( - &challenges, - RETURN_HASH_LABEL, - span_state, - [ZERO; STATE_WIDTH], - Felt::new(HASH_CYCLE_LEN as u64), - ZERO, - ); - expected *= span_result.inverse(); - assert_eq!(expected, b_chip[3]); + verify_b_chip_step_by_step(&trace, &challenges, b_chip); - // Nothing changes when there is no communication with the hash chiplet. - for row in 4..HASH_CYCLE_LEN { - assert_eq!(expected, b_chip[row]); - } - - // At the end of the span hash cycle, the result of the span hash is provided by the hasher. - expected *= build_expected_from_trace(&trace, &challenges, LAST_CYCLE_ROW.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN]); - - // At the start of the next hash cycle, the initialization of the merkle path is provided by - // the hasher. - expected *= build_expected_from_trace(&trace, &challenges, HASH_CYCLE_LEN.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN + 1]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in (HASH_CYCLE_LEN + 2)..(mp_verify_complete) { - assert_eq!(expected, b_chip[row]); - } - - // when the merkle path verification has been completed the hasher provides the result - expected *= build_expected_from_trace(&trace, &challenges, (mp_verify_complete - 1).into()); - assert_eq!(expected, b_chip[mp_verify_complete]); - - // The value in b_chip should be ONE now and for the rest of the trace. - for row in mp_verify_complete..trace.length() { - assert_eq!(ONE, b_chip[row]); - } + assert_bus_balanced(b_chip); } /// Tests the generation of the `b_chip` bus column when the hasher performs a Merkle root update /// requested by the `MrUpdate` user operation. #[test] -#[expect(clippy::needless_range_loop)] fn b_chip_mrupdate() { let index = 5usize; let leaves = init_leaves(&[1, 2, 3, 4, 5, 6, 7, 8]); - let mut tree = MerkleTree::new(&leaves).unwrap(); + let tree = MerkleTree::new(&leaves).unwrap(); let old_root = tree.root(); let old_leaf_value = leaves[index]; - let new_leaf_value = leaves[0]; let mut runtime_stack = Vec::new(); @@ -752,239 +254,159 @@ fn b_chip_mrupdate() { let trace = build_trace_from_ops_with_inputs(vec![Operation::MrUpdate], stack_inputs, advice_inputs); - let challenges = rand_array::(); - let aux_columns = trace.build_aux_trace(&challenges).unwrap(); - let b_chip = aux_columns.get_column(CHIPLETS_BUS_AUX_TRACE_OFFSET); - let challenges = Challenges::::new(challenges[0], challenges[1]); + let rand_challenges = rand_array::(); + let aux_columns = trace.build_aux_trace(&rand_challenges).unwrap(); + let b_chip = aux_columns.get_column(CHIPLETS_BUS_AUX_TRACE_OFFSET); + let challenges = Challenges::new(rand_challenges[0], rand_challenges[1]); - assert_eq!(trace.length(), b_chip.len()); assert_eq!(ONE, b_chip[0]); - // at cycle 0 the following are added for inclusion in the next row: - // - the initialization of the span hash is requested by the decoder - // - the initialization of the span hash is provided by the hasher - - // initialize the request state. - let mut span_state = [ZERO; STATE_WIDTH]; - fill_state_from_decoder_with_domain(&trace, &mut span_state, 0.into()); - // request the initialization of the span hash - let span_init = - build_expected(&challenges, LINEAR_HASH_LABEL, span_state, [ZERO; STATE_WIDTH], ONE, ZERO); - let mut expected = span_init.inverse(); - // provide the initialization of the span hash - expected *= build_expected_from_trace(&trace, &challenges, 0.into()); - assert_eq!(expected, b_chip[1]); - - // at cycle 1 a merkle path verification is executed and the initialization and result of the - // hash are both requested by the stack. - let path = tree - .get_path(NodeIndex::new(tree.depth(), index as u64).unwrap()) - .expect("failed to get Merkle tree path"); - let mp_state = init_state_from_words(&path[0], &leaves[index]); - let mp_init_old = build_expected( - &challenges, - MR_UPDATE_OLD_LABEL, - mp_state, - [ZERO; STATE_WIDTH], - Felt::new((HASH_CYCLE_LEN + 1) as u64), - Felt::new(index as u64), - ); - // request the initialization of the (first) Merkle path verification - expected *= mp_init_old.inverse(); - - let mp_old_verify_complete = HASH_CYCLE_LEN + (tree.depth() as usize) * HASH_CYCLE_LEN; - let mut result_state_old = [ZERO; STATE_WIDTH]; - result_state_old[DIGEST_RANGE].copy_from_slice(tree.root().as_elements()); - let mp_result_old = build_expected( - &challenges, - RETURN_HASH_LABEL, - result_state_old, - [ZERO; STATE_WIDTH], - Felt::new(mp_old_verify_complete as u64), - Felt::new(index as u64 >> tree.depth()), - ); - - // request the result of the first Merkle path verification - expected *= mp_result_old.inverse(); - - let new_leaf_value = leaves[0]; - tree.update_leaf(index as u64, new_leaf_value).unwrap(); - let new_root = tree.root(); - - // a second merkle path verification is executed and the initialization and result of the - // hash are both requested by the stack. - let path = tree - .get_path(NodeIndex::new(tree.depth(), index as u64).unwrap()) - .expect("failed to get Merkle tree path"); - let mp_state = init_state_from_words(&path[0], &new_leaf_value); - - let mp_new_verify_complete = mp_old_verify_complete + (tree.depth() as usize) * HASH_CYCLE_LEN; - let mp_init_new = build_expected( - &challenges, - MR_UPDATE_NEW_LABEL, - mp_state, - [ZERO; STATE_WIDTH], - Felt::new(mp_old_verify_complete as u64 + 1), - Felt::new(index as u64), - ); - - // request the initialization of the second Merkle path verification - expected *= mp_init_new.inverse(); - - let mut result_state_new = [ZERO; STATE_WIDTH]; - result_state_new[DIGEST_RANGE].copy_from_slice(new_root.as_elements()); - let mp_result_new = build_expected( - &challenges, - RETURN_HASH_LABEL, - result_state_new, - [ZERO; STATE_WIDTH], - Felt::new(mp_new_verify_complete as u64), - Felt::new(index as u64 >> tree.depth()), - ); + verify_b_chip_step_by_step(&trace, &challenges, b_chip); - // request the result of the second Merkle path verification - expected *= mp_result_new.inverse(); - assert_eq!(expected, b_chip[2]); - - // at cycle 2 the result of the span hash is requested by the decoder - apply_permutation(&mut span_state); - let span_result = build_expected( - &challenges, - RETURN_HASH_LABEL, - span_state, - [ZERO; STATE_WIDTH], - Felt::new(HASH_CYCLE_LEN as u64), - ZERO, - ); - expected *= span_result.inverse(); - assert_eq!(expected, b_chip[3]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in 4..HASH_CYCLE_LEN { - assert_eq!(expected, b_chip[row]); - } - - // At the end of the span hash cycle, the result of the span hash is provided by the hasher. - expected *= build_expected_from_trace(&trace, &challenges, LAST_CYCLE_ROW.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN]); - - // At the start of the next hash cycle, the initialization of the first merkle path is provided - // by the hasher. - expected *= build_expected_from_trace(&trace, &challenges, HASH_CYCLE_LEN.into()); - assert_eq!(expected, b_chip[HASH_CYCLE_LEN + 1]); - - // Nothing changes when there is no communication with the hash chiplet. - for row in (HASH_CYCLE_LEN + 2)..(mp_old_verify_complete) { - assert_eq!(expected, b_chip[row]); - } - - // when the first merkle path verification has been completed the hasher provides the result - expected *= build_expected_from_trace(&trace, &challenges, (mp_old_verify_complete - 1).into()); - assert_eq!(expected, b_chip[mp_old_verify_complete]); - - // at cycle 32 the initialization of the second merkle path is provided by the hasher - expected *= build_expected_from_trace(&trace, &challenges, mp_old_verify_complete.into()); - assert_eq!(expected, b_chip[mp_old_verify_complete + 1]); + assert_bus_balanced(b_chip); +} - // Nothing changes when there is no communication with the hash chiplet. - for row in (mp_old_verify_complete + 1)..(mp_new_verify_complete) { - assert_eq!(expected, b_chip[row]); - } +// TEST HELPERS -- MESSAGE BUILDERS +// ================================================================================================ +// +// These helpers build expected bus message values for each of the 5 message types. +// The label encoding and selector mapping are encapsulated here so tests can +// speak in terms of operations, not selector bits. +// +// Label convention: input messages use label + 16, output messages use label + 32. + +const LABEL_OFFSET_INPUT: u8 = 16; +const LABEL_OFFSET_OUTPUT: u8 = 32; + +/// Sponge start message: full 12-element state (matches SPAN / control block request). +fn sponge_start_msg(challenges: &Challenges, addr: Felt, state: &HasherState) -> Felt { + let header = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[0] * Felt::from_u8(LINEAR_HASH_LABEL + LABEL_OFFSET_INPUT) + + challenges.beta_powers[1] * addr; + header + build_value(&challenges.beta_powers[3..15], state) +} - // when the merkle path verification has been completed the hasher provides the result - expected *= build_expected_from_trace(&trace, &challenges, (mp_new_verify_complete - 1).into()); - assert_eq!(expected, b_chip[mp_new_verify_complete]); +/// Sponge continuation message: rate-only 8 elements (matches RESPAN request). +/// Both the RESPAN request and the hasher continuation response use LABEL_OFFSET_OUTPUT (= 32). +fn sponge_continuation_msg(challenges: &Challenges, addr: Felt, rate: &[Felt]) -> Felt { + assert_eq!(rate.len(), RATE_LEN); + let header = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[0] * Felt::from_u8(LINEAR_HASH_LABEL + LABEL_OFFSET_OUTPUT) + + challenges.beta_powers[1] * addr; + header + build_value(&challenges.beta_powers[3..11], rate) +} - // The value in b_chip should be ONE now and for the rest of the trace. - for row in (mp_new_verify_complete)..trace.length() { - assert_eq!(ONE, b_chip[row]); - } +/// Digest return message: 4-element digest (matches END / MPVERIFY output / MRUPDATE output). +fn digest_return_msg(challenges: &Challenges, addr: Felt, digest: &[Felt]) -> Felt { + assert_eq!(digest.len(), 4); + let header = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[0] * Felt::from_u8(RETURN_HASH_LABEL + LABEL_OFFSET_OUTPUT) + + challenges.beta_powers[1] * addr; + header + build_value(&challenges.beta_powers[3..7], digest) } -// TEST HELPERS -// ================================================================================================ +/// Full state return message: 12-element state (matches HPERM output). +fn full_state_return_msg(challenges: &Challenges, addr: Felt, state: &HasherState) -> Felt { + let header = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[0] * Felt::from_u8(RETURN_STATE_LABEL + LABEL_OFFSET_OUTPUT) + + challenges.beta_powers[1] * addr; + header + build_value(&challenges.beta_powers[3..15], state) +} -/// Reduces the provided hasher row information to an expected value. -fn build_expected( +/// Tree input message: leaf word selected by direction bit (matches MPVERIFY/MRUPDATE input). +fn tree_input_msg( challenges: &Challenges, label: u8, - state: HasherState, - next_state: HasherState, addr: Felt, index: Felt, + leaf_word: &[Felt; 4], ) -> Felt { - let first_cycle_row = addr_to_cycle_row(addr) == 0; - let transition_label = if first_cycle_row { label + 16_u8 } else { label + 32_u8 }; - let header = challenges.alpha - + challenges.beta_powers[0] * Felt::from_u8(transition_label) + let header = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[0] * Felt::from_u8(label + LABEL_OFFSET_INPUT) + challenges.beta_powers[1] * addr + challenges.beta_powers[2] * index; - let mut value = header; - - if (first_cycle_row && label == LINEAR_HASH_LABEL) || label == RETURN_STATE_LABEL { - // include the entire state (words a, b, c) - value += build_value(&challenges.beta_powers[3..15], &state); - } else if label == LINEAR_HASH_LABEL { - // Include the next absorbed rate portion of the state (RATE0 || RATE1). - // With LE sponge layout [RATE0, RATE1, CAP], rate is at indices 0..8. - value += build_value(&challenges.beta_powers[3..11], &next_state[0..RATE_LEN]); - } else if label == RETURN_HASH_LABEL { - // include the digest (word b) - value += build_value(&challenges.beta_powers[3..7], &state[DIGEST_RANGE]); - } else { - assert!( - label == MP_VERIFY_LABEL - || label == MR_UPDATE_NEW_LABEL - || label == MR_UPDATE_OLD_LABEL - ); - let bit = index.as_canonical_u64() & 1; - // For Merkle operations, RATE0 and RATE1 hold the two child digests. - // With LE sponge layout [RATE0, RATE1, CAP], they are at indices 0..4 and 4..8. - let left_word = build_value(&challenges.beta_powers[3..7], &state[0..4]); - let right_word = build_value(&challenges.beta_powers[3..7], &state[4..8]); - - value += Felt::new(1 - bit) * left_word + Felt::new(bit) * right_word; - } - - value + header + build_value(&challenges.beta_powers[3..7], leaf_word) } -/// Reduces the specified row in the execution trace to an expected value representing a hash -/// operation lookup. -fn build_expected_from_trace( +/// Reads the hasher chiplet response at the given trace row. +/// +/// This mirrors the response builder logic: reads the trace and computes the bus message. +/// Returns ONE (identity) if the row doesn't produce a response. +fn hasher_response_at( trace: &ExecutionTrace, challenges: &Challenges, row: RowIndex, ) -> Felt { - let s0 = trace.main_trace.get_column(HASHER_TRACE_OFFSET)[row]; - let s1 = trace.main_trace.get_column(HASHER_TRACE_OFFSET + 1)[row]; - let s2 = trace.main_trace.get_column(HASHER_TRACE_OFFSET + 2)[row]; - let selectors: Selectors = [s0, s1, s2]; - - let label = get_label_from_selectors(selectors) - .expect("unrecognized hasher operation label in hasher trace"); - - let addr = trace.main_trace.get_column(CLK_COL_IDX)[row] + ONE; - let index = trace.main_trace.get_column(HASHER_NODE_INDEX_COL_IDX)[row]; - - let cycle_row = addr_to_cycle_row(addr); - - // Trace is already in sponge order [RATE0, RATE1, CAP] - let mut state = [ZERO; STATE_WIDTH]; - let mut next_state = [ZERO; STATE_WIDTH]; - for (i, col_idx) in HASHER_STATE_COL_RANGE.enumerate() { - state[i] = trace.main_trace.get_column(col_idx)[row]; - if cycle_row == LAST_CYCLE_ROW && label == LINEAR_HASH_LABEL { - next_state[i] = trace.main_trace.get_column(col_idx)[row + 1]; + let s_perm = trace.main_trace.chiplet_s_perm(row); + if s_perm == ONE { + return ONE; // perm segment: no response + } + + // Hasher internal selectors (chiplet columns 1, 2, 3 = hasher s0, s1, s2) + let hasher_s0 = trace.main_trace.chiplet_selector_1(row); + let hasher_s1 = trace.main_trace.chiplet_selector_2(row); + let hasher_s2 = trace.main_trace.chiplet_selector_3(row); + + let addr = Felt::from(u32::from(row) + 1); + let state = trace.main_trace.chiplet_hasher_state(row); + let node_index = trace.main_trace.chiplet_node_index(row); + + // Input rows (hasher s0=1) + if hasher_s0 == ONE { + let is_start = trace.main_trace.chiplet_is_boundary(row); + + // Sponge mode (s1=0, s2=0) + if hasher_s1 == ZERO && hasher_s2 == ZERO { + if is_start == ONE { + return sponge_start_msg(challenges, addr, &state); + } else { + return sponge_continuation_msg(challenges, addr, &state[..RATE_LEN]); + } + } + + // Tree mode (s1=1 or s2=1) -- only start rows produce responses + if is_start == ONE { + let label = if hasher_s1 == ZERO { + MP_VERIFY_LABEL + } else if hasher_s2 == ZERO { + MR_UPDATE_OLD_LABEL + } else { + MR_UPDATE_NEW_LABEL + }; + let bit = (node_index.as_canonical_u64() & 1) as usize; + let leaf_word: [Felt; 4] = if bit == 0 { + state[..4].try_into().unwrap() + } else { + state[4..8].try_into().unwrap() + }; + return tree_input_msg(challenges, label, addr, node_index, &leaf_word); + } + + return ONE; // tree continuation: no response + } + + // Output rows (hasher s0=0, s1=0) + if hasher_s0 == ZERO && hasher_s1 == ZERO { + // HOUT (s2=0): always produces response + if hasher_s2 == ZERO { + return digest_return_msg(challenges, addr, &state[DIGEST_RANGE]); + } + + // SOUT (s2=1): only with is_final=1 + let is_final = trace.main_trace.chiplet_is_boundary(row); + if is_final == ONE { + return full_state_return_msg(challenges, addr, &state); } } - build_expected(challenges, label, state, next_state, addr, index) + ONE // no response } -/// Builds a value from coefficients and elements of matching lengths. This can be used to build -/// the value for a single word or for the entire state. +// TEST HELPERS -- STATE BUILDERS +// ================================================================================================ + +/// Builds a value from coefficients and elements of matching lengths. fn build_value(coeffs: &[Felt], elements: &[Felt]) -> Felt { let mut value = ZERO; for (&coeff, &element) in coeffs.iter().zip(elements.iter()) { @@ -993,79 +415,327 @@ fn build_value(coeffs: &[Felt], elements: &[Felt]) -> Felt { value } -/// Returns the hash operation label for the specified selectors. -fn get_label_from_selectors(selectors: Selectors) -> Option { - if selectors == LINEAR_HASH { - Some(LINEAR_HASH_LABEL) - } else if selectors == MP_VERIFY { - Some(MP_VERIFY_LABEL) - } else if selectors == MR_UPDATE_OLD { - Some(MR_UPDATE_OLD_LABEL) - } else if selectors == MR_UPDATE_NEW { - Some(MR_UPDATE_NEW_LABEL) - } else if selectors == RETURN_HASH { - Some(RETURN_HASH_LABEL) - } else if selectors == RETURN_STATE { - Some(RETURN_STATE_LABEL) - } else { - None - } -} +// STEP-BY-STEP BUS VERIFICATION +// ================================================================================================ -/// Populates the provided HasherState with the state stored in the decoder's execution trace at the -/// specified row. -fn fill_state_from_decoder_with_domain( +/// Computes the decoder's request to the chiplets bus at the given row. +/// +/// Only handles hasher-related opcodes (SPAN, END, RESPAN, SPLIT, JOIN, LOOP). +/// Returns ONE (identity) for all other opcodes. +fn decoder_request_at( trace: &ExecutionTrace, - state: &mut HasherState, + challenges: &Challenges, row: RowIndex, -) { - let domain = extract_control_block_domain_from_trace(trace, row); - state[CAPACITY_DOMAIN_IDX] = domain; - - fill_state_from_decoder(trace, state, row); -} - -/// Populates the provided HasherState with the state stored in the decoder's execution trace at the -/// specified row. The decoder stores the 8 rate elements which go at sponge indices 0..8. -fn fill_state_from_decoder(trace: &ExecutionTrace, state: &mut HasherState, row: RowIndex) { - for (i, col_idx) in DECODER_HASHER_STATE_RANGE.enumerate() { - // In sponge order [RATE0, RATE1, CAP], rate is at indices 0..8 - state[i] = trace.main_trace.get_column(col_idx)[row]; +) -> Felt { + let op_code = trace.main_trace.get_op_code(row).as_canonical_u64() as u8; + + match op_code { + opcodes::SPAN => { + // SPAN request: rate-only message (LINEAR_HASH_LABEL + 16) at addr(row+1). + let addr_next = trace.main_trace.addr(row + 1); + let state = trace.main_trace.decoder_hasher_state(row); + let header = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(LINEAR_HASH_LABEL + LABEL_OFFSET_INPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * addr_next; + let mut value = header; + for (i, &elem) in state.iter().enumerate() { + value += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + value + }, + opcodes::RESPAN => { + // RESPAN request: rate-only message (LINEAR_HASH_LABEL + 32) at addr(row+1). + let addr_next = trace.main_trace.addr(row + 1); + let state = trace.main_trace.decoder_hasher_state(row); + let header = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(LINEAR_HASH_LABEL + LABEL_OFFSET_OUTPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * addr_next; + let mut value = header; + for (i, &elem) in state.iter().enumerate() { + value += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + value + }, + opcodes::END => { + // END request: digest message (RETURN_HASH_LABEL + 32) at addr(row) + 1. + let addr = trace.main_trace.addr(row) + ONE; + let state = trace.main_trace.decoder_hasher_state(row); + let digest = &state[..4]; + let header = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(RETURN_HASH_LABEL + LABEL_OFFSET_OUTPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * addr; + let mut value = header; + for (i, &elem) in digest.iter().enumerate() { + value += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + value + }, + opcodes::SPLIT | opcodes::JOIN | opcodes::LOOP => { + // Control block request: rate + capacity domain element for op_code. + let addr_next = trace.main_trace.addr(row + 1); + let state = trace.main_trace.decoder_hasher_state(row); + let op_code_felt = trace.main_trace.get_op_code(row); + let header = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(LINEAR_HASH_LABEL + LABEL_OFFSET_INPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * addr_next; + let mut value = header; + for (i, &elem) in state.iter().enumerate() { + value += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + value += challenges.beta_powers[bus_message::CAPACITY_DOMAIN_IDX] * op_code_felt; + value + }, + opcodes::HPERM => { + // HPERM sends two messages: input (full state from stack) and output (full state + // from next row). Combined as a product. + let helper_0 = trace.main_trace.helper_register(0, row); + let state: [Felt; 12] = + core::array::from_fn(|i| trace.main_trace.stack_element(i, row)); + let state_nxt: [Felt; 12] = + core::array::from_fn(|i| trace.main_trace.stack_element(i, row + 1)); + + let input_value = { + let mut acc = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(LINEAR_HASH_LABEL + LABEL_OFFSET_INPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * helper_0; + for (i, &elem) in state.iter().enumerate() { + acc += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + acc + }; + let output_value = { + let mut acc = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(RETURN_STATE_LABEL + LABEL_OFFSET_OUTPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * (helper_0 + ONE); + for (i, &elem) in state_nxt.iter().enumerate() { + acc += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + acc + }; + input_value * output_value + }, + opcodes::LOGPRECOMPILE => { + // LOG_PRECOMPILE sends two messages: input [COMM, TAG, CAP_PREV] and + // output [R0, R1, CAP_NEXT]. Combined as a product. + let addr = trace.main_trace.helper_register(HELPER_ADDR_IDX, row); + let cap_prev: [Felt; 4] = core::array::from_fn(|i| { + trace.main_trace.helper_register(HELPER_CAP_PREV_RANGE.start + i, row) + }); + let comm = trace.main_trace.stack_word(STACK_COMM_RANGE.start, row); + let tag = trace.main_trace.stack_word(STACK_TAG_RANGE.start, row); + let input_state: Vec = comm + .as_elements() + .iter() + .chain(tag.as_elements().iter()) + .chain(cap_prev.iter()) + .copied() + .collect(); + + let r0 = trace.main_trace.stack_word(STACK_R0_RANGE.start, row + 1); + let r1 = trace.main_trace.stack_word(STACK_R1_RANGE.start, row + 1); + let cap_next = trace.main_trace.stack_word(STACK_CAP_NEXT_RANGE.start, row + 1); + let output_state: Vec = r0 + .as_elements() + .iter() + .chain(r1.as_elements().iter()) + .chain(cap_next.as_elements().iter()) + .copied() + .collect(); + + let input_value = { + let mut acc = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(LINEAR_HASH_LABEL + LABEL_OFFSET_INPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * addr; + for (i, &elem) in input_state.iter().enumerate() { + acc += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + acc + }; + let output_value = { + let mut acc = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(RETURN_STATE_LABEL + LABEL_OFFSET_OUTPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * (addr + ONE); + for (i, &elem) in output_state.iter().enumerate() { + acc += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + acc + }; + input_value * output_value + }, + opcodes::MPVERIFY => { + // MPVERIFY sends two messages: input (leaf word + node_index) and output (root + // digest). Combined as a product. + let helper_0 = trace.main_trace.helper_register(0, row); + let rows_per_perm = CONTROLLER_ROWS_PER_PERM_FELT; + + let node_value = trace.main_trace.stack_word(0, row); + let node_depth = trace.main_trace.stack_element(4, row); + let node_index = trace.main_trace.stack_element(5, row); + let merkle_root = trace.main_trace.stack_word(6, row); + + let node_word: [Felt; 4] = + node_value.as_elements().try_into().expect("word must be 4 field elements"); + let root_word: [Felt; 4] = + merkle_root.as_elements().try_into().expect("word must be 4 field elements"); + + let input_value = { + let mut acc = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(MP_VERIFY_LABEL + LABEL_OFFSET_INPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * helper_0 + + challenges.beta_powers[bus_message::NODE_INDEX_IDX] * node_index; + for (i, &elem) in node_word.iter().enumerate() { + acc += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + acc + }; + let output_addr = helper_0 + node_depth * rows_per_perm - ONE; + let output_value = { + let mut acc = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(RETURN_HASH_LABEL + LABEL_OFFSET_OUTPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * output_addr; + for (i, &elem) in root_word.iter().enumerate() { + acc += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + acc + }; + input_value * output_value + }, + opcodes::MRUPDATE => { + // MRUPDATE sends four messages: old input, old output, new input, new output. + // Combined as a product. + let helper_0 = trace.main_trace.helper_register(0, row); + let rows_per_perm = CONTROLLER_ROWS_PER_PERM_FELT; + let two_legs_rows = rows_per_perm + rows_per_perm; + + let old_node_value = trace.main_trace.stack_word(0, row); + let merkle_path_depth = trace.main_trace.stack_element(4, row); + let node_index = trace.main_trace.stack_element(5, row); + let old_root = trace.main_trace.stack_word(6, row); + let new_node_value = trace.main_trace.stack_word(10, row); + let new_root = trace.main_trace.stack_word(0, row + 1); + + let old_node_word: [Felt; 4] = + old_node_value.as_elements().try_into().expect("word must be 4 field elements"); + let old_root_word: [Felt; 4] = + old_root.as_elements().try_into().expect("word must be 4 field elements"); + let new_node_word: [Felt; 4] = + new_node_value.as_elements().try_into().expect("word must be 4 field elements"); + let new_root_word: [Felt; 4] = + new_root.as_elements().try_into().expect("word must be 4 field elements"); + + let input_old = { + let mut acc = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(MR_UPDATE_OLD_LABEL + LABEL_OFFSET_INPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * helper_0 + + challenges.beta_powers[bus_message::NODE_INDEX_IDX] * node_index; + for (i, &elem) in old_node_word.iter().enumerate() { + acc += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + acc + }; + let output_old = { + let output_addr = helper_0 + merkle_path_depth * rows_per_perm - ONE; + let mut acc = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(RETURN_HASH_LABEL + LABEL_OFFSET_OUTPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * output_addr; + for (i, &elem) in old_root_word.iter().enumerate() { + acc += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + acc + }; + let input_new = { + let new_input_addr = helper_0 + merkle_path_depth * rows_per_perm; + let mut acc = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(MR_UPDATE_NEW_LABEL + LABEL_OFFSET_INPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * new_input_addr + + challenges.beta_powers[bus_message::NODE_INDEX_IDX] * node_index; + for (i, &elem) in new_node_word.iter().enumerate() { + acc += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + acc + }; + let output_new = { + let new_output_addr = helper_0 + merkle_path_depth * two_legs_rows - ONE; + let mut acc = challenges.bus_prefix[bus_types::CHIPLETS_BUS] + + challenges.beta_powers[bus_message::LABEL_IDX] + * Felt::from_u8(RETURN_HASH_LABEL + LABEL_OFFSET_OUTPUT) + + challenges.beta_powers[bus_message::ADDR_IDX] * new_output_addr; + for (i, &elem) in new_root_word.iter().enumerate() { + acc += challenges.beta_powers[bus_message::STATE_START_IDX + i] * elem; + } + acc + }; + input_old * output_old * input_new * output_new + }, + _ => ONE, } } -/// Extract the control block domain from the execution trace. This is achieved -/// by calculating the op code as [bit_0 * 2**0 + bit_1 * 2**1 + ... + bit_6 * 2**6] -fn extract_control_block_domain_from_trace(trace: &ExecutionTrace, row: RowIndex) -> Felt { - // calculate the op code - let opcode_value = DECODER_OP_BITS_RANGE.rev().fold(0u8, |result, bit_index| { - let op_bit = trace.main_trace.get_column(bit_index)[row].as_canonical_u64() as u8; - (result << 1) ^ op_bit - }); - - // opcode values that represent control block initialization (excluding span) - let control_block_initializers = - [opcodes::CALL, opcodes::JOIN, opcodes::LOOP, opcodes::SPLIT, opcodes::SYSCALL]; - - if control_block_initializers.contains(&opcode_value) { - Felt::from_u8(opcode_value) - } else { - ZERO +/// Verifies b_chip step-by-step by recomputing the running product at every row. +/// +/// At each row `r`: +/// request = decoder_request_at(r) +/// response = hasher_response_at(r) +/// expected[r+1] = expected[r] * response / request +/// +/// Asserts that the recomputed value matches `b_chip[r+1]` at every row. +fn verify_b_chip_step_by_step( + trace: &ExecutionTrace, + challenges: &Challenges, + b_chip: &[Felt], +) { + let mut expected = ONE; + let trace_len = b_chip.len(); + + for row_idx in 0..trace_len - 1 { + let row = RowIndex::from(row_idx); + let request = decoder_request_at(trace, challenges, row); + let response = hasher_response_at(trace, challenges, row); + + expected *= response * request.try_inverse().expect("request must be invertible"); + + assert_eq!( + expected, + b_chip[row_idx + 1], + "b_chip mismatch at row {} (after processing row {}): \ + expected={}, actual={}, request={}, response={}", + row_idx + 1, + row_idx, + expected, + b_chip[row_idx + 1], + request, + response, + ); } } -/// Returns the row of the hash cycle which corresponds to the provided Hasher address. -fn addr_to_cycle_row(addr: Felt) -> usize { - let cycle = (addr.as_canonical_u64() - 1) as usize; - let cycle_row = cycle % HASH_CYCLE_LEN; - debug_assert!( - cycle_row == 0 || cycle_row == LAST_CYCLE_ROW, - "invalid address for hasher lookup" - ); +// BUS BALANCE ASSERTION +// ================================================================================================ - cycle_row +/// Asserts that the b_chip bus column eventually settles to ONE (balanced) and stays there. +fn assert_bus_balanced(b_chip: &[Felt]) { + // The bus should reach ONE at some point after the initial requests/responses + // and stay there for the rest of the trace. + let last = *b_chip.last().expect("b_chip should not be empty"); + assert_eq!(last, ONE, "b_chip final value should be ONE (bus balanced), got {last}"); } +// MERKLE TREE HELPERS +// ================================================================================================ + /// Initializes Merkle tree leaves with the specified values. fn init_leaves(values: &[u64]) -> Vec { values.iter().map(|&v| init_leaf(v)).collect() diff --git a/processor/src/trace/tests/chiplets/memory.rs b/processor/src/trace/tests/chiplets/memory.rs index 25540c2420..881f6bba44 100644 --- a/processor/src/trace/tests/chiplets/memory.rs +++ b/processor/src/trace/tests/chiplets/memory.rs @@ -15,7 +15,7 @@ use miden_core::{WORD_SIZE, field::Field}; use super::{ AUX_TRACE_RAND_CHALLENGES, CHIPLETS_BUS_AUX_TRACE_OFFSET, ExecutionTrace, Felt, HASH_CYCLE_LEN, - LAST_CYCLE_ROW, ONE, Operation, Word, ZERO, build_trace_from_ops, rand_array, + ONE, Operation, Word, ZERO, build_trace_from_ops, rand_array, }; /// Tests the generation of the `b_chip` bus column when only memory lookups are included. It @@ -29,7 +29,6 @@ use super::{ /// for this test we set those values explicitly, enforcing only that the same initial and final /// values are requested & provided. #[test] -#[expect(clippy::needless_range_loop)] fn b_chip_trace_mem() { const FOUR: Felt = Felt::new(4); @@ -63,9 +62,11 @@ fn b_chip_trace_mem() { // hash chiplet, so the trace should still equal one. assert_eq!(ONE, b_chip[1]); - // The first memory request from the stack is sent when the `MStoreW` operation is executed, at - // cycle 1, so the request is included in the next row. (The trace begins by executing `span`). - let value = build_expected_bus_word_msg( + // At row 1, two things happen simultaneously: + // - The hasher provides the HOUT response (span hash result) at controller output row 1 + // - The stack sends the MStoreW memory write request (user op at cycle 1) + // Extract the HOUT response as a black box. + let mstore_value = build_expected_bus_word_msg( &challenges, MEMORY_WRITE_WORD_LABEL, ZERO, @@ -73,7 +74,9 @@ fn b_chip_trace_mem() { ONE, word.into(), ); - let mut expected = value.inverse(); + // b_chip[2] = ONE * hout_response * mstore_value.inverse() + let hout_response = b_chip[2] * mstore_value; + let mut expected = hout_response * mstore_value.inverse(); assert_eq!(expected, b_chip[2]); // Nothing changes after user operations that don't make requests to the Chiplets. @@ -146,24 +149,24 @@ fn b_chip_trace_mem() { expected *= (value1 * value2).inverse(); assert_eq!(expected, b_chip[14]); - // At cycle 14 the decoder requests the span hash. Capture the multiplicand; the hasher responds - // at the end of its cycle (row HASH_CYCLE_LEN). + // At cycle 14 the decoder requests the span hash result (END). In the controller/perm split, + // the hasher already provided the HOUT response at row 1. The END request should cancel with + // it. We capture the multiplicand as a black box. assert_ne!(expected, b_chip[15]); - let span_request_mult = b_chip[15] * expected.inverse(); + let span_end_mult = b_chip[15] * expected.inverse(); expected = b_chip[15]; - // Nothing changes until the hasher provides the span hash result at the end of the hash cycle. - for row in 16..HASH_CYCLE_LEN { + // Verify the HOUT response and END request cancel. + assert_eq!(hout_response * span_end_mult, ONE); + + // Nothing changes until the memory segment starts. The hasher contributes 32 total rows: + // 16 rows for the padded controller region (2 controller rows + 14 padding) and 16 rows for + // the packed permutation segment. No bitwise ops, so memory starts at row 32. + let memory_start = 2 * HASH_CYCLE_LEN; // controller(16 padded) + perm(16) + for row in 16..memory_start { assert_eq!(expected, b_chip[row]); } - let memory_start = HASH_CYCLE_LEN; - assert_ne!(expected, b_chip[memory_start]); - let span_response_mult = b_chip[memory_start] * b_chip[LAST_CYCLE_ROW].inverse(); - assert_eq!(span_request_mult * span_response_mult, ONE); - expected *= span_response_mult; - assert_eq!(expected, b_chip[memory_start]); - // Memory responses are provided during the memory segment after the hash cycle. There will be 6 // rows, corresponding to the 5 memory operations (MStream requires 2 rows). @@ -260,12 +263,14 @@ fn crypto_stream_missing_chiplets_bus_requests() { // All four requests are emitted at the same cycle, so they multiply together. let combined_request = (read1 * read2 * write1 * write2).inverse(); - // b_chip[0] and b_chip[1] should be ONE (span hash init at cycle 0). + // b_chip[0] should be ONE. At cycle 0, span hash init request and response cancel. assert_eq!(ONE, b_chip[0]); assert_eq!(ONE, b_chip[1]); - // At cycle 1, CryptoStream issues 4 memory requests; included at row 2. - assert_eq!(combined_request, b_chip[2]); + // At row 1, the hasher's HOUT response and the CryptoStream's 4 memory requests all occur. + // Extract the HOUT response as a black box. + let hout_response = b_chip[2] * combined_request.inverse(); + assert_eq!(hout_response * combined_request, b_chip[2]); // The chiplets bus should be balanced: final value must be ONE. assert_eq!(*b_chip.last().unwrap(), ONE); @@ -284,7 +289,10 @@ fn build_expected_bus_element_msg( ) -> Felt { assert!(op_label == MEMORY_READ_ELEMENT_LABEL || op_label == MEMORY_WRITE_ELEMENT_LABEL); - challenges.encode([Felt::from_u8(op_label), ctx, addr, clk, value]) + challenges.encode( + miden_air::trace::bus_types::CHIPLETS_BUS, + [Felt::from_u8(op_label), ctx, addr, clk, value], + ) } fn build_expected_bus_word_msg( @@ -297,7 +305,10 @@ fn build_expected_bus_word_msg( ) -> Felt { assert!(op_label == MEMORY_READ_WORD_LABEL || op_label == MEMORY_WRITE_WORD_LABEL); - challenges.encode([Felt::from_u8(op_label), ctx, addr, clk, word[0], word[1], word[2], word[3]]) + challenges.encode( + miden_air::trace::bus_types::CHIPLETS_BUS, + [Felt::from_u8(op_label), ctx, addr, clk, word[0], word[1], word[2], word[3]], + ) } fn build_expected_bus_msg_from_trace( diff --git a/processor/src/trace/tests/chiplets/mod.rs b/processor/src/trace/tests/chiplets/mod.rs index 39abd71328..4f29a1f165 100644 --- a/processor/src/trace/tests/chiplets/mod.rs +++ b/processor/src/trace/tests/chiplets/mod.rs @@ -1,14 +1,12 @@ use miden_air::trace::{ - AUX_TRACE_RAND_CHALLENGES, CHIPLETS_BUS_AUX_TRACE_OFFSET, - chiplets::hasher::{HASH_CYCLE_LEN, LAST_CYCLE_ROW}, + AUX_TRACE_RAND_CHALLENGES, CHIPLETS_BUS_AUX_TRACE_OFFSET, chiplets::hasher::HASH_CYCLE_LEN, }; use miden_core::{ONE, Word, ZERO, operations::Operation}; use miden_utils_testing::rand::rand_value; use super::{ super::utils::build_span_with_respan_ops, AdviceInputs, ExecutionTrace, Felt, - build_trace_from_ops, build_trace_from_ops_with_inputs, build_trace_from_program, - init_state_from_words, rand_array, + build_trace_from_ops, build_trace_from_ops_with_inputs, build_trace_from_program, rand_array, }; mod bitwise; diff --git a/processor/src/trace/tests/decoder.rs b/processor/src/trace/tests/decoder.rs index ab6276adfb..cecb30b1a2 100644 --- a/processor/src/trace/tests/decoder.rs +++ b/processor/src/trace/tests/decoder.rs @@ -2,7 +2,7 @@ use alloc::vec::Vec; use miden_air::trace::{ AUX_TRACE_RAND_CHALLENGES, Challenges, - chiplets::hasher::HASH_CYCLE_LEN_FELT, + chiplets::hasher::CONTROLLER_ROWS_PER_PERM_FELT, decoder::{P1_COL_IDX, P2_COL_IDX, P3_COL_IDX}, }; use miden_utils_testing::rand::rand_array; @@ -26,7 +26,6 @@ use crate::{ // ================================================================================================ #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p1_span_with_respan() { let (ops, _) = build_span_with_respan_ops(); let trace = build_trace_from_ops(ops, &[]); @@ -37,7 +36,8 @@ fn decoder_p1_span_with_respan() { let challenges = Challenges::::new(challenges[0], challenges[1]); let row_values = [ BlockStackTableRow::new(ONE, ZERO, false).to_value(&challenges), - BlockStackTableRow::new(ONE + HASH_CYCLE_LEN_FELT, ZERO, false).to_value(&challenges), + BlockStackTableRow::new(ONE + CONTROLLER_ROWS_PER_PERM_FELT, ZERO, false) + .to_value(&challenges), ]; // make sure the first entry is ONE @@ -70,7 +70,6 @@ fn decoder_p1_span_with_respan() { } #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p1_join() { let program = { let mut mast_forest = MastForest::new(); @@ -95,12 +94,12 @@ fn decoder_p1_join() { let p1 = aux_columns.get_column(P1_COL_IDX); let challenges = Challenges::::new(challenges[0], challenges[1]); - let a_33 = ONE + HASH_CYCLE_LEN_FELT; - let a_65 = a_33 + HASH_CYCLE_LEN_FELT; + let a_3 = ONE + CONTROLLER_ROWS_PER_PERM_FELT; + let a_5 = a_3 + CONTROLLER_ROWS_PER_PERM_FELT; let row_values = [ BlockStackTableRow::new(ONE, ZERO, false).to_value(&challenges), - BlockStackTableRow::new(a_33, ONE, false).to_value(&challenges), - BlockStackTableRow::new(a_65, ONE, false).to_value(&challenges), + BlockStackTableRow::new(a_3, ONE, false).to_value(&challenges), + BlockStackTableRow::new(a_5, ONE, false).to_value(&challenges), ]; // make sure the first entry is ONE @@ -144,7 +143,6 @@ fn decoder_p1_join() { } #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p1_split() { let program = { let mut mast_forest = MastForest::new(); @@ -169,10 +167,10 @@ fn decoder_p1_split() { let p1 = aux_columns.get_column(P1_COL_IDX); let challenges = Challenges::::new(challenges[0], challenges[1]); - let a_33 = ONE + HASH_CYCLE_LEN_FELT; + let a_3 = ONE + CONTROLLER_ROWS_PER_PERM_FELT; let row_values = [ BlockStackTableRow::new(ONE, ZERO, false).to_value(&challenges), - BlockStackTableRow::new(a_33, ONE, false).to_value(&challenges), + BlockStackTableRow::new(a_3, ONE, false).to_value(&challenges), ]; // make sure the first entry is ONE @@ -205,7 +203,6 @@ fn decoder_p1_split() { } #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p1_loop_with_repeat() { let program = { let mut mast_forest = MastForest::new(); @@ -235,20 +232,20 @@ fn decoder_p1_loop_with_repeat() { let challenges = Challenges::::new(challenges[0], challenges[1]); // The loop node consumes the first hasher cycle; join/span addresses follow sequentially. - let a_33 = ONE + HASH_CYCLE_LEN_FELT; // address of the JOIN block in the first iteration - let a_65 = a_33 + HASH_CYCLE_LEN_FELT; // address of the first SPAN block in the first iteration - let a_97 = a_65 + HASH_CYCLE_LEN_FELT; // address of the second SPAN block in the first iteration - let a_129 = a_97 + HASH_CYCLE_LEN_FELT; // address of the JOIN block in the second iteration - let a_161 = a_129 + HASH_CYCLE_LEN_FELT; // address of the first SPAN block in the second iteration - let a_193 = a_161 + HASH_CYCLE_LEN_FELT; // address of the second SPAN block in the second iteration + let a_3 = ONE + CONTROLLER_ROWS_PER_PERM_FELT; // address of the JOIN block in the first iteration + let a_5 = a_3 + CONTROLLER_ROWS_PER_PERM_FELT; // address of the first SPAN block in the first iteration + let a_7 = a_5 + CONTROLLER_ROWS_PER_PERM_FELT; // address of the second SPAN block in the first iteration + let a_9 = a_7 + CONTROLLER_ROWS_PER_PERM_FELT; // address of the JOIN block in the second iteration + let a_11 = a_9 + CONTROLLER_ROWS_PER_PERM_FELT; // address of the first SPAN block in the second iteration + let a_13 = a_11 + CONTROLLER_ROWS_PER_PERM_FELT; // address of the second SPAN block in the second iteration let row_values = [ BlockStackTableRow::new(ONE, ZERO, true).to_value(&challenges), - BlockStackTableRow::new(a_33, ONE, false).to_value(&challenges), - BlockStackTableRow::new(a_65, a_33, false).to_value(&challenges), - BlockStackTableRow::new(a_97, a_33, false).to_value(&challenges), - BlockStackTableRow::new(a_129, ONE, false).to_value(&challenges), - BlockStackTableRow::new(a_161, a_129, false).to_value(&challenges), - BlockStackTableRow::new(a_193, a_129, false).to_value(&challenges), + BlockStackTableRow::new(a_3, ONE, false).to_value(&challenges), + BlockStackTableRow::new(a_5, a_3, false).to_value(&challenges), + BlockStackTableRow::new(a_7, a_3, false).to_value(&challenges), + BlockStackTableRow::new(a_9, ONE, false).to_value(&challenges), + BlockStackTableRow::new(a_11, a_9, false).to_value(&challenges), + BlockStackTableRow::new(a_13, a_9, false).to_value(&challenges), ]; // make sure the first entry is ONE @@ -340,7 +337,6 @@ fn decoder_p1_loop_with_repeat() { // ================================================================================================ #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p2_span_with_respan() { let program = { let mut mast_forest = MastForest::new(); @@ -379,7 +375,6 @@ fn decoder_p2_span_with_respan() { } #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p2_join() { let mut mast_forest = MastForest::new(); @@ -448,7 +443,6 @@ fn decoder_p2_join() { } #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p2_split_true() { // build program let mut mast_forest = MastForest::new(); @@ -507,7 +501,6 @@ fn decoder_p2_split_true() { } #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p2_split_false() { // build program let mut mast_forest = MastForest::new(); @@ -567,7 +560,6 @@ fn decoder_p2_split_false() { } #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p2_loop_with_repeat() { // build program let mut mast_forest = MastForest::new(); @@ -601,19 +593,19 @@ fn decoder_p2_loop_with_repeat() { let challenges = Challenges::::new(challenges[0], challenges[1]); // The loop node consumes the first hasher cycle; join/span addresses follow sequentially. - let a_33 = ONE + HASH_CYCLE_LEN_FELT; // address of the JOIN block in the first iteration - let a_129 = a_33 + HASH_CYCLE_LEN_FELT * Felt::new(3); // address of the JOIN block in the second iteration + let a_3 = ONE + CONTROLLER_ROWS_PER_PERM_FELT; // address of the JOIN block in the first iteration + let a_9 = a_3 + CONTROLLER_ROWS_PER_PERM_FELT * Felt::new(3); // address of the JOIN block in the second iteration let program_hash_msg = BlockHashTableRow::new_test(ZERO, program.hash(), false, false).collapse(&challenges); let loop_body_msg = BlockHashTableRow::new_test(ONE, join.digest(), false, true).collapse(&challenges); - let child1_iter1 = BlockHashTableRow::new_test(a_33, basic_block_1.digest(), true, false) + let child1_iter1 = + BlockHashTableRow::new_test(a_3, basic_block_1.digest(), true, false).collapse(&challenges); + let child2_iter1 = BlockHashTableRow::new_test(a_3, basic_block_2.digest(), false, false) .collapse(&challenges); - let child2_iter1 = BlockHashTableRow::new_test(a_33, basic_block_2.digest(), false, false) - .collapse(&challenges); - let child1_iter2 = BlockHashTableRow::new_test(a_129, basic_block_1.digest(), true, false) - .collapse(&challenges); - let child2_iter2 = BlockHashTableRow::new_test(a_129, basic_block_2.digest(), false, false) + let child1_iter2 = + BlockHashTableRow::new_test(a_9, basic_block_1.digest(), true, false).collapse(&challenges); + let child2_iter2 = BlockHashTableRow::new_test(a_9, basic_block_2.digest(), false, false) .collapse(&challenges); // p2 starts at identity (1) @@ -711,7 +703,6 @@ fn decoder_p3_trace_empty_table() { } #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p3_trace_one_batch() { let stack = [1, 2, 3, 4, 5, 6, 7, 8]; let ops = vec![ @@ -779,7 +770,6 @@ fn decoder_p3_trace_one_batch() { } #[test] -#[expect(clippy::needless_range_loop)] fn decoder_p3_trace_two_batches() { let (ops, iv) = build_span_with_respan_ops(); let trace = build_trace_from_ops(ops, &[]); @@ -821,7 +811,7 @@ fn decoder_p3_trace_two_batches() { // --- second batch --------------------------------------------------------------------------- // make sure entries for 3 group are inserted at clock cycle 10 (when RESPAN is executed) // group 3 consists of two DROP operations which do not fit into group 0 - let batch1_addr = ONE + HASH_CYCLE_LEN_FELT; + let batch1_addr = ONE + CONTROLLER_ROWS_PER_PERM_FELT; let op_group3 = build_op_group(&[Operation::Drop; 2]); let b1_values = [ OpGroupTableRow::new(batch1_addr, Felt::new(3), iv[7]).to_value(&challenges), @@ -893,7 +883,7 @@ impl BlockStackTableRow { /// at least 12 coefficients. pub fn to_value>(&self, challenges: &Challenges) -> E { let is_loop = if self.is_loop { ONE } else { ZERO }; - challenges.alpha + challenges.bus_prefix[miden_air::trace::bus_types::BLOCK_STACK_TABLE] + challenges.beta_powers[0] * self.block_id + challenges.beta_powers[1] * self.parent_id + challenges.beta_powers[2] * is_loop @@ -928,7 +918,7 @@ impl OpGroupTableRow { /// Reduces this row to a single field element in the field specified by E. This requires /// at least 4 coefficients. pub fn to_value>(&self, challenges: &Challenges) -> E { - challenges.alpha + challenges.bus_prefix[miden_air::trace::bus_types::OP_GROUP_TABLE] + challenges.beta_powers[0] * self.batch_id + challenges.beta_powers[1] * self.group_pos + challenges.beta_powers[2] * self.group_value diff --git a/processor/src/trace/tests/hasher.rs b/processor/src/trace/tests/hasher.rs index 804493d557..cd0ea2cc53 100644 --- a/processor/src/trace/tests/hasher.rs +++ b/processor/src/trace/tests/hasher.rs @@ -1,8 +1,7 @@ use alloc::vec::Vec; use miden_air::trace::{ - AUX_TRACE_RAND_CHALLENGES, Challenges, MainTrace, - chiplets::hasher::{HASH_CYCLE_LEN, P1_COL_IDX}, + AUX_TRACE_RAND_CHALLENGES, Challenges, MainTrace, bus_types, chiplets::hasher::P1_COL_IDX, }; use miden_core::{ ONE, Word, ZERO, @@ -76,11 +75,14 @@ fn hasher_p1_mr_update(#[case] index: u64) { let p1 = aux_columns.get_column(P1_COL_IDX); let challenges = Challenges::::new(challenges[0], challenges[1]); + // mrupdate_id = 1 for the first (and only) MR_UPDATE operation. + let mrupdate_id = ONE; let row_values = [ - SiblingTableRow::new(Felt::new(index), path[0]).to_value(&trace.main_trace, &challenges), - SiblingTableRow::new(Felt::new(index >> 1), path[1]) + SiblingTableRow::new(Felt::new(index), path[0], mrupdate_id) .to_value(&trace.main_trace, &challenges), - SiblingTableRow::new(Felt::new(index >> 2), path[2]) + SiblingTableRow::new(Felt::new(index >> 1), path[1], mrupdate_id) + .to_value(&trace.main_trace, &challenges), + SiblingTableRow::new(Felt::new(index >> 2), path[2], mrupdate_id) .to_value(&trace.main_trace, &challenges), ]; @@ -89,38 +91,43 @@ fn hasher_p1_mr_update(#[case] index: u64) { assert_eq!(expected_value, p1[0]); // The running product does not change while the hasher computes the hash of the SPAN block. - let row_add_1 = HASH_CYCLE_LEN + 1; + // In the controller/perm split, the span uses 2 controller rows (0-1). The MR_UPDATE starts + // at controller row 2. Each Merkle level is a 2-row controller pair. + // + // MV leg (old path, depth 3): input rows at 2, 4, 6. Siblings added at rows 3, 5, 7. + // MU leg (new path, depth 3): input rows at 8, 10, 12. Siblings removed at rows 9, 11, 13. + let row_add_1 = 3; for value in p1.iter().take(row_add_1).skip(1) { assert_eq!(expected_value, *value); } - // When computation of the "old Merkle root" is started, the first sibling is added to the - // table in the following row. + // First sibling is added (MV level 0). expected_value *= row_values[0]; assert_eq!(expected_value, p1[row_add_1]); // The value remains the same until the next sibling is added. - let row_add_2 = 2 * HASH_CYCLE_LEN; + let row_add_2 = 5; for value in p1.iter().take(row_add_2).skip(row_add_1 + 1) { assert_eq!(expected_value, *value); } - // Next sibling is added. + // Second sibling is added (MV level 1). expected_value *= row_values[1]; assert_eq!(expected_value, p1[row_add_2]); // The value remains the same until the last sibling is added. - let row_add_3 = 3 * HASH_CYCLE_LEN; + let row_add_3 = 7; for value in p1.iter().take(row_add_3).skip(row_add_2 + 1) { assert_eq!(expected_value, *value); } - // Last sibling is added. + // Last sibling is added (MV level 2). expected_value *= row_values[2]; assert_eq!(expected_value, p1[row_add_3]); // The value remains the same until computation of the "new Merkle root" is started. - let row_remove_1 = 4 * HASH_CYCLE_LEN + 1; + // MU leg starts at controller row 8, first sibling removed at row 9. + let row_remove_1 = 9; for value in p1.iter().take(row_remove_1).skip(row_add_3 + 1) { assert_eq!(expected_value, *value); } @@ -129,23 +136,23 @@ fn hasher_p1_mr_update(#[case] index: u64) { expected_value *= row_values[0].inverse(); assert_eq!(expected_value, p1[row_remove_1]); - // The value remains the same until the next sibling is removed. - let row_remove_2 = 5 * HASH_CYCLE_LEN; + // The value remains the same until the next sibling is removed (MU level 1, row 11). + let row_remove_2 = 11; for value in p1.iter().take(row_remove_2).skip(row_remove_1 + 1) { assert_eq!(expected_value, *value); } - // Next sibling is removed. + // Second sibling is removed (MU level 1). expected_value *= row_values[1].inverse(); assert_eq!(expected_value, p1[row_remove_2]); - // The value remains the same until the last sibling is removed. - let row_remove_3 = 6 * HASH_CYCLE_LEN; + // The value remains the same until the last sibling is removed (MU level 2, row 13). + let row_remove_3 = 13; for value in p1.iter().take(row_remove_3).skip(row_remove_2 + 1) { assert_eq!(expected_value, *value); } - // Last sibling is removed. + // Last sibling is removed (MU level 2). expected_value *= row_values[2].inverse(); assert_eq!(expected_value, p1[row_remove_3]); @@ -185,34 +192,42 @@ fn append_word(target: &mut Vec, word: Word) { pub struct SiblingTableRow { index: Felt, sibling: Word, + mrupdate_id: Felt, } impl SiblingTableRow { - pub fn new(index: Felt, sibling: Word) -> Self { - Self { index, sibling } + pub fn new(index: Felt, sibling: Word, mrupdate_id: Felt) -> Self { + Self { index, sibling, mrupdate_id } } - /// Reduces this row to a single field element in the field specified by E. This requires - /// at least 12 coefficients. + /// Reduces this row to a single field element in the field specified by E. + /// + /// The encoding includes: + /// - `mrupdate_id` at position 1: prevents cross-operation sibling reuse by binding each + /// sibling table entry to a specific MRUPDATE operation. Without this, a prover could swap + /// siblings between the old path of one update and the new path of another. + /// - `node_index` at position 2: the Merkle tree index at this path level. + /// - sibling word at positions 3-6 or 7-10: which rate half holds the sibling depends on the + /// direction bit (LSB of node_index). pub fn to_value>( &self, _main_trace: &MainTrace, challenges: &Challenges, ) -> E { - // when the least significant bit of the index is 0, the sibling will be in the 3rd word - // of the hasher state, and when the least significant bit is 1, it will be in the 2nd - // word. we compute the value in this way to make constraint evaluation a bit easier since - // we need to compute the 2nd and the 3rd word values for other purposes as well. let lsb = self.index.as_canonical_u64() & 1; if lsb == 0 { - challenges.alpha + // Sibling at rate1 (positions 7-10) + challenges.bus_prefix[bus_types::SIBLING_TABLE] + + challenges.beta_powers[1] * self.mrupdate_id + challenges.beta_powers[2] * self.index + challenges.beta_powers[7] * self.sibling[0] + challenges.beta_powers[8] * self.sibling[1] + challenges.beta_powers[9] * self.sibling[2] + challenges.beta_powers[10] * self.sibling[3] } else { - challenges.alpha + // Sibling at rate0 (positions 3-6) + challenges.bus_prefix[bus_types::SIBLING_TABLE] + + challenges.beta_powers[1] * self.mrupdate_id + challenges.beta_powers[2] * self.index + challenges.beta_powers[3] * self.sibling[0] + challenges.beta_powers[4] * self.sibling[1] diff --git a/processor/src/trace/tests/mod.rs b/processor/src/trace/tests/mod.rs index cf20b974d9..e43a148276 100644 --- a/processor/src/trace/tests/mod.rs +++ b/processor/src/trace/tests/mod.rs @@ -9,8 +9,7 @@ use miden_utils_testing::rand::rand_array; use super::{ExecutionTrace, Felt}; use crate::{ - AdviceInputs, DefaultHost, ExecutionOptions, FastProcessor, StackInputs, - trace::{build_trace, chiplets::init_state_from_words}, + AdviceInputs, DefaultHost, ExecutionOptions, FastProcessor, StackInputs, trace::build_trace, }; mod chiplets; @@ -38,10 +37,8 @@ pub fn build_trace_from_program(program: &Program, stack_inputs: &[u64]) -> Exec .with_core_trace_fragment_size(TEST_TRACE_FRAGMENT_SIZE) .unwrap(), ); - let (execution_output, trace_generation_context) = - processor.execute_for_trace_sync(program, &mut host).unwrap(); - - build_trace(execution_output, trace_generation_context, program.to_info()).unwrap() + let trace_inputs = processor.execute_trace_inputs_sync(program, &mut host).unwrap(); + build_trace(trace_inputs).unwrap() } /// Builds a sample trace by executing a span block containing the specified operations. This @@ -82,8 +79,6 @@ pub fn build_trace_from_ops_with_inputs( .with_core_trace_fragment_size(TEST_TRACE_FRAGMENT_SIZE) .unwrap(), ); - let (execution_output, trace_generation_context) = - processor.execute_for_trace_sync(&program, &mut host).unwrap(); - - build_trace(execution_output, trace_generation_context, program.to_info()).unwrap() + let trace_inputs = processor.execute_trace_inputs_sync(&program, &mut host).unwrap(); + build_trace(trace_inputs).unwrap() } diff --git a/processor/src/trace/tests/range.rs b/processor/src/trace/tests/range.rs index a73c4442c8..80f830de12 100644 --- a/processor/src/trace/tests/range.rs +++ b/processor/src/trace/tests/range.rs @@ -1,8 +1,9 @@ use miden_air::trace::{ - AUX_TRACE_RAND_CHALLENGES, chiplets::hasher::HASH_CYCLE_LEN, range::B_RANGE_COL_IDX, + ACE_CHIPLET_WIRING_BUS_OFFSET, AUX_TRACE_RAND_CHALLENGES, Challenges, bus_types, + chiplets::hasher::HASH_CYCLE_LEN, range::B_RANGE_COL_IDX, }; use miden_core::{ONE, ZERO, field::Field, operations::Operation}; -use miden_utils_testing::rand::rand_array; +use miden_utils_testing::{rand::rand_array, stack}; use super::{Felt, build_trace_from_ops}; @@ -17,7 +18,8 @@ fn b_range_trace_stack() { let trace = build_trace_from_ops(operations, &stack); let rand_elements = rand_array::(); - let alpha = rand_elements[0]; + let challenges = Challenges::new(rand_elements[0], rand_elements[1]); + let alpha = challenges.bus_prefix[bus_types::RANGE_CHECK_BUS]; let aux_columns = trace.build_aux_trace(&rand_elements).unwrap(); let b_range = aux_columns.get_column(B_RANGE_COL_IDX); @@ -33,7 +35,7 @@ fn b_range_trace_stack() { // at cycle 1. (The trace begins by executing `span`). It must be subtracted out of `b_range`. // The range-checked values are 0, 256, 0, 0, so the values to subtract are 3/(alpha + 0) and // 1/(alpha + 256). - let lookups = alpha.inverse() * Felt::new(3) + (alpha + Felt::new(256)).inverse(); + let lookups = alpha.inverse() * Felt::from_u8(3) + (alpha + Felt::from_u16(256)).inverse(); let mut expected = b_range[1] - lookups; assert_eq!(expected, b_range[2]); @@ -49,14 +51,14 @@ fn b_range_trace_stack() { // After the padded rows, the first value will be unchanged. assert_eq!(expected, b_range[values_start]); // We include 3 lookups of 0. - expected += alpha.inverse() * Felt::new(3); + expected += alpha.inverse() * Felt::from_u8(3); assert_eq!(expected, b_range[values_start + 1]); // Then we have 3 bridge rows between 0 and 255 where the value does not change assert_eq!(expected, b_range[values_start + 2]); assert_eq!(expected, b_range[values_start + 3]); assert_eq!(expected, b_range[values_start + 4]); // Then we include 1 lookup of 256, so it should be multiplied by alpha + 256. - expected += (alpha + Felt::new(256)).inverse(); + expected += (alpha + Felt::from_u16(256)).inverse(); assert_eq!(expected, b_range[values_start + 5]); // --- Check the last value of the b_range column is zero -------------------------------------- @@ -65,15 +67,43 @@ fn b_range_trace_stack() { assert_eq!(ZERO, b_range[last_row]); } -/// This test checks that range check lookups from memory operations are balanced by the -/// range checks processed in the Range Checker. +/// Tests that range check lookups from memory operations are balanced across `b_range` and +/// `v_wiring`. /// -/// The `StoreW` memory operation results in 2 16-bit range checks of 1, 0. -/// The `LoadW` memory operation results in 2 16-bit range checks of 5, 0. +/// ## Background +/// +/// Each memory access produces two kinds of 16-bit range checks: +/// +/// 1. **Delta checks** (`d0`, `d1`): the difference between consecutive memory rows is decomposed +/// into two 16-bit limbs. These are subtracted from `b_range` at the memory row and added back +/// by the range checker table. +/// +/// 2. **Address decomposition checks** (`w0`, `w1`, `4*w1`): the word-aligned address is decomposed +/// as `word_index = word_addr / 4`, then `w0 = word_index & 0xFFFF` and `w1 = word_index >> 16`. +/// The three values `w0`, `w1`, `4*w1` are subtracted from the **wiring bus** (`v_wiring`) at +/// the memory row, and added back by the range checker table into `b_range`. +/// +/// Because the address range checks are subtracted on `v_wiring` but their multiplicities are +/// added to `b_range`, neither column balances to zero on its own. The verifier checks the +/// combined identity: `b_range[last] + v_wiring[last] = 0`. +/// +/// ## Test setup +/// +/// We use `addr = 262148 = 4 * 65537` to ensure non-trivial address decomposition: +/// - `word_index = 65537 = 0x10001` +/// - `w0 = 1`, `w1 = 1`, `4*w1 = 4` +/// +/// Two memory operations (MStoreW + MLoadW) at the same address produce 2 memory rows, +/// each contributing delta checks to `b_range` and address checks to `v_wiring`. #[test] -#[expect(clippy::needless_range_loop)] fn b_range_trace_mem() { - let stack = [0, 1, 2, 3, 4, 0]; + // ===================================================================== + // 1. BUILD THE TRACE + // ===================================================================== + + let addr: u64 = 262148; + let stack_input = stack![addr, 1, 2, 3, 4, addr]; + let mut operations = vec![ Operation::MStoreW, Operation::Drop, @@ -82,67 +112,126 @@ fn b_range_trace_mem() { Operation::Drop, Operation::MLoadW, ]; - // Pad so that the memory chiplet and range checker sections don't overlap, - // in order to simplify the logic of the test. + // Pad with Noops so that the memory chiplet and range checker table sections don't overlap + // in the trace, making it easier to reason about which rows contribute to which column. operations.resize(operations.len() + 60, Operation::Noop); - let trace = build_trace_from_ops(operations, &stack); + let trace = build_trace_from_ops(operations, &stack_input); let rand_elements = rand_array::(); - let alpha = rand_elements[0]; + let challenges = Challenges::new(rand_elements[0], rand_elements[1]); + let alpha = challenges.bus_prefix[bus_types::RANGE_CHECK_BUS]; let aux_columns = trace.build_aux_trace(&rand_elements).unwrap(); let b_range = aux_columns.get_column(B_RANGE_COL_IDX); + let v_wiring = aux_columns.get_column(ACE_CHIPLET_WIRING_BUS_OFFSET); assert_eq!(trace.length(), b_range.len()); - // The memory section of the chiplets trace starts after the span hash. - let memory_start = HASH_CYCLE_LEN; - - // 40 rows are needed for 0, 3, 4, ... 36 bridge additional bridge rows of powers of - // 3 ..., 65535. (0 and 4 are both range-checked. 65535 is the max, and the rest are "bridge" - // values.) An extra row is added to pad the u16::MAX value. - let len_16bit = 40 + 1; - let values_start = trace.length() - len_16bit; - - // The value should start at ZERO. - let mut expected = ZERO; - assert_eq!(expected, b_range[0]); - - // --- Check the memory processor's range check lookups. -------------------------------------- - - // There are two memory lookups. For each memory lookup, the context and address are unchanged, - // so the delta values indicated the clock cycle change clk' - clk. - // StoreW is executed at cycle 1 (after the initial span), so clk' - clk = 1. - let (d0_store, d1_store) = (ONE, ZERO); - // LoadW is executed at cycle 6, so i' - i = 6 - 1 = 5. - let (d0_load, d1_load) = (Felt::new(5), ZERO); - - // Include the lookups from the `MStoreW` operation at the next row. - expected -= (alpha + d0_store).inverse() + (alpha + d1_store).inverse(); - assert_eq!(expected, b_range[memory_start + 1]); - // Include the lookup from the `MLoadW` operation at the next row. - expected -= (alpha + d0_load).inverse() + (alpha + d1_load).inverse(); - assert_eq!(expected, b_range[memory_start + 2]); - - // --- Check the range checker's lookups. ----------------------------------------------------- - - // We include 2 lookups of ZERO in the next row. - expected += alpha.inverse() * Felt::new(2); - assert_eq!(expected, b_range[values_start + 1]); - - // We include 1 lookup of ONE in the next row. - expected += (alpha + d0_store).inverse(); - assert_eq!(expected, b_range[values_start + 2]); - - // We have one bridge row between 1 and 5 where the value does not change. - assert_eq!(expected, b_range[values_start + 3]); + // ===================================================================== + // 2. ADDRESS DECOMPOSITION + // ===================================================================== + // + // addr = 262148 is word-aligned (262148 % 4 == 0), so word_addr = 262148. + // word_index = word_addr / 4 = 65537 = 0x10001. + // + // w0 = word_index & 0xFFFF = 0x0001 = 1 + // w1 = word_index >> 16 = 0x0001 = 1 + // 4*w1 = 4 * 1 = 4 + // + // These are the three values whose range checks go through v_wiring. + let w0 = ONE; + let w1 = ONE; + let four_w1 = Felt::from_u8(4); + + // ===================================================================== + // 3. DELTA VALUES + // ===================================================================== + // + // The memory trace has 2 rows (one per memory op), sorted by (ctx, word_addr, clk). + // Both operations access the same (ctx=0, word_addr=262148), so the delta between + // consecutive rows is just the clock cycle difference. + // + // Each delta is decomposed into two 16-bit limbs: d0 (low) and d1 (high). + // + // Memory row 0 (MStoreW, clk=1): + // The memory module initializes the virtual previous row to (same_ctx, same_addr, + // clk - 1), so the first row's delta is always 1 regardless of the actual address. + // delta = 1, d0 = 1, d1 = 0. + let d0_store = ONE; + let d1_store = ZERO; + + // Memory row 1 (MLoadW, clk=6): + // Delta from previous row: clk_load - clk_store = 6 - 1 = 5. + // d0 = 5, d1 = 0. + let d0_load = Felt::from_u8(5); + let d1_load = ZERO; + + // ===================================================================== + // 4. CHECK b_range: DELTA SUBTRACTIONS ON MEMORY ROWS + // ===================================================================== + // + // The hasher trace occupies the first 32 rows in total: + // 16 rows for the padded controller region (2 controller rows + 14 padding) and + // 16 rows for the packed permutation segment. The memory chiplet starts at row 32. + let memory_start = 2 * HASH_CYCLE_LEN; + + // b_range starts at zero and stays zero until the first memory row. + assert_eq!(ZERO, b_range[0]); - // We include 1 lookup of 5 in the next row. - expected += (alpha + d0_load).inverse(); - assert_eq!(expected, b_range[values_start + 4]); + // At memory row 0 (MStoreW): b_range subtracts the two delta LogUp fractions. + // b_range[mem+1] = b_range[mem] - 1/(alpha + d0_store) - 1/(alpha + d1_store) + let store_delta_sub = (alpha + d0_store).inverse() + (alpha + d1_store).inverse(); + let mut expected_b_range = ZERO - store_delta_sub; + assert_eq!(expected_b_range, b_range[memory_start + 1]); + + // At memory row 1 (MLoadW): b_range subtracts two more delta LogUp fractions. + // b_range[mem+2] = b_range[mem+1] - 1/(alpha + d0_load) - 1/(alpha + d1_load) + let load_delta_sub = (alpha + d0_load).inverse() + (alpha + d1_load).inverse(); + expected_b_range -= load_delta_sub; + assert_eq!(expected_b_range, b_range[memory_start + 2]); + + // ===================================================================== + // 5. CHECK END-TO-END BALANCE: b_range + v_wiring = 0 + // ===================================================================== + // + // After the range checker table processes all rows, b_range has added back the + // multiplicities for ALL range-checked values -- including the address decomposition + // values (w0, w1, 4*w1) whose subtractions live on v_wiring, not b_range. - // --- The value should now be ZERO for the rest of the trace. --------------------------------- - assert_eq!(expected, ZERO); - for i in (values_start + 4)..(b_range.len()) { - assert_eq!(ZERO, b_range[i]); - } + let last_row = b_range.len() - 1; + let b_range_final = b_range[last_row]; + let v_wiring_final = v_wiring[last_row]; + + // Both columns should have non-zero residuals individually, since the address range + // check contributions are split across them. + assert_ne!( + b_range_final, ZERO, + "b_range should have a non-zero residual: the range table added w0/w1/4*w1 \ + multiplicities that are not cancelled by delta subtractions" + ); + assert_ne!( + v_wiring_final, ZERO, + "v_wiring should have a non-zero residual: it subtracted w0/w1/4*w1 LogUp \ + fractions that are not added back on v_wiring itself" + ); + + // Verify the wiring bus residual matches the expected value. + // The wiring bus uses bus_prefix[RANGE_CHECK_BUS] for memory address range checks + // (same as b_range) so they balance to zero. + let alpha_w = challenges.bus_prefix[bus_types::RANGE_CHECK_BUS]; + let num_memory_rows = Felt::from_u8(2); + let w0_contribution = (alpha_w + w0).inverse() * num_memory_rows; + let w1_contribution = (alpha_w + w1).inverse() * num_memory_rows; + let four_w1_contribution = (alpha_w + four_w1).inverse() * num_memory_rows; + let expected_wiring_residual = -(w0_contribution + w1_contribution + four_w1_contribution); + assert_eq!( + v_wiring_final, expected_wiring_residual, + "v_wiring residual should equal -(2/(alpha_w+w0) + 2/(alpha_w+w1) + 2/(alpha_w+4*w1))" + ); + + // Verify the end-to-end balance: b_range + v_wiring = 0. + assert_eq!( + b_range_final + v_wiring_final, + ZERO, + "b_range + v_wiring must balance to zero at the last row" + ); } diff --git a/processor/src/trace/tests/stack.rs b/processor/src/trace/tests/stack.rs index 8a0f044cc3..1456b99f08 100644 --- a/processor/src/trace/tests/stack.rs +++ b/processor/src/trace/tests/stack.rs @@ -15,7 +15,6 @@ const TWO: Felt = Felt::new(2); // ================================================================================================ #[test] -#[expect(clippy::needless_range_loop)] fn p1_trace() { let ops = vec![ Operation::U32add, // no shift, clk 1 diff --git a/processor/src/trace/trace_state.rs b/processor/src/trace/trace_state.rs index 9232ac5fc6..1d575ec5d3 100644 --- a/processor/src/trace/trace_state.rs +++ b/processor/src/trace/trace_state.rs @@ -128,18 +128,17 @@ impl DecoderState { /// This function is called when we hit an `END` operation, signaling the end of execution for a /// node. It updates the decoder state to point to the previous node in the block stack (which - /// could be renamed to "node stack"), and returns the address of the node that just ended, - /// along with any flags associated with it. + /// could be renamed to "node stack"), and returns the address of the node that just ended. pub fn replay_node_end( &mut self, block_stack_replay: &mut BlockStackReplay, - ) -> Result<(Felt, NodeFlags), ExecutionError> { + ) -> Result { let node_end_data = block_stack_replay.replay_node_end()?; self.current_addr = node_end_data.prev_addr; self.parent_addr = node_end_data.prev_parent_addr; - Ok((node_end_data.ended_node_addr, node_end_data.flags)) + Ok(node_end_data.ended_node_addr) } } @@ -348,13 +347,11 @@ impl BlockStackReplay { pub fn record_node_end( &mut self, ended_node_addr: Felt, - flags: NodeFlags, prev_addr: Felt, prev_parent_addr: Felt, ) { self.node_end.push_back(NodeEndData { ended_node_addr, - flags, prev_addr, prev_parent_addr, }); @@ -425,16 +422,13 @@ impl NodeFlags { /// The data needed to fully recover the state on an END operation. /// -/// We record `ended_node_addr` and `flags` in order to be able to properly populate the trace -/// row for the node operation. Additionally, we record `prev_addr` and `prev_parent_addr` to -/// allow emulating peeking into the block stack, which is needed when processing REPEAT or RESPAN -/// nodes. +/// We record `ended_node_addr` in order to be able to properly populate the trace row for the +/// node operation. Additionally, we record `prev_addr` and `prev_parent_addr` to allow emulating +/// peeking into the block stack, which is needed when processing REPEAT or RESPAN nodes. #[derive(Debug)] pub struct NodeEndData { /// the address of the node that is ending pub ended_node_addr: Felt, - /// the flags associated with the node that is ending - pub flags: NodeFlags, /// the address of the node sitting on top of the block stack after the END operation (or 0 if /// the block stack is empty) pub prev_addr: Felt, diff --git a/processor/src/trace/utils.rs b/processor/src/trace/utils.rs index 893e003b17..4e66c22881 100644 --- a/processor/src/trace/utils.rs +++ b/processor/src/trace/utils.rs @@ -13,6 +13,31 @@ use crate::{ #[cfg(test)] use crate::{operation::Operation, utils::ToElements}; +// ROW-MAJOR TRACE WRITER +// ================================================================================================ + +/// Row-major flat buffer writer (`write_row` is a single `copy_from_slice`). +#[derive(Debug)] +pub struct RowMajorTraceWriter<'a, E> { + data: &'a mut [E], + width: usize, +} + +impl<'a, E: Copy> RowMajorTraceWriter<'a, E> { + pub fn new(data: &'a mut [E], width: usize) -> Self { + debug_assert_eq!(data.len() % width, 0, "buffer length must be a multiple of width"); + Self { data, width } + } + + /// Writes one row; `values.len()` must equal `width`. + #[inline(always)] + pub fn write_row(&mut self, row: usize, values: &[E]) { + debug_assert_eq!(values.len(), self.width); + let start = row * self.width; + self.data[start..start + self.width].copy_from_slice(values); + } +} + // TRACE FRAGMENT // ================================================================================================ @@ -152,13 +177,13 @@ impl TraceLenSummary { // CHIPLET LENGTHS // ================================================================================================ -/// Contains trace lengths of all chilplets: hash, bitwise, memory and kernel ROM trace -/// lengths. +/// Contains trace lengths of all chiplets: hash, bitwise, memory, ACE, and kernel ROM. #[derive(Default, Clone, Copy, Debug, PartialEq, Eq)] pub struct ChipletsLengths { hash_chiplet_len: usize, bitwise_chiplet_len: usize, memory_chiplet_len: usize, + ace_chiplet_len: usize, kernel_rom_len: usize, } @@ -167,7 +192,8 @@ impl ChipletsLengths { ChipletsLengths { hash_chiplet_len: chiplets.bitwise_start().into(), bitwise_chiplet_len: chiplets.memory_start() - chiplets.bitwise_start(), - memory_chiplet_len: chiplets.kernel_rom_start() - chiplets.memory_start(), + memory_chiplet_len: chiplets.ace_start() - chiplets.memory_start(), + ace_chiplet_len: chiplets.kernel_rom_start() - chiplets.ace_start(), kernel_rom_len: chiplets.padding_start() - chiplets.kernel_rom_start(), } } @@ -176,32 +202,39 @@ impl ChipletsLengths { hash_len: usize, bitwise_len: usize, memory_len: usize, + ace_len: usize, kernel_len: usize, ) -> Self { ChipletsLengths { hash_chiplet_len: hash_len, bitwise_chiplet_len: bitwise_len, memory_chiplet_len: memory_len, + ace_chiplet_len: ace_len, kernel_rom_len: kernel_len, } } - /// Returns the length of the hash chiplet trace + /// Returns the length of the hash chiplet trace. pub fn hash_chiplet_len(&self) -> usize { self.hash_chiplet_len } - /// Returns the length of the bitwise trace + /// Returns the length of the bitwise trace. pub fn bitwise_chiplet_len(&self) -> usize { self.bitwise_chiplet_len } - /// Returns the length of the memory trace + /// Returns the length of the memory trace. pub fn memory_chiplet_len(&self) -> usize { self.memory_chiplet_len } - /// Returns the length of the kernel ROM trace + /// Returns the length of the ACE chiplet trace. + pub fn ace_chiplet_len(&self) -> usize { + self.ace_chiplet_len + } + + /// Returns the length of the kernel ROM trace. pub fn kernel_rom_len(&self) -> usize { self.kernel_rom_len } @@ -213,6 +246,7 @@ impl ChipletsLengths { self.hash_chiplet_len() + self.bitwise_chiplet_len() + self.memory_chiplet_len() + + self.ace_chiplet_len() + self.kernel_rom_len() + 1 } diff --git a/processor/src/tracer.rs b/processor/src/tracer.rs index 328553e66b..b9e3676042 100644 --- a/processor/src/tracer.rs +++ b/processor/src/tracer.rs @@ -20,9 +20,9 @@ use crate::{ /// A trait for tracing the execution of a processor. /// /// Allows for recording different aspects of the processor's execution. For example, the -/// [`crate::FastProcessor::execute_for_trace`] execution mode needs to build a -/// [`crate::fast::execution_tracer::TraceGenerationContext`] which records information necessary to -/// build the trace at each clock cycle. +/// [`crate::FastProcessor::execute_trace_inputs`] execution mode needs to build a +/// [`crate::TraceGenerationContext`] which records information necessary to build the trace at each +/// clock cycle. /// /// A useful mental model to differentiate between the processor and the tracer is: /// - Processor: maintains and mutates the state of the VM components (system, stack, memory, etc) @@ -66,7 +66,7 @@ pub trait Tracer { /// the current clock cycle. /// /// `continuation` represents what is to be executed at the beginning of this clock cycle, while - /// `continuation_stack` represents whatever comes after execution `continuation`. + /// `continuation_stack` represents whatever comes after executing `continuation`. /// /// The following continuations do not occur at the start of a clock cycle, and hence will never /// be passed to this method: diff --git a/processor/tests/async_compat.rs b/processor/tests/async_compat.rs new file mode 100644 index 0000000000..3981078c2e --- /dev/null +++ b/processor/tests/async_compat.rs @@ -0,0 +1,138 @@ +use std::sync::Arc; + +use miden_assembly::Assembler; +use miden_debug_types::{Location, SourceFile, SourceSpan}; +use miden_processor::{ + BaseHost, DefaultHost, ExecutionOptions, FastProcessor, Felt, FutureMaybeSend, Host, + ProcessorState, StackInputs, Word, + advice::{AdviceInputs, AdviceMutation}, + event::{EventError, EventName}, + mast::MastForest, +}; + +struct YieldingAsyncHost { + event_calls: usize, +} + +impl YieldingAsyncHost { + fn new() -> Self { + Self { event_calls: 0 } + } +} + +impl BaseHost for YieldingAsyncHost { + fn get_label_and_source_file( + &self, + _location: &Location, + ) -> (SourceSpan, Option>) { + (SourceSpan::UNKNOWN, None) + } +} + +impl Host for YieldingAsyncHost { + fn get_mast_forest( + &self, + _node_digest: &Word, + ) -> impl FutureMaybeSend>> { + async { None } + } + + fn on_event( + &mut self, + _process: &ProcessorState<'_>, + ) -> impl FutureMaybeSend, EventError>> { + self.event_calls += 1; + async { + tokio::task::yield_now().await; + Ok(Vec::new()) + } + } +} + +fn simple_program() -> miden_processor::Program { + Assembler::default() + .assemble_program( + r#" + begin + push.2 + add + end + "#, + ) + .expect("program should compile") +} + +#[tokio::test(flavor = "current_thread")] +async fn execute_async_matches_execute() { + let program = simple_program(); + let stack_inputs = StackInputs::new(&[Felt::new(3)]).unwrap(); + let advice_inputs = AdviceInputs::default(); + + let mut sync_host = DefaultHost::default(); + let sync_output = miden_processor::execute_sync( + &program, + stack_inputs, + advice_inputs.clone(), + &mut sync_host, + ExecutionOptions::default(), + ) + .unwrap(); + + let mut async_host = DefaultHost::default(); + let async_output = miden_processor::execute( + &program, + stack_inputs, + advice_inputs, + &mut async_host, + ExecutionOptions::default(), + ) + .await + .unwrap(); + + assert_eq!(sync_output.stack, async_output.stack); +} + +#[tokio::test(flavor = "current_thread")] +async fn fast_processor_execute_for_trace_async_matches_sync() { + let program = simple_program(); + let stack_inputs = StackInputs::new(&[Felt::new(3)]).unwrap(); + + let mut sync_host = DefaultHost::default(); + let sync_trace_inputs = FastProcessor::new(stack_inputs) + .execute_trace_inputs_sync(&program, &mut sync_host) + .unwrap(); + + let mut async_host = DefaultHost::default(); + let async_trace_inputs = FastProcessor::new(stack_inputs) + .execute_trace_inputs(&program, &mut async_host) + .await + .unwrap(); + + assert_eq!(sync_trace_inputs.stack_outputs(), async_trace_inputs.stack_outputs()); + assert_eq!( + sync_trace_inputs.trace_generation_context().fragment_size, + async_trace_inputs.trace_generation_context().fragment_size + ); + assert_eq!( + sync_trace_inputs.trace_generation_context().core_trace_contexts.len(), + async_trace_inputs.trace_generation_context().core_trace_contexts.len() + ); +} + +#[tokio::test(flavor = "current_thread")] +async fn execute_async_supports_async_only_host_events() { + let event_name = EventName::new("test::async::emit"); + let event_id = event_name.to_event_id().as_u64(); + let program = Assembler::default() + .assemble_program(format!("begin push.{event_id} emit drop end")) + .expect("program should compile"); + + let mut host = YieldingAsyncHost::new(); + let output = FastProcessor::new(StackInputs::default()) + .execute(&program, &mut host) + .await + .expect("async execution should succeed"); + + assert_eq!(host.event_calls, 1); + assert_eq!(output.stack.get_num_elements(16).len(), 16); +} diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 365f58dfd9..2deafde845 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -15,7 +15,7 @@ edition.workspace = true [features] default = ["std"] -concurrent = ["std", "miden-crypto/concurrent", "miden-processor/concurrent"] +concurrent = ["std", "miden-air/concurrent", "miden-crypto/concurrent", "miden-processor/concurrent"] std = ["miden-air/std", "miden-debug-types/std", "miden-processor/std"] [dependencies] @@ -32,11 +32,6 @@ serde.workspace = true thiserror.workspace = true tracing.workspace = true -# Platform-specific tokio dependencies -# On non-wasm targets, enable rt-multi-thread for better performance -[target.'cfg(not(target_family = "wasm"))'.dependencies] -tokio = { workspace = true, features = ["rt", "rt-multi-thread"] } - -# On wasm32, only basic tokio features are supported -[target.'cfg(target_family = "wasm")'.dependencies] -tokio = { workspace = true, features = ["rt", "macros"] } +[dev-dependencies] +miden-assembly.workspace = true +tokio = { workspace = true, features = ["macros", "rt"] } diff --git a/prover/src/lib.rs b/prover/src/lib.rs index 4a915c9019..6499f07ac9 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -9,7 +9,7 @@ use alloc::{string::ToString, vec::Vec}; use ::serde::Serialize; use miden_core::{ - Felt, + Felt, WORD_SIZE, field::QuadFelt, utils::{Matrix, RowMajorMatrix}, }; @@ -18,7 +18,7 @@ use miden_crypto::stark::{ }; use miden_processor::{ FastProcessor, Program, - trace::{AuxTraceBuilders, build_trace}, + trace::{AuxTraceBuilders, ExecutionTrace, build_trace}, }; use tracing::instrument; @@ -29,23 +29,43 @@ mod proving_options; pub use miden_air::{DeserializationError, ProcessorAir, PublicInputs, config}; pub use miden_core::proof::{ExecutionProof, HashFunction}; pub use miden_processor::{ - ExecutionError, Host, InputError, StackInputs, StackOutputs, Word, advice::AdviceInputs, - crypto, field, serde, utils, + ExecutionError, ExecutionOptions, ExecutionOutput, FutureMaybeSend, Host, InputError, + ProgramInfo, StackInputs, StackOutputs, SyncHost, TraceBuildInputs, TraceGenerationContext, + Word, advice::AdviceInputs, crypto, field, serde, utils, }; pub use proving_options::ProvingOptions; +/// Inputs required to prove from pre-executed trace data. +#[derive(Debug)] +pub struct TraceProvingInputs { + trace_inputs: TraceBuildInputs, + options: ProvingOptions, +} + +impl TraceProvingInputs { + /// Creates a new bundle of post-execution trace inputs and proof-generation options. + pub fn new(trace_inputs: TraceBuildInputs, options: ProvingOptions) -> Self { + Self { trace_inputs, options } + } + + /// Consumes this bundle and returns its trace inputs and proof-generation options. + pub fn into_parts(self) -> (TraceBuildInputs, ProvingOptions) { + (self.trace_inputs, self.options) + } +} + // PROVER // ================================================================================================ /// Executes and proves the specified `program` and returns the result together with a STARK-based /// proof of the program's execution. /// -/// This is an async function that works on all platforms including wasm32. -/// /// - `stack_inputs` specifies the initial state of the stack for the VM. +/// - `advice_inputs` provides the initial nondeterministic inputs for the VM. /// - `host` specifies the host environment which contain non-deterministic (secret) inputs for the -/// prover -/// - `options` defines parameters for STARK proof generation. +/// prover. +/// - `execution_options` defines VM execution parameters such as cycle limits and fragmentation. +/// - `proving_options` defines parameters for STARK proof generation. /// /// # Errors /// Returns an error if program execution or STARK proof generation fails for any reason. @@ -55,17 +75,50 @@ pub async fn prove( stack_inputs: StackInputs, advice_inputs: AdviceInputs, host: &mut impl Host, - options: ProvingOptions, + execution_options: ExecutionOptions, + proving_options: ProvingOptions, ) -> Result<(StackOutputs, ExecutionProof), ExecutionError> { // execute the program to create an execution trace using FastProcessor - let processor = - FastProcessor::new_with_options(stack_inputs, advice_inputs, *options.execution_options()); + let processor = FastProcessor::new_with_options(stack_inputs, advice_inputs, execution_options); - let (execution_output, trace_generation_context) = - processor.execute_for_trace(program, host).await?; + let trace_inputs = processor.execute_trace_inputs(program, host).await?; + prove_from_trace_sync(TraceProvingInputs::new(trace_inputs, proving_options)) +} - let trace = build_trace(execution_output, trace_generation_context, program.to_info())?; +/// Synchronous wrapper for [`prove()`]. +#[instrument("prove_program_sync", skip_all)] +pub fn prove_sync( + program: &Program, + stack_inputs: StackInputs, + advice_inputs: AdviceInputs, + host: &mut impl SyncHost, + execution_options: ExecutionOptions, + proving_options: ProvingOptions, +) -> Result<(StackOutputs, ExecutionProof), ExecutionError> { + let processor = FastProcessor::new_with_options(stack_inputs, advice_inputs, execution_options); + + let trace_inputs = processor.execute_trace_inputs_sync(program, host)?; + prove_from_trace_sync(TraceProvingInputs::new(trace_inputs, proving_options)) +} + +/// Builds an execution trace from pre-executed trace inputs and proves it synchronously. +/// +/// This is useful when program execution has already happened elsewhere and only trace building +/// plus proof generation remain. The execution settings are already reflected in the supplied +/// `TraceBuildInputs`, so only proof-generation options remain in this API. +#[instrument("prove_trace_sync", skip_all)] +pub fn prove_from_trace_sync( + inputs: TraceProvingInputs, +) -> Result<(StackOutputs, ExecutionProof), ExecutionError> { + let (trace_inputs, options) = inputs.into_parts(); + let trace = build_trace(trace_inputs)?; + prove_execution_trace(trace, options) +} +fn prove_execution_trace( + trace: ExecutionTrace, + options: ProvingOptions, +) -> Result<(StackOutputs, ExecutionProof), ExecutionError> { tracing::event!( tracing::Level::INFO, "Generated execution trace of {} columns and {} steps (padded from {})", @@ -78,20 +131,15 @@ pub async fn prove( let precompile_requests = trace.precompile_requests().to_vec(); let hash_fn = options.hash_fn(); - // Convert trace to row-major format let trace_matrix = { let _span = tracing::info_span!("to_row_major_matrix").entered(); trace.to_row_major_matrix() }; - // Build public inputs and extract fixed/variable-length components let (public_values, kernel_felts) = trace.public_inputs().to_air_inputs(); let var_len_public_inputs: &[&[Felt]] = &[&kernel_felts]; - - // Get aux trace builders let aux_builder = trace.aux_trace_builders(); - // Generate STARK proof using lifted prover let params = config::pcs_params(); let proof_bytes = match hash_fn { HashFunction::Blake3_256 => { @@ -120,42 +168,6 @@ pub async fn prove( Ok((stack_outputs, proof)) } - -/// Synchronous wrapper for the async `prove()` function. -/// -/// This method is only available on non-wasm32 targets. On wasm32, use the -/// async `prove()` method directly since wasm32 runs in the browser's event loop. -/// -/// # Panics -/// Panics if called from within an existing Tokio runtime. Use the async `prove()` -/// method instead in async contexts. -#[cfg(not(target_family = "wasm"))] -#[instrument("prove_program_sync", skip_all)] -pub fn prove_sync( - program: &Program, - stack_inputs: StackInputs, - advice_inputs: AdviceInputs, - host: &mut impl Host, - options: ProvingOptions, -) -> Result<(StackOutputs, ExecutionProof), ExecutionError> { - match tokio::runtime::Handle::try_current() { - Ok(_handle) => { - // We're already inside a Tokio runtime - this is not supported - // because we cannot safely create a nested runtime or move the - // non-Send host reference to another thread - panic!( - "Cannot call prove_sync from within a Tokio runtime. \ - Use the async prove() method instead." - ) - }, - Err(_) => { - // No runtime exists - create one and use it - let rt = tokio::runtime::Builder::new_current_thread().build().unwrap(); - rt.block_on(prove(program, stack_inputs, advice_inputs, host, options)) - }, - } -} - // STARK PROOF GENERATION // ================================================================================================ @@ -177,13 +189,9 @@ where let log_trace_height = trace.height().ilog2() as u8; let mut challenger = config.challenger(); + config::observe_protocol_params(&mut challenger, log_trace_height as u64); challenger.observe_slice(public_values); - // TODO: observe log_trace_height in the transcript for Fiat-Shamir binding. - // TODO: observe var_len_public_inputs in the transcript for Fiat-Shamir binding. - // This also requires updating the recursive verifier to absorb both fixed and - // variable-length public inputs. - // TODO: observe ACE commitment once ACE verification is integrated. - // See https://github.com/0xMiden/miden-vm/issues/2822 + config::observe_var_len_public_inputs(&mut challenger, var_len_public_inputs, &[WORD_SIZE]); let output: StarkOutput = miden_crypto::stark::prover::prove_single( config, &ProcessorAir, diff --git a/prover/src/proving_options.rs b/prover/src/proving_options.rs index ba77c82e76..fd345f6252 100644 --- a/prover/src/proving_options.rs +++ b/prover/src/proving_options.rs @@ -1,17 +1,15 @@ use miden_core::proof::HashFunction; -use miden_processor::ExecutionOptions; // PROVING OPTIONS // ================================================================================================ /// A set of parameters specifying how Miden VM execution proofs are to be generated. /// -/// This struct combines execution options (VM parameters) with the hash function to use -/// for proof generation. The actual STARK proving parameters (FRI config, security level, etc.) -/// are determined by the hash function and hardcoded in the prover's config module. +/// This struct stores the proof-generation hash function only. The actual STARK proving parameters +/// (FRI config, security level, etc.) are determined by the hash function and hardcoded in the +/// prover's config module. #[derive(Debug, Clone, Eq, PartialEq)] pub struct ProvingOptions { - exec_options: ExecutionOptions, hash_fn: HashFunction, } @@ -24,10 +22,7 @@ impl ProvingOptions { /// The STARK proving parameters (security level, FRI config, etc.) are determined /// by the hash function and hardcoded in the prover's config module. pub fn new(hash_fn: HashFunction) -> Self { - Self { - exec_options: ExecutionOptions::default(), - hash_fn, - } + Self { hash_fn } } /// Creates a new instance of [ProvingOptions] targeting 96-bit security level. @@ -38,27 +33,10 @@ impl ProvingOptions { Self::new(hash_fn) } - /// Sets [ExecutionOptions] for this [ProvingOptions]. - /// - /// This sets the maximum number of cycles a program is allowed to execute as well as - /// the number of cycles the program is expected to execute. - pub fn with_execution_options(mut self, exec_options: ExecutionOptions) -> Self { - self.exec_options = exec_options; - self - } - - // PUBLIC ACCESSORS - // -------------------------------------------------------------------------------------------- - /// Returns the hash function to be used in STARK proof generation. pub const fn hash_fn(&self) -> HashFunction { self.hash_fn } - - /// Returns the execution options specified for this [ProvingOptions] - pub const fn execution_options(&self) -> &ExecutionOptions { - &self.exec_options - } } impl Default for ProvingOptions { diff --git a/prover/tests/async_compat.rs b/prover/tests/async_compat.rs new file mode 100644 index 0000000000..c4fe7de2f5 --- /dev/null +++ b/prover/tests/async_compat.rs @@ -0,0 +1,125 @@ +use std::sync::Arc; + +use miden_assembly::Assembler; +use miden_debug_types::{Location, SourceFile, SourceSpan}; +use miden_processor::{ + BaseHost, DefaultHost, ExecutionOptions, Felt, FutureMaybeSend, Host, ProcessorState, Word, + advice::AdviceMutation, + event::{EventError, EventName}, + mast::MastForest, +}; +use miden_prover::{AdviceInputs, ProvingOptions, StackInputs, prove, prove_sync}; + +struct YieldingAsyncHost { + event_calls: usize, +} + +impl YieldingAsyncHost { + fn new() -> Self { + Self { event_calls: 0 } + } +} + +impl BaseHost for YieldingAsyncHost { + fn get_label_and_source_file( + &self, + _location: &Location, + ) -> (SourceSpan, Option>) { + (SourceSpan::UNKNOWN, None) + } +} + +impl Host for YieldingAsyncHost { + fn get_mast_forest( + &self, + _node_digest: &Word, + ) -> impl FutureMaybeSend>> { + async { None } + } + + fn on_event( + &mut self, + _process: &ProcessorState<'_>, + ) -> impl FutureMaybeSend, EventError>> { + self.event_calls += 1; + async { + tokio::task::yield_now().await; + Ok(Vec::new()) + } + } +} + +fn simple_program() -> miden_processor::Program { + Assembler::default() + .assemble_program( + r#" + begin + repeat.64 + swap dup.1 add + end + end + "#, + ) + .expect("program should compile") +} + +#[tokio::test(flavor = "current_thread")] +async fn prove_async_matches_prove() { + let program = simple_program(); + let stack_inputs = StackInputs::new(&[Felt::new(0), Felt::new(1)]).unwrap(); + let advice_inputs = AdviceInputs::default(); + let execution_options = ExecutionOptions::default(); + let options = ProvingOptions::default(); + + let mut sync_host = DefaultHost::default(); + let (sync_outputs, sync_proof) = prove_sync( + &program, + stack_inputs, + advice_inputs.clone(), + &mut sync_host, + execution_options, + options.clone(), + ) + .unwrap(); + + let mut async_host = DefaultHost::default(); + let (async_outputs, async_proof) = prove( + &program, + stack_inputs, + advice_inputs, + &mut async_host, + execution_options, + options, + ) + .await + .unwrap(); + + assert_eq!(sync_outputs, async_outputs); + assert_eq!(sync_proof.hash_fn(), async_proof.hash_fn()); + assert!(!sync_proof.stark_proof().is_empty()); + assert!(!async_proof.stark_proof().is_empty()); +} + +#[tokio::test(flavor = "current_thread")] +async fn prove_async_supports_async_only_host_events() { + let event_name = EventName::new("test::async::prove"); + let event_id = event_name.to_event_id().as_u64(); + let program = Assembler::default() + .assemble_program(format!("begin push.{event_id} emit drop end")) + .expect("program should compile"); + + let mut host = YieldingAsyncHost::new(); + let (_outputs, proof) = prove( + &program, + StackInputs::default(), + AdviceInputs::default(), + &mut host, + ExecutionOptions::default(), + ProvingOptions::default(), + ) + .await + .expect("async proving should succeed"); + + assert_eq!(host.event_calls, 1); + assert!(!proof.stark_proof().is_empty()); +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml index eef0263e45..9e84f7917c 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "1.90" +channel = "1.94" components = ["rustfmt", "rust-src", "clippy"] targets = ["wasm32-unknown-unknown"] profile = "minimal" diff --git a/scripts/blake3_nonregression.py b/scripts/blake3_nonregression.py new file mode 100644 index 0000000000..d582ce8d95 --- /dev/null +++ b/scripts/blake3_nonregression.py @@ -0,0 +1,523 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +import argparse +import json +import os +import re +import subprocess +import sys +import time +from pathlib import Path +from typing import Any + +BENCHMARK_PATH = "./miden-vm/masm-examples/hashing/blake3_1to1/blake3_1to1.masm" +BENCHMARK_COMMAND = [ + "./target/optimized/miden-vm", + "prove", + BENCHMARK_PATH, + "--release", +] + +ANSI_RE = re.compile(r"\x1B\[[0-?]*[ -/]*[@-~]") +TIMING_RE = re.compile( + r"^(?:(?P(?:[ \u2502]{3})*)(?P[\u251d\u2515]\u2501)\s+)?" + r"(?P.+?)\s+\[\s*(?P[^|]+?)\s*\|" +) +PROGRAM_PROVED_RE = re.compile(r"^Program proved in (?P\d+) ms$") + +KEY_METRICS = [ + ("prove_program_sync", "prove_program_sync"), + ( + "prove_program_sync > execute_trace_inputs_sync", + "execute_trace_inputs_sync", + ), + ("prove_program_sync > prove_trace_sync", "prove_trace_sync"), + ("prove_program_sync > prove_trace_sync > build_trace", "build_trace"), + ( + "prove_program_sync > prove_trace_sync > to_row_major_matrix", + "to_row_major_matrix", + ), + ("prove_program_sync > prove_trace_sync > prove", "prove"), + ( + "prove_program_sync > prove_trace_sync > prove > commit to main traces", + "commit to main traces", + ), + ( + "prove_program_sync > prove_trace_sync > prove > build_aux_trace", + "build_aux_trace", + ), + ( + "prove_program_sync > prove_trace_sync > prove > commit to aux traces", + "commit to aux traces", + ), + ( + "prove_program_sync > prove_trace_sync > prove > evaluate constraints", + "evaluate constraints", + ), + ( + "prove_program_sync > prove_trace_sync > prove > commit to quotient poly chunks", + "commit to quotient poly chunks", + ), + ("prove_program_sync > prove_trace_sync > prove > open", "open"), +] + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Run and compare the blake3 1-to-1 non-regression benchmark." + ) + subparsers = parser.add_subparsers(dest="command", required=True) + + parse_log = subparsers.add_parser("parse-log", help="Parse a prove log into JSON.") + parse_log.add_argument("--log", required=True, type=Path) + parse_log.add_argument("--output", required=True, type=Path) + parse_log.add_argument("--repo-root", type=Path) + parse_log.add_argument("--build-wall-ms", type=float) + parse_log.add_argument("--prove-wall-ms", type=float) + parse_log.add_argument("--rayon-num-threads", type=int) + parse_log.add_argument("--git-ref") + + run = subparsers.add_parser("run", help="Build from clean state and run the benchmark.") + run.add_argument("--repo-root", required=True, type=Path) + run.add_argument("--output-dir", required=True, type=Path) + run.add_argument("--rayon-num-threads", type=int, default=8) + run.add_argument("--git-ref", default="") + + compare = subparsers.add_parser( + "compare", help="Compare two parsed benchmark result JSON files." + ) + compare.add_argument("--baseline", required=True, type=Path) + compare.add_argument("--current", required=True, type=Path) + compare.add_argument("--summary-out", required=True, type=Path) + compare.add_argument("--json-out", required=True, type=Path) + compare.add_argument("--threshold-pct", required=True, type=float) + compare.add_argument("--github-output", type=Path) + + return parser.parse_args() + + +def strip_ansi(text: str) -> str: + return ANSI_RE.sub("", text) + + +def parse_duration_ms(raw: str) -> float: + value = raw.strip() + if value.endswith("ms"): + return float(value[:-2]) + if value.endswith("us"): + return float(value[:-2]) / 1000.0 + if value.endswith("\u00b5s"): + return float(value[:-2]) / 1000.0 + if value.endswith("ns"): + return float(value[:-2]) / 1_000_000.0 + if value.endswith("s"): + return float(value[:-1]) * 1000.0 + raise ValueError(f"Unsupported duration format: {raw}") + + +def run_logged_command( + command: list[str], + *, + cwd: Path, + env: dict[str, str] | None, + log_path: Path, +) -> float: + start = time.perf_counter() + with log_path.open("w", encoding="utf-8") as handle: + handle.write(f"$ {' '.join(command)}\n") + handle.flush() + + process = subprocess.Popen( + command, + cwd=cwd, + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + bufsize=1, + ) + assert process.stdout is not None + + for line in process.stdout: + sys.stdout.write(line) + handle.write(line) + + code = process.wait() + if code != 0: + raise subprocess.CalledProcessError(code, command) + + return (time.perf_counter() - start) * 1000.0 + + +def current_sha(repo_root: Path) -> str: + return subprocess.check_output( + ["git", "rev-parse", "HEAD"], cwd=repo_root, text=True + ).strip() + + +def parse_log_contents(contents: str) -> dict[str, Any]: + timings: list[dict[str, Any]] = [] + first_by_base_path: dict[str, float] = {} + stack: list[str] = [] + path_counts: dict[str, int] = {} + program_proved_ms: float | None = None + + for line_number, raw_line in enumerate(contents.splitlines(), start=1): + line = strip_ansi(raw_line) + + proved_match = PROGRAM_PROVED_RE.match(line) + if proved_match: + program_proved_ms = float(proved_match.group("ms")) + continue + + if not line.startswith("INFO"): + continue + + rest = line[4:] + if rest.startswith(" "): + rest = rest[5:] + else: + rest = rest.lstrip(" ") + + match = TIMING_RE.match(rest) + if not match: + continue + + depth = 0 + if match.group("branch"): + depth = (len(match.group("prefix") or "") // 3) + 1 + + name = match.group("name").strip() + duration_ms = parse_duration_ms(match.group("duration")) + + stack = stack[:depth] + stack.append(name) + base_path = " > ".join(stack) + occurrence = path_counts.get(base_path, 0) + 1 + path_counts[base_path] = occurrence + unique_path = base_path if occurrence == 1 else f"{base_path} [{occurrence}]" + + first_by_base_path.setdefault(base_path, duration_ms) + timings.append( + { + "name": name, + "base_path": base_path, + "path": unique_path, + "depth": depth, + "duration_ms": duration_ms, + "line": line_number, + } + ) + + if program_proved_ms is None and "prove_program_sync" in first_by_base_path: + program_proved_ms = first_by_base_path["prove_program_sync"] + + if program_proved_ms is None: + raise ValueError("Could not find the overall prove time in the benchmark log.") + + key_metrics = { + label: first_by_base_path[path] + for path, label in KEY_METRICS + if path in first_by_base_path + } + + return { + "program_proved_ms": program_proved_ms, + "timings": timings, + "timings_by_base_path": first_by_base_path, + "key_metrics": key_metrics, + } + + +def parse_log_file( + log_path: Path, + *, + repo_root: Path | None, + git_ref: str | None, + build_wall_ms: float | None, + prove_wall_ms: float | None, + rayon_num_threads: int | None, +) -> dict[str, Any]: + parsed = parse_log_contents(log_path.read_text(encoding="utf-8")) + metadata = { + "log_path": str(log_path), + "git_ref": git_ref or "", + "rayon_num_threads": rayon_num_threads, + "build_wall_ms": build_wall_ms, + "prove_wall_ms": prove_wall_ms, + } + if repo_root is not None: + metadata["repo_root"] = str(repo_root) + metadata["git_sha"] = current_sha(repo_root) + return {**metadata, **parsed} + + +def write_json(path: Path, payload: dict[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n", encoding="utf-8") + + +def format_ms(value: float | None) -> str: + if value is None: + return "n/a" + return f"{value:,.2f} ms" + + +def format_delta(value: float) -> str: + sign = "+" if value >= 0 else "" + return f"{sign}{value:,.2f} ms" + + +def format_pct(value: float | None) -> str: + if value is None: + return "n/a" + sign = "+" if value >= 0 else "" + return f"{sign}{value:.2f}%" + + +def percent_delta(current: float | None, baseline: float | None) -> float | None: + if baseline in (None, 0) or current is None: + return None + return ((current - baseline) / baseline) * 100.0 + + +def format_optional_delta(current: float | None, baseline: float | None) -> str: + if current is None or baseline is None: + return "n/a" + return format_delta(current - baseline) + + +def build_stage_rows( + baseline: dict[str, Any], + current: dict[str, Any], +) -> list[dict[str, Any]]: + rows: list[dict[str, Any]] = [] + baseline_metrics = baseline.get("key_metrics", {}) + current_metrics = current.get("key_metrics", {}) + + for _, label in KEY_METRICS: + baseline_ms = baseline_metrics.get(label) + current_ms = current_metrics.get(label) + if baseline_ms is None or current_ms is None: + continue + delta_ms = current_ms - baseline_ms + delta_pct = percent_delta(current_ms, baseline_ms) + rows.append( + { + "stage": label, + "baseline_ms": baseline_ms, + "current_ms": current_ms, + "delta_ms": delta_ms, + "delta_pct": delta_pct, + } + ) + + return rows + + +def compare_results( + baseline: dict[str, Any], + current: dict[str, Any], + threshold_pct: float, +) -> dict[str, Any]: + baseline_total = baseline["program_proved_ms"] + current_total = current["program_proved_ms"] + delta_ms = current_total - baseline_total + delta_pct = percent_delta(current_total, baseline_total) + regression = bool(delta_pct is not None and delta_pct > threshold_pct) + stage_rows = build_stage_rows(baseline, current) + + slowdown_rows = [ + row + for row in stage_rows + if row["delta_pct"] is not None + and row["delta_pct"] > 0 + and row["stage"] != "prove_program_sync" + ] + slowdown_rows.sort(key=lambda row: row["delta_pct"], reverse=True) + + result = { + "status": "regression" if regression else "ok", + "regression": regression, + "threshold_pct": threshold_pct, + "baseline_sha": baseline.get("git_sha", ""), + "current_sha": current.get("git_sha", ""), + "baseline_ref": baseline.get("git_ref", ""), + "current_ref": current.get("git_ref", ""), + "baseline_program_proved_ms": baseline_total, + "current_program_proved_ms": current_total, + "program_delta_ms": delta_ms, + "program_delta_pct": delta_pct, + "baseline_build_wall_ms": baseline.get("build_wall_ms"), + "current_build_wall_ms": current.get("build_wall_ms"), + "baseline_prove_wall_ms": baseline.get("prove_wall_ms"), + "current_prove_wall_ms": current.get("prove_wall_ms"), + "stage_rows": stage_rows, + "top_slowdowns": slowdown_rows[:5], + } + return result + + +def summary_markdown(result: dict[str, Any]) -> str: + status_word = "REGRESSION" if result["regression"] else "OK" + baseline_sha = result["baseline_sha"][:12] or result["baseline_ref"] or "baseline" + current_sha = result["current_sha"][:12] or result["current_ref"] or "current" + stage_rows = result["stage_rows"] + top_slowdowns = result["top_slowdowns"] + + lines = [ + "## Blake3 1-to-1 Non-Regression", + "", + f"Status: **{status_word}**", + f"Threshold: `{result['threshold_pct']:.2f}%`", + f"Baseline: `{baseline_sha}` ({format_ms(result['baseline_program_proved_ms'])})", + f"Current: `{current_sha}` ({format_ms(result['current_program_proved_ms'])})", + f"Overall delta: `{format_delta(result['program_delta_ms'])}` ({format_pct(result['program_delta_pct'])})", + "", + "| Metric | Baseline | Current | Delta | Delta % |", + "| --- | ---: | ---: | ---: | ---: |", + ( + "| build wall | " + f"{format_ms(result['baseline_build_wall_ms'])} | " + f"{format_ms(result['current_build_wall_ms'])} | " + f"{format_optional_delta(result['current_build_wall_ms'], result['baseline_build_wall_ms'])} | " + f"{format_pct(percent_delta(result['current_build_wall_ms'], result['baseline_build_wall_ms']))} |" + ), + ( + "| prove wall | " + f"{format_ms(result['baseline_prove_wall_ms'])} | " + f"{format_ms(result['current_prove_wall_ms'])} | " + f"{format_optional_delta(result['current_prove_wall_ms'], result['baseline_prove_wall_ms'])} | " + f"{format_pct(percent_delta(result['current_prove_wall_ms'], result['baseline_prove_wall_ms']))} |" + ), + ( + "| program proved | " + f"{format_ms(result['baseline_program_proved_ms'])} | " + f"{format_ms(result['current_program_proved_ms'])} | " + f"{format_delta(result['program_delta_ms'])} | " + f"{format_pct(result['program_delta_pct'])} |" + ), + ] + + if stage_rows: + lines.extend( + [ + "", + "| Stage | Baseline | Current | Delta | Delta % |", + "| --- | ---: | ---: | ---: | ---: |", + ] + ) + for row in stage_rows: + lines.append( + "| " + f"{row['stage']} | " + f"{format_ms(row['baseline_ms'])} | " + f"{format_ms(row['current_ms'])} | " + f"{format_delta(row['delta_ms'])} | " + f"{format_pct(row['delta_pct'])} |" + ) + + if top_slowdowns: + lines.extend(["", "Top slowdowns:"]) + for row in top_slowdowns: + lines.append( + "- " + f"`{row['stage']}` moved by {format_delta(row['delta_ms'])} " + f"({format_pct(row['delta_pct'])})." + ) + + return "\n".join(lines) + "\n" + + +def write_github_output(path: Path, result: dict[str, Any]) -> None: + lines = [ + f"status={result['status']}", + f"regression={'true' if result['regression'] else 'false'}", + f"baseline_sha={result['baseline_sha']}", + f"current_sha={result['current_sha']}", + f"program_delta_ms={result['program_delta_ms']:.6f}", + f"program_delta_pct={result['program_delta_pct']:.6f}", + ] + with path.open("a", encoding="utf-8") as handle: + handle.write("\n".join(lines) + "\n") + + +def cmd_parse_log(args: argparse.Namespace) -> int: + payload = parse_log_file( + args.log, + repo_root=args.repo_root, + git_ref=args.git_ref, + build_wall_ms=args.build_wall_ms, + prove_wall_ms=args.prove_wall_ms, + rayon_num_threads=args.rayon_num_threads, + ) + write_json(args.output, payload) + return 0 + + +def cmd_run(args: argparse.Namespace) -> int: + repo_root = args.repo_root.resolve() + output_dir = args.output_dir.resolve() + output_dir.mkdir(parents=True, exist_ok=True) + + build_log = output_dir / "build.log" + prove_log = output_dir / "prove.log" + result_json = output_dir / "result.json" + + run_logged_command(["cargo", "clean"], cwd=repo_root, env=os.environ.copy(), log_path=output_dir / "clean.log") + build_wall_ms = run_logged_command( + ["make", "exec-info"], + cwd=repo_root, + env=os.environ.copy(), + log_path=build_log, + ) + + prove_env = os.environ.copy() + prove_env["MIDEN_LOG"] = "info" + prove_env["RAYON_NUM_THREADS"] = str(args.rayon_num_threads) + prove_wall_ms = run_logged_command( + BENCHMARK_COMMAND, + cwd=repo_root, + env=prove_env, + log_path=prove_log, + ) + + payload = parse_log_file( + prove_log, + repo_root=repo_root, + git_ref=args.git_ref, + build_wall_ms=build_wall_ms, + prove_wall_ms=prove_wall_ms, + rayon_num_threads=args.rayon_num_threads, + ) + write_json(result_json, payload) + return 0 + + +def cmd_compare(args: argparse.Namespace) -> int: + baseline = json.loads(args.baseline.read_text(encoding="utf-8")) + current = json.loads(args.current.read_text(encoding="utf-8")) + result = compare_results(baseline, current, args.threshold_pct) + write_json(args.json_out, result) + args.summary_out.parent.mkdir(parents=True, exist_ok=True) + args.summary_out.write_text(summary_markdown(result), encoding="utf-8") + if args.github_output is not None: + write_github_output(args.github_output, result) + return 0 + + +def main() -> int: + args = parse_args() + if args.command == "parse-log": + return cmd_parse_log(args) + if args.command == "run": + return cmd_run(args) + if args.command == "compare": + return cmd_compare(args) + raise ValueError(f"Unhandled command: {args.command}") + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/publish-release.sh b/scripts/publish-release.sh deleted file mode 100755 index 8e6f6d8b97..0000000000 --- a/scripts/publish-release.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -# Deprecated: please use the Github actions workflow, -# This is meant to be used in a break-the-glass situation -# -# Expects -# 1. to be run from the root of the repository -# 2. for ~/.cargo/credentials.toml to contain your crates.io token (see -# https://doc.rust-lang.org/cargo/reference/publishing.html) -# -# It is recommended to run this script while still on the `next` branch right before merging it into -# `main`, so that if any error occurs, we can fix it and re-run the script directly without having -# to merge the fix into `next`, and then merge `next` into `main` again. - -cargo publish -p miden-utils-sync -cargo publish -p miden-utils-diagnostics -cargo publish -p miden-utils-indexing -cargo publish -p miden-debug-types -cargo publish -p miden-utils-core-derive -cargo publish -p miden-core -cargo publish -p miden-air -cargo publish -p miden-assembly-syntax -cargo publish -p miden-mast-package -cargo publish -p miden-assembly -cargo publish -p miden-processor -cargo publish -p miden-prover -cargo publish -p miden-verifier -cargo publish -p miden-core-lib -cargo publish -p miden-vm diff --git a/verifier/src/lib.rs b/verifier/src/lib.rs index 11a13544e7..4f00232087 100644 --- a/verifier/src/lib.rs +++ b/verifier/src/lib.rs @@ -9,7 +9,7 @@ use alloc::{boxed::Box, vec::Vec}; use miden_air::{ProcessorAir, PublicInputs, config}; use miden_core::{ - Felt, + Felt, WORD_SIZE, field::{QuadFelt, TwoAdicField}, }; use miden_crypto::stark::{ @@ -223,13 +223,9 @@ where } let mut challenger = config.challenger(); + config::observe_protocol_params(&mut challenger, log_trace_height as u64); challenger.observe_slice(public_values); - // TODO: observe log_trace_height in the transcript for Fiat-Shamir binding. - // TODO: observe var_len_public_inputs in the transcript for Fiat-Shamir binding. - // This also requires updating the recursive verifier to absorb both fixed and - // variable-length public inputs. - // TODO: observe ACE commitment once ACE verification is integrated. - // See https://github.com/0xMiden/miden-vm/issues/2822 + config::observe_var_len_public_inputs(&mut challenger, var_len_public_inputs, &[WORD_SIZE]); miden_crypto::stark::verifier::verify_single( config, &ProcessorAir, diff --git a/zizmor.yml b/zizmor.yml new file mode 100644 index 0000000000..0648316e1d --- /dev/null +++ b/zizmor.yml @@ -0,0 +1,8 @@ +rules: + dangerous-triggers: + ignore: + - contribution-quality.yml + - signed-commits.yml + secrets-outside-env: + ignore: + - trigger-deploy-docs.yml